The problem is with the DMA. The maximum Transfer Count for both PSoC 3 and PSoC 5 is (4K - 1) bytes. For 2,000 uint16's you are transferring 4,000 bytes. That works just fine. This parameter is just put into the TD memory in a 12-bit field, so if you provide a number greater than that you are just going to get the lower 12-bits and therefore strange results.
The solution to this is pretty simple. You'll need to create multiple TDs and configure them in a chain where each will transfer an amount that is within the (4K - 1) limit.