どうも最後でPlace & Routeで配線できないと言われてエラーになってしまう。
こんな感じ。
ERROR:Route:472 -
This design is unrouteable.
To evaluate the problem please use fpga_editor.
Routing Conflict 1:
Net:GLOBAL_LOGIC0 on pin SR on location OLOGIC_X0Y111
Net:SYS_RST_IBUF_1 on pin SR on location ILOGIC_X0Y111
Conflict detected on wire: PINFEED(-63835,80448)
Routing Conflict 2:
Net:GLOBAL_LOGIC0 on pin SR on location OLOGIC_X0Y113
Net:SYS_RST_IBUF_1 on pin SR on location ILOGIC_X0Y113
Conflict detected on wire: PINFEED(-63835,84320)
どうやらSR(リセット)ピンがOSERDESとISERDESで違っているのがだめなのか?
DQS付近の入出力用ソースはこの辺。
// Instantiate DQS DDR registers
generate
genvar n;
for (n=DDR2_DQS_DM_WIDTH-1; n>=0; n=n-1) begin: WRDATA_DQS
OSERDES # (
.DATA_RATE_OQ("DDR"),
.DATA_RATE_TQ("DDR"),
.DATA_WIDTH(4),
.INIT_OQ(1'b0),
.INIT_TQ(1'b1),
.SERDES_MODE("MASTER"),
.SRVAL_OQ(1'b0),
.SRVAL_TQ(1'b1),
.TRISTATE_WIDTH(4)
) WRDATA_DDR2_OUT (
.OQ(dqs_oq[n]),
.SHIFTOUT1(),
.SHIFTOUT2(),
.TQ(dqs_tq[n]),
.CLK(clk),
.CLKDIV(clk100MHz),
.D1(dqs_oserdes_d_1d[n*4]),
.D2(dqs_oserdes_d_1d[n*4+1]),
.D3(dqs_oserdes_d_1d[n*4+2]),
.D4(dqs_oserdes_d_1d[n*4+3]),
.D5(),
.D6(),
.OCE(1'b1),
.REV(1'b0),
.SHIFTIN1(1'b0),
.SHIFTIN2(1'b0),
// .SR(dqs_reset_3d[n]),
.SR(1'b0),
.T1(dqs_oserdes_t_1d[n*4]),
.T2(dqs_oserdes_t_1d[n*4+1]),
.T3(dqs_oserdes_t_1d[n*4+2]),
.T4(dqs_oserdes_t_1d[n*4+3]),
.TCE(1'b1)
);
ISERDES #(
.BITSLIP_ENABLE("TRUE"),
.DATA_RATE("DDR"),
.DATA_WIDTH(4),
.INTERFACE_TYPE("NETWORKING"),
.IOBDELAY("IFD"),
.IOBDELAY_TYPE("FIXED"),
.IOBDELAY_VALUE(32),
.NUM_CE(1),
.SERDES_MODE("MASTER")
) DQS_DDR2_IN (
.O(ddr2_dqsin_out[n]),
.Q1(),
.Q2(),
.Q3(),
.Q4(),
.Q5(),
.Q6(),
.SHIFTOUT1(),
.SHIFTOUT2(),
.BITSLIP(1'b0),
.CE1(1'b1),
.CE2(1'b1),
.CLK(1'b0),
.CLKDIV(1'b0),
.D(ddr2_dqsin[n]),
.DLYCE(1'b0),
.DLYINC(1'b0),
.DLYRST(1'b0),
.OCLK(1'b0),
.REV(1'b0),
.SHIFTIN1(1'b0),
.SHIFTIN2(1'b0),
.SR(reset)
);
BUFIO DQS_DDR2_IN_BUFIO (
.I(ddr2_dqsin_out[n]),
.O(ddr2_dqsin_bufio[n])
);
IOBUF DDD2_DQS_BUF (
.O(ddr2_dqsin[n]),
.IO(ddr2_dqs[n]),
.I(dqs_oq[n]),
.T(dqs_tq[n])
);
end
endgenerate
.SR(1'b0) と .SR(reset) の違いがある。これをどちらも .SR(reset) にしてみた。
そうするとやはり、このコンフリクトはなくなったが、まだ後、18個のコンフリクトを解消する必要がある。
次は、下のコンフリクト。
Routing Conflict 1:
Net:ddr2_sdram_cont_inst/clk90 on pin CLK on location OLOGIC_X0Y97
Net:clk on pin OCLK on location ILOGIC_X0Y97
Conflict detected on wire: BOUNCEIN(-63349,57088)
これはDQのclk90 と clk がコンフリクトしているようだ。DQのISERDESのOCLK と CLKDIV は clkネットがつながっていて、OSERDESのCLKには clk270 がつながっていた。どうやら、これらのピンは同じクロックがつながっている必要がありようだ。
事実、XAPP721 ISERDES と OSERDES を使用した高性能DDR2 SDRAM インターフェイスを見ても、ISERDESのOCLK と CLKDIV、OSERDESのCLKには同じ CLKfast_90 がつながっている。やはり、配線がこれしかないのだろう。
これで、Place & Route は通ったが、タイミング制約が満足していない。クロックを変更してしまったので、タイミングダイアグラムをもう一度考察する必要が出てきてしまったし。。。
今日の教訓、OSERDES, ISERDESの決まりごと
1.OSERDESとISERDESのSRには同じリセット信号をつなぐ。
2.ISERDESのOCLK と CLKDIV、OSERDESのCLKには同じクロックを入力する。
注:コンフリクトの方がclk90 なのに、なぜclk270 の話になるのかというと、グローバルバッファを削減するためにclk270 は ~clk90として定義してあるからです。
assign clk270 = ~clk90;