Stratix 10 LVDS SERDES fitter error 14566
I'm trying to compile a design with 2 Tx LVDS SERDES that both cover multiple banks. I'm compiling for the 1SX210HN3F43I3VG (Quartus project archive attached).
For the first SERDES I have the pins assigned to banks 3J, 3K and 3L, with the reference clock for the PLL assigned to a CLK pin on bank 3K. For the other SERDES I have the pins assigned to banks 3B, 3C and 3D, with the reference clock for the PLL assigned to a CLK pin on bank 3C.
From the documentation, the PLL should be able to drive the Tx SERDES in the adjacent banks. (https://www.intel.com/content/www/us/en/docs/programmable/683792/22-1-20-0-1/plls-driving-differenti...)
But I get the following errors during fit (same error for both channels):
Error(14566): The Fitter cannot place 2 periphery component(s) due to conflicts with existing constraints (2 LVDS_CHANNEL(s)). Fix the errors described in the submessages, and then rerun the Fitter. The Intel FPGA Knowledge Database may also contain articles with information on how to resolve this periphery placement failure. Review the errors and then visit the Knowledge Database at https://www.altera.com/support/support-resources/knowledge-base/search.html and search for this specific error message number.
If I remove all my pin assignments, the compiler picks pins on the same banks and it has no errors, but when I specify the exact pins I want on those banks that are better for board layout, then it doesn't work. Is there restrictions to which pins on adjacent bank the PLL can drive the SERDES?
I had a previous iteration of the design compile with the pinout I would like to use, but it was on an older version of Quartus (21.2 I believe it was). That design's IP was setup with an external PLL block at that point, so maybe I've configured something incorrectly in the latest design, but I can't seem to figure out what that could be.
I manage to get it to compile with the pinout I would like. Here's what I had to do:
I have a SERDES IP with 52 Tx channels. For the 3A/3B/3C setup (PLL reference on 3B) I originally had them split like so:
- 3A: tx_data[0..15]
- 3B: tx_data[16..38]
- 3C: tx_data[39..51]
When I re-arrange the data map to the SERDES IP to this:
- 3A: tx_data[23..38]
- 3B: tx_data[0..22]
- 3C: tx_data[39..51]
Then it compiles with no errors. (I also re-arranged the input data to the IP in the same way so that it is functionally equivalent.)
So it looks like the fitter doesn't like it when the channels that are on the same bank as the PLL aren't the first one mapped to SERDES IP block. Seems like a bug to me, so a fix would be nice, but a note in the documentation would probably do the trick.