This post is a bit of a flame, but seriously, JTAG has got to go. The signals are weak. The various drivers and controllers for it are weak. It causes nonstop headaches for hardware developers and FPGA developers alike. It's slow, hardly customizable, hard to use, ultra extremely fantastically flaky on every piece of FPGA hardware I've ever used (which includes at least a dozen vendors), and ancient technology.
Here is what I want:
- Support for a lot of chips, say 2048 of them. JTAG supposedly supports 16 chips. Yeah, right. The 5MHz clock signal dies out after three or four. The 200KHz signal dies after eight or nine. This will require some strong signals with error correction, but, heck, if a basic ethernet layer can do it....
- Endpoint enabling. The JTAG methods for specifying an endpoint are both flaky and redundant. We need some nice protocols, maybe even packets with headers, etc.
- Speed. It needs to be as fast as my USB2 cable at a bare minimum. And put some standard, accessible plugs on there while you're at it.
- Standard driver interface. Need I say more? How many of you write directly to the parallel port? All of you? Uh huh, I knew it. I'm sure you all enjoy it too. How about something like this:
mycard = code to locate the right driver and device and open it.... ioctl(mycard, HOW_MANY_DEVICES, &devices) id_struct = new ID_STRUCT[devices] ioctl(mycard, IDENTIFY_DEVICES, &id_struct) for each d in devices { if( id_struct[d].devId == Virtex4Id ) { targetlist = { d } ioctl(mycard, SET_TARGET_DEVICES, &targetlist) command_struct.mode = programming ioctl(mycard, SEND_COMMAND, &command_struct) write(mycard, "c:\my programming file.bit") ioctl(mycard, READ_STATUS, &status_struct) if( status_struct.mode & programmed) break else return failed } } Then we go into a loop for reading and writing debug data, etc.
We could have drivers for a dozen different interfaces including Firewire, parallel port (urrrg), serial port (double urrrg), etc.
Yo Xilinx, let's remove the great mystery from Impact. Let's open the hat on the "platform" driver and make the thing useful for the parallel port as well.
Maybe I'm taking this too far. I just want something that works reliably and is not a pain in the ars to use programmatically. Is that too much to ask?