级联的仿真验证:
关于延迟线的延迟量设置,
使用TIME模式时,DELAY_VALUE参数设置为一致,FIXED模式每级设置相同延时,VAR_LOAD和VARIABLE模式的DELAY_VALUE设置为一致,但是后续的CE/INC和LOAD等修改延迟抽头的操作可以不同,但是如不需要如此精细化的操作,将每一级同步设置相同值即可,减少逻辑复杂度;
使用COUNT模式,设置都可以不同,但推荐每一级同步设置;
IDELAYE3的级联:
先进行TIME模式下延时类型为FIXED的2级、3级、4级的级联仿真:
TIME模式2级:
代码:
module top_ultraplus_idelay_cascade(
input wire clk_ref_300m,
input wire clk,
input wire rst,
input wire load_trg,
input wire datain,
output wire dout
);
wire idelayctrl_rdy;
wire casc_out_1;
wire [8:0] cntvalueout_1;
wire dout_1;
wire casc_in_1;
wire casc_return_1;
wire casc_out_2;
wire [8:0] cntvalueout_2;
wire dout_2;
wire casc_in_2;
wire casc_return_2;
// cascade link
assign dout = dout_1;
assign casc_in_2 = casc_out_1;
assign casc_return_1 = dout_2;
IDELAYCTRL #(
.SIM_DEVICE(“ULTRASCALE”) // Must be set to “ULTRASCALE”
)
IDELAYCTRL_inst (
.RDY(idelayctrl_rdy), // 1-bit output: Ready output
.REFCLK(clk_ref_300m), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input. Asynchronous assert, synchronous deassert to
// REFCLK.
);
IDELAYE3 #(
.CASCADE(“MASTER”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // Units of the DELAY_VALUE (COUNT, TIME)
.DELAY_SRC(“DATAIN”), // Delay input (DATAIN, IDATAIN)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Input delay value setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE,ULTRASCALE_PLUS)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
) IDELAYE3_inst_1 (
.CASC_OUT(casc_out_1), // 1-bit output: Cascade delay output to ODELAY input cascade
.CNTVALUEOUT(cntvalueout_1), // 9-bit output: Counter value output
.DATAOUT(dout_1), // 1-bit output: Delayed data output
.CASC_IN(casc_in_1), // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
.CASC_RETURN(casc_return_1), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.DATAIN(datain), // 1-bit input: Data input from the logic
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.IDATAIN(), // 1-bit input: Data input from the IOBUF
.INC(0), // 1-bit input: Increment / Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
ODELAYE3 #(
.CASCADE(“SLAVE_END”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // (COUNT, TIME)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Output delay tap setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0).
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
)
ODELAYE3_inst_2 (
.CASC_OUT(casc_out_2), // 1-bit output: Cascade delay output to IDELAY input cascade
.CNTVALUEOUT(cntvalueout_2), // 9-bit output: Counter value output
.DATAOUT(dout_2), // 1-bit output: Delayed data from ODATAIN input port
.CASC_IN(casc_in_2), // 1-bit input: Cascade delay input from slave IDELAY CASCADE_OUT
.CASC_RETURN(casc_return_2), // 1-bit input: Cascade delay returning from slave IDELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.INC(0), // 1-bit input: Increment/Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.ODATAIN(), // 1-bit input: Data input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
endmodule
代码中第1级为IDELAYE3,CASCADE设置为MATER,第2级为ODELAYE3,CASCADE设置为SLAVE_END;
可以看到总延时1.933ns,设置的两级级联,每级为1000ps,不过仿真中idelaye3没有仿真体现出align_delay的延时;
第1级输入datain到第2级输入casc_in_2的输入延时为45ps;
第2级的输入casc_in_2到输出dout_2的延时为0.944ns;
第2级的输出dout_2到第一级的输出dout的延时为0.944ns;
TIME模式3级:
3级延时在2级基础上,添加一个IDELAYE3作为第3级,其中CASCADE设置为,第1级MASTER,第2级SLAVE_MIDDLE,第3级SLAVE_END;
添加代码如图:
仿真结果:
延时2.922ns,其中datain到casc_in_3延时90ps,每级延时0.944ns;
TIME模式4级:
4级延时在3级基础上,添加一个ODELAYE3作为第4级,其中CASCADE设置为,第1级MASTER,第2级SLAVE_MIDDLE,第3级SLAVE_ MIDDLE,第3级SLAVE_END;
代码修改:
仿真结果:
延时3.911ns,其中datain到casc_in_4延时135ps,每级延时0.944ns;
ODELAYE3的级联:
ODELAY级联就是把之前IDELAYE3的每级的IDELAYE3换成ODELAYE3,ODELAYE3换成IDELAYE3,这里简单看下TIME模式下FIXED延时4级ODELAYE3的仿真:
代码:
其中第1、3级为ODELAY,2、4级为IDELAY;
module top_ultraplus_odelay_cascade(
input wire clk_ref_300m,
input wire clk,
input wire rst,
input wire load_trg,
input wire datain,
output wire dout
);
wire idelayctrl_rdy;
wire casc_out_1;
wire [8:0] cntvalueout_1;
wire dout_1;
wire casc_in_1;
wire casc_return_1;
wire casc_out_2;
wire [8:0] cntvalueout_2;
wire dout_2;
wire casc_in_2;
wire casc_return_2;
wire casc_out_3;
wire [8:0] cntvalueout_3;
wire dout_3;
wire casc_in_3;
wire casc_return_3;
wire casc_out_4;
wire [8:0] cntvalueout_4;
wire dout_4;
wire casc_in_4;
wire casc_return_4;
// cascade link
assign dout = dout_1;
assign casc_in_2 = casc_out_1;
assign casc_return_1 = dout_2;
assign casc_in_3 = casc_out_2;
assign casc_return_2 = dout_3;
assign casc_in_4 = casc_out_3;
assign casc_return_3 = dout_4;
IDELAYCTRL #(
.SIM_DEVICE(“ULTRASCALE”) // Must be set to “ULTRASCALE”
)
IDELAYCTRL_inst (
.RDY(idelayctrl_rdy), // 1-bit output: Ready output
.REFCLK(clk_ref_300m), // 1-bit input: Reference clock input
.RST(rst) // 1-bit input: Active high reset input. Asynchronous assert, synchronous deassert to
// REFCLK.
);
ODELAYE3 #(
.CASCADE(“MASTER”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // (COUNT, TIME)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Output delay tap setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0).
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
)
ODELAYE3_inst_1 (
.CASC_OUT(casc_out_1), // 1-bit output: Cascade delay output to IDELAY input cascade
.CNTVALUEOUT(cntvalueout_1), // 9-bit output: Counter value output
.DATAOUT(dout_1), // 1-bit output: Delayed data from ODATAIN input port
.CASC_IN(casc_in_1), // 1-bit input: Cascade delay input from slave IDELAY CASCADE_OUT
.CASC_RETURN(casc_return_1), // 1-bit input: Cascade delay returning from slave IDELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.INC(0), // 1-bit input: Increment/Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.ODATAIN(datain), // 1-bit input: Data input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
IDELAYE3 #(
.CASCADE(“SLAVE_MIDDLE”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // Units of the DELAY_VALUE (COUNT, TIME)
.DELAY_SRC(“DATAIN”), // Delay input (DATAIN, IDATAIN)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Input delay value setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE,ULTRASCALE_PLUS)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
) IDELAYE3_inst_2 (
.CASC_OUT(casc_out_2), // 1-bit output: Cascade delay output to ODELAY input cascade
.CNTVALUEOUT(cntvalueout_2), // 9-bit output: Counter value output
.DATAOUT(dout_2), // 1-bit output: Delayed data output
.CASC_IN(casc_in_2), // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
.CASC_RETURN(casc_return_2), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.DATAIN(), // 1-bit input: Data input from the logic
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.IDATAIN(), // 1-bit input: Data input from the IOBUF
.INC(0), // 1-bit input: Increment / Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
ODELAYE3 #(
.CASCADE(“SLAVE_MIDDLE”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // (COUNT, TIME)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Output delay tap setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0).
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
)
ODELAYE3_inst_3 (
.CASC_OUT(casc_out_3), // 1-bit output: Cascade delay output to IDELAY input cascade
.CNTVALUEOUT(cntvalueout_3), // 9-bit output: Counter value output
.DATAOUT(dout_3), // 1-bit output: Delayed data from ODATAIN input port
.CASC_IN(casc_in_3), // 1-bit input: Cascade delay input from slave IDELAY CASCADE_OUT
.CASC_RETURN(casc_return_3), // 1-bit input: Cascade delay returning from slave IDELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.INC(0), // 1-bit input: Increment/Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.ODATAIN(), // 1-bit input: Data input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
IDELAYE3 #(
.CASCADE(“SLAVE_END”), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE)
.DELAY_FORMAT(“TIME”), // Units of the DELAY_VALUE (COUNT, TIME)
.DELAY_SRC(“DATAIN”), // Delay input (DATAIN, IDATAIN)
.DELAY_TYPE(“FIXED”), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
.DELAY_VALUE(1000), // Input delay value setting
.IS_CLK_INVERTED(1’b0), // Optional inversion for CLK
.IS_RST_INVERTED(1’b0), // Optional inversion for RST
.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)
.SIM_DEVICE(“ULTRASCALE_PLUS”), // Set the device version (ULTRASCALE,ULTRASCALE_PLUS)
.UPDATE_MODE(“ASYNC”) // Determines when updates to the delay will take effect (ASYNC, MANUAL, SYNC)
) IDELAYE3_inst_4 (
.CASC_OUT(casc_out_4), // 1-bit output: Cascade delay output to ODELAY input cascade
.CNTVALUEOUT(cntvalueout_4), // 9-bit output: Counter value output
.DATAOUT(dout_4), // 1-bit output: Delayed data output
.CASC_IN(casc_in_4), // 1-bit input: Cascade delay input from slave ODELAY CASCADE_OUT
.CASC_RETURN(casc_return_4), // 1-bit input: Cascade delay returning from slave ODELAY DATAOUT
.CE(0), // 1-bit input: Active high enable increment/decrement input
.CLK(clk), // 1-bit input: Clock input
.CNTVALUEIN(0), // 9-bit input: Counter value input
.DATAIN(), // 1-bit input: Data input from the logic
.EN_VTC(1), // 1-bit input: Keep delay constant over VT
.IDATAIN(), // 1-bit input: Data input from the IOBUF
.INC(0), // 1-bit input: Increment / Decrement tap delay input
.LOAD(0), // 1-bit input: Load DELAY_VALUE input
.RST(rst) // 1-bit input: Asynchronous Reset to the DELAY_VALUE
);
endmodule
可以看到仿真结果与IDELAYE3的4级级联延时效果基本一致;
综合看下布局布线结果:
在综合时,级联代码中不使用casc_in或是casc_out或是casc_return等管脚,未使用的不要连接,保持悬空,不然就会报以下错误,而且其级联之间的高速连线也不要去用ila抓,否则也会布局布线失败报错;
综合一个IDELAYE3的4级级联,TIME模式FIXED延时,可以看到布线结果如下图:
下图中白色线就是其cascade级联线,可以看到上下两块就是相邻的两个RXTX_BITSLICE,
可以看到每个RXTX_BITSLICE里面有IDELAY、ODELAY、ISERDES、OSERDES等组件原语存在;
且这个4级级联使用的2个idelay和2个odelay,它们处在的RXTX_BITSLICE是相邻的,处在X0Y408、X0Y409,
且第1级的IDELAY和第2级的ODELAY处在X0Y409的一个BITSLICE中,第3级的IDELAY和第4级的ODELAY处在X0Y408的一个BITSLICE中;
综合一个2级级联:
使用同一个RXTX_BITSLICE的输入输出延迟;
3级级联:
使用相邻两个RXTX_BITSLICE的输入输出延迟;
当然也可以使用约束指定其位置;
本文章由威三学社出品
对文章感兴趣可以私信联系