一、input delay约束
在千兆以太网数据收发项目中,RGMII的数据输入方式为DDR,源同步输入方式,可以用之前提到的分析模型进行约束。
在时序约束原理中我们提到,input delay约束的就是发射沿lunch到数据有效的延时,根据时序图得到:
LrMax = Tco max + Td_bd max -(Tc_d + Tc_bd) ------分析建立时间时序
LrMin = Tco min + Td_bd min -(Tc_d + Tc_bd) ------分析保持时间时序
一般在input delay分析中,我们默认Td_bd ==Tc_bd,并不考虑Tc_d。因此LrMax和LrMin就指的是上游器件输出数据和输出时钟的延时。
PHY芯片datasheet中时序图如下,图中的TskewR==2ns是时钟信号相对于数据信号的延时。数据线之间的SKEW未知,我们假设为0.2ns。
可以得到:
LrMax = 2 + skew/2 = 2.1
LrMin = 2 - skew/2 = 1.9
接下来就可以在工具中进行约束。首先,打开Open Implementation----->Edit Timing constraints。
然后选择Set Input delay,点击加号“+”添加约束信息。
设置参数。
Clock:时钟,选择rx_clk。
Objects:约束目标,选择RGMII输入信号。
Delay value:延时时间。
Delay value is relative to clock edge:边沿选择。
Delay value specifies:最大最小选择。
Delay value is relative to clock edge选择rise,Delay value specifies选择max,在Delay value处设置上升沿的最大、最小延时;Delay value is relative to clock edge选择full,Delay value specifies选择max,在Delay value处设置上升沿的最大延时;Delay value is relative to clock edge选择rise,Delay value specifies选择min,在Delay value处设置上升沿的最小延时。下降沿的延时最大、最小延时设置同理。
这样就完成了input delay的约束,点击保存,可以看到input delay约束信息已经更新到了.xdc文件中。
重新综合、布局布线,点击Report Timing。
设置要打印的时序报告的参数。设置要打印的信号。
在option 中的设置观察时序路径条数和每个路径打印多少条信息, 点击 OK 。
这样就生成了时序报告。可以看到建立时间和保持时间没有发生时序违例。
二、indelay control方式input delay约束
以上的input delay约束方式是通过PLL调整时钟相位以达到时序要求,indelay control方式是通过对数据进行延时以满足时序要求。
通过IDELAY2源语实现这个功能,例化该源语在ODDR模块中,模块输入数据信号tx_dat[7:0]和使能信号tx_en首先进入该源语进行数据延时,源语输出再进行ODDR转换。
DELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-
.0)..SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal)IDELAYE2_inst_dv (.CNTVALUEOUT(), // 5-bit output: Counter value output.DATAOUT(rx_ctrl_t), // 1-bit output: Delayed data output.C(1'b0), // 1-bit input: Clock input.CE(1'b0), // 1-bit input: Active high enable increment/decrement input.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input.CNTVALUEIN(5'd0), // 5-bit input: Counter value input.DATAIN(1'b0), // 1-bit input: Internal delay data input.IDATAIN(rx_ctrl), // 1-bit input: Data input from the I/O.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input.LD(1'b0), // 1-bit input: Load IDELAY_VALUE input.LDPIPEEN(1'b0), // 1-bit input: Enable PIPELINE register to load data input.REGRST(1'b0) // 1-bit input: Active-high reset tap-delay input);IDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE"// or "SAME_EDGE_PIPELINED".INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC") IDDR_rxctrl_inst (.Q1(rxdv), // 1-bit output for positive edge of clock.Q2(rxerr), // 1-bit output for negative edge of clock.C(rx_clk_90), // 1-bit clock input.CE(1'b1), // 1-bit clock enable input.D(rx_ctrl_t), // 1-bit DDR data input.R(1'b0), // 1-bit reset.S(1'b0) // 1-bit set);
其中IDELAY_VALUE表示设置延时大小,可以填写的值为0~31,具体分辨率是多少每个器件并不相同,需要查看手册。
此外,这个源语还要配合IDELAYCTRL使用:
IDELAYCTRL IDELAYCTRL_inst (.RDY(RDY), // 1-bit output: Ready output.REFCLK(sysclk), // 1-bit input: Reference clock input.RST(~locked) // 1-bit input: Active high reset input
通过调整IDELAY_VALUE的值,就可以调整数据和时钟之间的延时,消除时序违例。当IDELAY_VALUE增大时延时增大,建立时间裕量减小,保持时间裕量增大。
三、output delay约束
同样使用千兆以太网数据收发中的RGMII输出端作为约束对象。在不知道目标端的建立时间和保持时间时,可以利用数据的skew进行output delay约束。
根据时序图可得:
dMax = Tcycle - askew
dMin = bskew
设置SKEW 的目的是让综合工具知道输出的时钟采样沿不能落在 SKEW 的区域 。我们可以通过调整skew的值使时钟沿落在数据的中心位置。这里设置askew=bskew=1.5ns,则dMax = 2.5,dMin = 1.5。
这样就可以在工具中进行约束了。首先要创建生成时钟,告诉综合工具tx_clk是时钟信号。打开Open Implementation----->Edit Timing constraints,选中Creat Generated Clock,点击加号“+”,这里设置时钟源为PLL输出时钟,目标时钟为tx_clk。
然后选择set Output Delay,点击加号“+”添加约束信息。
设置参数。
Clock:时钟,选择tx_clk。
Objects:约束目标,选择RGMII输出信号。
Delay value:延时时间。
Delay value is relative to clock edge:边沿选择。
Delay value specifies:最大最小选择。
Delay value is relative to clock edge选择rise,Delay value specifies选择max,在Delay value处设置上升沿的最大、最小延时;Delay value is relative to clock edge选择full,Delay value specifies选择max,在Delay value处设置上升沿的最大延时;Delay value is relative to clock edge选择rise,Delay value specifies选择min,在Delay value处设置上升沿的最小延时。下降沿的延时最大、最小延时设置同理。
这样就完成了output delay的约束,点击保存,可以看到output delay约束信息已经更新到了.xdc文件中。
接下来我们重新综合、布局布线,Open Implemented Design,点击Report Timing。
设置时序报告打印参数。这里在End Points处添加。
这样就生成了时序报告。可以看到建立时间和保持时间没有发生时序违例。