I have wired up the components of my 10 Gigabit FPGA Accelerated Network card with great care, and I decided to have my “tester” application skip the lwIP stack and to pass the received packet directly to the host for testing/verification purposes.
Everything was checking out fine, the LabVIEW code looked flawless, the interface to the 10 Gigabit Transceiver was perfect. All looked fine, but for some reason I was not receiving the packets on the host.
I analyzed the code, inserted probes and what not. And finally, I was reading through the actual C++ code (MicroBlaze C++ that is) I found the bug.
A very simple bug hidden in plain sight!
// Now echo the data back out
if (XLlFifo_iTxVacancy(fifo_1)) {
XGpio_DiscreteWrite(&gpio_2, 2, 0xF001);
for ( i = 0; i < recv_len_bytes; i++) {
XGpio_DiscreteWrite(&gpio_2, 2, buffer[i]);
XLlFifo_Write(fifo_1, buffer, recv_len_bytes);
}
XLlFifo_iTxSetLen(fifo_1, recv_len_bytes);
}
Do you see the error? Well, neither did I, until I read the documentation for XLlFifo_Write again, for the umteenth time… I was writing the data of the packet to the buffer (length of packet) squared times! Why? Because the single call to XLlFifo_Write is writing the entire packet on each call.
Anyway, I am now re-synthesizing my code and we will see what happens when I run it in around 2 hours time.
Also, I added the TKEEP signal to my AXI Stream FIFO, and it worked exactly as expected, meaning that:
- If I send 12 bytes from the LabVIEW FPGA FIFO in to the MicroBlaze, it detects 12 bytes
- If I send 13 bytes, with the TKEEP signal being 0b0001 for the last word only, and 0xF for the rest, I get 13 bytes in the MicroBlaze code.
- If I send 14 bytes… and so on and so forth, MicroBlaze recognized only that many bytes.
However, everything was aligned to 32 bit words.
Maybe I will work on cleaning up and pushing some of my code to github while I wait…