建立时间和保持时间(1)

 Setup 和Hold (建立时间和保持时间)解析(1)

本文是第一篇,有空会继续更新。(转载请注明出处!!!)

STA分析是基于同步电路设计模型的,在数据输入端,假设外部也是同时钟的寄存器的输出并且经过若干组合逻辑进入本级,而输出也被认为是驱动后一级的同时钟的寄存器。在不设置约束的情况下,纯组合逻辑的输入->输出不得超过一个T,否则也会被认为是Timing violation.

1. Timing path

Timing path就是时间线。Timing就是从起始位置的时间点到终点位置的时间点之间的时间长度。Path是指跟位置相关,即时间起始或终点的位置。Timing path就是某位置的某一时间点到另一位置的某个时间点。对于DFF来说,上升沿类似于一瞬间的脉冲,只有在这短短的一瞬间,数据才允许通过。对于DFF来说,有两个输入点:数据D和时钟CK,有一个输出点:数据Q。由于是时间比较,所以对于DCK一定要有一个共同的起始时间点,如下图中的A点出现clk上升沿的时刻。如下图,假设我们分析DFF2的数据和时钟到达的时间。二者共同的出发点是A的上升沿,因为A位于时钟通路上,FF1的时钟经过A点到达FF1-C点,在FF1-C上升沿打开FF1,然后数据才能从FF1-Q输出,进而传递到FF2-D。在A点, FF2的时钟沿经过clock tree,达到FF2-C点。所以数据走过的路程是:

Data path: A->clk_tree_buf1->FF1-C -> FF1-Q -> Comb_logic -> B

而对于FF2来说只要满足下个周期的上升沿能够采样即可,所以时钟到达FF2-C的路径是:

Clk path: A -> clk_tree_buf2-> C.

 

2. 什么是建立时间和保持时间?

对于某个DFF来说,建立时间和保持时间可以认为是此器件固有的属性。有关DFF的内部结构及setup和hold时间对应的逻辑门会在其他文章中进行细致描述。

在理想情况下,只要在时钟沿来临时,有效数据也来临(时钟沿之前或同时),则能够正确采集到数据;而在时钟沿之后(或同时),即使数据发生变化,也不会影响DFF的输出了。然而在实际中,上升沿打开开关需要时间,逻辑门的状态改变(电容充放电等)都需要时间,因此数据的采集是需要一定时间的,在这个时间内数据不能发生变化。上升沿时候开关关闭也需要时间,如果在这个时间段内数据有变化的话,那么新数据就有可能被传递到下一级,进而发生错误,所以数据必须保持一定时间不变。(细节部分可以参考DFF的内部结构)。

总而言之在DFF的输入端口上看,

  •  clk上升沿来之前,数据必须提前一个最小时间量预先准备好,这个最小时间量就是建立时间;
  •  在clk上升沿来之后,数据必须保持一个最小时间量不能变化,这个最小时间量就是保持时间。


 

3. 建立和保持时间要求、及其公式

满足建立和保持时间要求,电路状态改变就是正确的,电路功能就不会发生错误;如果不满足,电容就没有足够的时间充放电,造输出点的电平可能既非0也非1,造成“亚稳态“输出。如果前级驱动够强劲,电路就能按照趋势变化下去,一定时间后该点的值就会变化为“正确值”,如果驱动不够强劲,电路就会恢复之前的值,最终得到何值是不可控的,所以我们要避免亚稳态。在使用DFF时,必须满足其建立时间和保持时间的要求。


建立时间

现在在回头分析data path和clk path,假设t0时刻FF1采集到数据并传递给FF2,那么FF2只要在t10上升沿采到数据即可,所以数据有一整个Tperiod的时间来传递到FF2-D端。因为要满足建立时间要求,所以对于FF2来说,数据要比时钟“走得快”:

Tdata_path+ Tsetup <= Tclk_path+ Tperiod

所以

Tclk_delay_FF1 + Tc->q_FF1+ Tcomb_logic+ Tsetup <= Tclk_delay_FF2 +Tperiod

在分析STA时,不满足此公式的即为setup violation。对应时序图的分析,见下图:


保持时间

保持时间比较难理解,其实质是当前时钟沿的FF1输出不能太快在当前沿到达FF2。以上图为例,即在t10时刻,为防止FF1采到的新数据太快到达FF2而“冲掉”原来的正确数据,数据必须要在一定时间之后才允许到达,所以保持时间分析,分析的是FF1和FF2的同一个时钟沿。因为datapath和clk_path要满足保持时间要求,所以

Tdata_path– Thold >= Tclk_path

所以:

Tclk_delay_FF1 + Tc->q_FF1+ Tcomb_logic– Thold >= Tclk_delay_FF2

在STA分析时,不满足此公式的即为Holdviolation。

其中Tclk_skew =Tclk_delay_FF2– Tclk_delay_FF1. 这条公式在分析Tskew时用得上。

对应于时序图,见如下图的分析:


4. 实际电路的Setup和Hold公式及violation分析

因为在不同的情形下,例如不同的温度,电压,loading等等,每一段电路的delay是不同的,所以对于同一段电路,其delay可以在如下范围中:

Min_delay<= Delay <= max_delay

如下图:


建立时间

公式为:   Tclk_delay_FF1 + Tc->q_FF1+Tcomb_logic + Tsetup <= Tclk_delay_FF2 + Tperiod

应该满足MAX_data_path_delay + Tsetup  <= MIN_clk_path_delay + Tperiod,才能保证电路是可靠的。所以在实际电路中:

Tdata_path_max+ Tsetup <= Tclk_path_min+ Tperiod

对应上图,该公式应该是:

2ns+ 11ns + 2ns + 9ns + 2ns + 4ns <= 2ns + 5ns + 2ns + Tperiod

所以: 30 <= 9 + 15.因为违反了该公式,所以该电路出现了setup violation。

保持时间

公式为:  Tclk_delay_FF1 + Tc->q_FF1 + Tcomb_logic –Thold>= Tclk_delay_FF2

应该满足MIN_data_path_delay – Thold>= MAX_clk_path_delay.才能保证电路是可靠的。所以在实际电路中:

Tdata_path_min- Thold >= Tclk_path_max


对应上图,该公式应该是:

1ns +9ns + 1ns + 6ns + 1ns – 2ns >= 3ns + 9ns + 3ns

所以: 16ns >= 15ns,满足公司要求,所以该电路无holdviolation。

 

在某些电路中,可以认为clk tree上面没有延迟,可以认为wire没有延迟,那么setup和hold公式就得到简化。


STA分析是基于同步电路设计模型的,在数据输入端,假设外部也是同时钟的寄存器的输出并且经过若干组合逻辑进入本级,而输出也被认为是驱动后一级的同时钟的寄存器。在不设置约束的情况下,纯组合逻辑的输入-》输出不得超过一个T,否则也会被认为是TImingviolaTIon.   1.TImingpath TImingpath就是时间线。Timing就是从起始位置的时间点到终点位置的时间点之间的时间长度。Path是指跟位置相关,即时间起始或终点的位置。Timingpath就是某位置的某一时间点到另一位置的某个时间点。对于DFF来说,上升沿类似于一瞬间的脉冲,只有在这短短的一瞬间,数据才允许通过。对于DFF来说,有两个输入点:数据D时钟CK,有一个输出点:数据Q。由于是时间比较,所以对于DCK一定要有一个共同的起始时间点,如下图中的A点出现clk上升沿的时刻。如下图,假设我们分析DFF2的数据时钟到达的时间。二者共同的出发点是A的上升沿,因为A位于时钟通路上,FF1的时钟经过A点到达FF1-C点,在FF1-C上升沿打开FF1,然后数据才能从FF1-Q输出,进而传递到FF2-D。在A点,FF2的时钟沿经过clocktree,达到FF2-C点。所以数据走过的路程是:   Datapath:A-》clk_tree_buf1-》FF1-C-》FF1-Q-》Comb_logic-》B   而对于FF2来说只要满足下个周期的上升沿能够采样即可,所以时钟到达FF2-C的路径是:   Clkpath:A-》clk_tree_buf2-》C.
<think>我们正在讨论Verilog中的建立时间(setup time)问题。用户要求提供关于建立时间的代码示例或实现方法。请注意,建立时间本身是一个时序概念,通常在RTL代码中并不直接“实现”,而是通过时序约束来确保满足,并在仿真或静态时序分析中检查。但是,我们可以提供以下内容:1.使用Verilog系统任务进行建立时间检查的代码示例。2.在设计中如何考虑建立时间(例如,通过满足时钟周期约束)。另外,注意引用[1]提到了DFT(可测性设计)中的Transition测试,其中涉及高频时钟捕获,这与建立时间检查有关,但用户当前问题更关注于一般的建立时间代码示例。因此,我将提供:-一个简单的触发器模块,其中包含使用`$setup`系统任务进行建立时间检查的示例。 -解释该任务的使用方法。注意:`$setup`是一个时序检查系统任务,通常用于门级网表仿真(后仿真)中,因为此时已经有了实际的延迟信息。在RTL仿真中,由于没有延迟,通常不会触发违例,除非使用`specify`块指定了延迟。然而,为了演示,我们可以在RTL中编写一个使用`$setup`的示例,但要注意,在RTL仿真中如果没有指定延迟,那么数据变化时钟沿之间的时间差可能为0,这会导致违例(因为建立时间要求为正数)。因此,我们通常会在测试平台中引入一些延迟来模拟真实情况。示例代码:```verilog`timescale1ns/1psmoduledff_setup_check(input clk,inputd,outputreg q);//时序检查:建立时间检查//语法:$setup(data_event, reference_event,limit,notifier?);//这里我们设置建立时间要求为1.5nsspecify$setup(d, posedge clk,1.5);endspecifyalways@(posedgeclk) beginq <=d;endendmodule```在这个模块中,我们使用`specify`块来定义建立时间检查:在时钟上升沿(posedgeclk)之前,数据信号`d`必须稳定至少1.5ns。如果在仿真中,`d`在时钟上升沿前1.5ns内发生了变化,工具会报告建立时间违例。为了测试这个检查,我们可以编写一个测试平台,在时钟沿附近改变数据,以触发建立时间违例。测试平台示例: ```verilog`timescale1ns/1psmoduletb_dff_setup_check();reg clk,d;wireq;dff_setup_checkuut(.clk(clk),.d(d),.q(q));//生成时钟initialbeginclk =0;forever #5 clk =~clk;//周期为10ns,频率100MHzend//测试数据生成initial begind =0;//正常情况:在时钟沿前2ns改变数据,满足建立时间1.5ns)#3;d=1;#10;//等待一个时钟周期//尝试违例:在时钟沿前1ns改变数据,不满足建立时间1.5ns)//下一个上升沿在时间15ns(0,5,10,15,...)//在14ns改变数据(距离15ns上升沿只有1ns)#4;//从当前时间3+10=13ns开始,再等4ns到17ns?注意:我们当前在13ns,需要等到14ns//实际上,我们想要在14ns改变数据,即下一个上升沿(15ns)前1nsd=0;#10;$finish;endendmodule```在这个测试平台中:-第一次数据变化发生在时间3ns,下一个时钟上升沿在5ns(因为时钟周期10ns,第一个上升沿在0ns,第二个在10ns?注意:初始时钟为0,然后forever #5翻转,所以上升沿在0,10,20,...ns)。所以3ns改变数据,距离10ns时钟沿有7ns,满足建立时间。-第二次数据变化:我们在13ns(3+10)之后等待4ns,即17ns改变数据?但实际上,我们想要在14ns改变数据(即15ns时钟沿前1ns)。这里需要调整。修正测试平台:我们希望时钟上升沿发生在0,10,20,...ns。所以:第一个数据变化在3ns(在0ns时钟沿后3ns,下一个时钟沿是10ns,所以3ns到10ns有7ns,满足建立时间)。然后等待10ns(到13ns),然后再等待1ns到14ns(此时距离下一个时钟沿20ns?不对,因为10ns后下一个是20ns?不对,时钟周期10ns,上升沿在0,10,20,30,...ns。实际上,在第一个数据变化(3ns)后,我们等待了10ns(到13ns),然后想在下个上升沿(20ns)前1ns(即19ns)改变数据?但这样时间跨度太长。我们可以调整到下一个上升沿(10ns)之后的一个时间点,然后改变数据,使其在下一个上升沿(20ns)前1ns(19ns)改变。但这样测试平台会很长。为了简化,我们可以在第一个时钟沿(0ns)后,在9ns改变数据(距离10ns时钟沿1ns,违例),然后在10ns后(20ns时钟沿前)再测试一次正常的。修改后的测试平台数据生成部分:```veriloginitialbegind=0;//违例情况:在时钟沿(10ns)前1ns(9ns)改变数据#9;d =1;//正常情况:在下一个时钟沿(20ns)前2ns(18ns)改变数据#9; //从9ns到18nsd=0;#20;$finish;end```这样,在9ns改变数据,距离10ns时钟沿只有1ns,小于1.5ns,会触发建立时间违例。然后在18ns改变数据,距离20ns时钟沿有2ns,满足建立时间。注意:在仿真时,需要确保仿真器支持时序检查,并且打开相关选项(如VCS需要加上+neg_tchk,或者使用其他仿真器时注意启用时序检查)。另外,建立时间检查也可以在`always`块中通过过程语句来实现,但通常不推荐,因为这样需要手动检查,而且不如系统任务准确。例如: ```verilogalways@(posedgeclk) begin//检查建立时间:在时钟沿前一段时间内数据是否变化//但这种方法不太实际,因为需要记录数据变化的时间end```因此,使用`$setup`系统任务是标准做法。总结:在Verilog中,建立时间检查通常通过`$setup`系统任务在`specify`块中定义。在仿真中,当数据在建立时间窗口内变化时,会报告违例。注意:在综合时,`specify`块`$setup`任务会被忽略,它们仅用于仿真。真正的建立时间保证是通过综合布局布线工具满足时序约束来实现的。相关问题:1.在Verilog中如何检查保持时间(hold time)?2.静态时序分析(STA)中如何报告建立时间违例?3.在FPGA设计中,如何设置时钟约束来避免建立时间违例?4.门级仿真中建立时间检查的流程是什么?</think>### Verilog 建立时间(Setup Time)代码示例 在 Verilog 中,建立时间检查主要通过以下两种方式实现: #### 1. 使用 `$setup` 系统任务(推荐方法) ```verilog `timescale 1ns/1ps module d_flipflop ( input clk, input d, output reg q ); // 建立时间检查:数据必须在时钟上升沿前至少 2ns 稳定 specify $setup(d, posedge clk, 2.0); // [数据信号, 时钟事件, 最小建立时间] endspecify always @(posedge clk) begin q <= d; // 同步数据采样 end endmodule ``` **说明:** - `$setup(data, reference, limit)` 是 Verilog 的内置时序检查系统任务 - 当数据 `d` 在时钟上升沿前 2ns 内变化时,仿真器会报告时序违例 - 该检查仅在时序仿真(门级仿真)中生效,综合时会被忽略[^1] #### 2. 使用时序约束(SDC 文件) ```tcl # 时钟定义:100MHz 时钟 (周期 10ns) create_clock -name clk -period 10 [get_ports clk] # 建立时间约束:输入数据最大延迟 3ns set_input_delay -max 3 -clock clk [get_ports d] # 输出建立时间约束 set_output_delay -max 4 -clock clk [get_ports q] ``` **说明:** - 静态时序分析工具(如 PrimeTime)会自动计算: $$ T_{\text{setup\_slack}} = T_{\text{周期}} - T_{\text{组合逻辑}} - T_{\text{setup}} $$ - 当 slack ≥ 0 时满足建立时间要求 - 这些约束通过 SDC 文件传递给综合布局布线工具[^1] #### 测试平台示例 ```verilog module tb_dff(); reg clk, d; wire q; d_flipflop uut(.clk(clk), .d(d), .q(q)); // 100MHz 时钟 always #5 clk = ~clk; initial begin // 正常情况:数据在建立时间前稳定 d = 0; #15; // 稳定时间 > 2ns @(posedge clk); // 违例情况:数据在建立时间窗口内变化 #8; // 时钟周期10ns,8ns时变化(距离下个上升沿仅2ns) d = 1; @(posedge clk); $finish; end endmodule ``` ### 关键注意事项: 1. **建立时间窗口**:数据必须在时钟有效边沿前 $T_{\text{setup}}$ 保持稳定 $$ t_{\text{data\_stable}} \geq t_{\text{clk\_edge}} - T_{\text{setup}} $$ 2. **实际应用**: - RTL 设计时不直接编码建立时间 - 通过 SDC 约束定义时序要求 - 使用 `$setup` 进行仿真验证 - 依赖 STA 工具进行最终验证 3. **建立时间违例修复**: - 降低时钟频率 - 优化关键路径逻辑 - 插入流水线寄存器 - 使用时序驱动综合选项 ### 建立时间与 DFT 的关系 在 DFT(可测性设计)中,Transition 测试使用高频时钟捕获信号,专门检测建立时间相关的性能故障。Shift 阶段则使用低频时钟避免误判[^1]。 --- ### 相关问题 1. 如何在静态时序分析报告中解读建立时间违例路径? 2. Verilog 中 `$hold` 系统任务的使用方法与 `$setup` 有何区别? 3. 如何为多时钟域设计设置建立时间约束? 4. FPGA 布局布线后如何验证建立时间满足要求? 5. 建立时间违例会导致哪些实际电路问题?
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值