Tsetup和Thold的经典问题 & max fanout的解决办法

Tsetup和Thold的经典问题

有个著名的笔试题,这样说道:时钟周期为T,触发器D1的建立时间最大为T1max,最小为T1min,该触发器的数据输出延时为Tco。组合逻辑电路最大延迟为T2max,最小为T2min。假设D1在前,D2去采样D1的数据(实际就是对图2的文字描述),问,触发器D2的建立时间T3和保持时间应满足什么条件。这里给出一个简易公式供大家死记一下,

以下两个公式确定了D2的Tsetup和Thold:下面两个公式可以在我的这篇博客中找到更详细的答案。
https://blog.youkuaiyun.com/weixin_43343190/article/details/82960601
1、D1的Tco+ max数据链路延时+ D2的Tsetup< T(即T3 < T - Tco - T2max)
2、D1的Tco+ min数据链路延时> D2的Thold(即T4< Tco+ T2min)

其实上面的式2可以从T3+T4=T推出,不过要注意把1)中的T2max改为T2min即可。

总之,建立时间长了,保持时间就短了。

实际中,某条数据链路延时是一个定值,只不过要求它落在区间{T2min,T2max}。这也是T2min和T2max的实际意义。

看完上述,应该可以回答以下问题了:
1、为什么仿真时,更看重MAX,较轻看重MIN?
答:根据上述最后的两个公式,逻辑路径的MAX和setup有关,有可能不满足要求,需要仿真验证;而MIN和hold有关,hold的公式易满足。

2、 为什么仿真时,更看重setup,较轻看重hold?
答:原理同上。

3、 逻辑路径延时的范围要求,怎么计算?
答:根据上述的最后两个公式,可

&lt;think&gt;我们正在讨论SystemVerilog中的clocking block,特别是关于setuphold时间的配置使用方法。根据引用[1][2][3]的内容,clocking block允许我们为输入输出信号指定偏差(skew),这些偏差实际上对应于数字电路中的建立时间(setup time)保持时间(hold time)的概念。 在clocking block中: - **input skew**:定义了在时钟事件发生之前多长时间对输入信号进行采样。这相当于为输入信号设置了一个采样窗口,确保在时钟边沿到来之前信号已经稳定(即满足建立时间要求)。 - **output skew**:定义了在时钟事件发生之后多长时间驱动输出信号。这相当于为输出信号设置了一个驱动时间,确保在时钟边沿之后的一段时间内信号保持稳定(即满足保持时间要求)。 在引用[2]中,我们看到一个例子: ```systemverilog clocking dram @(clk) input #1ps address; input #5 output #6 data; endclocking ``` 这里: - `address`作为输入,其采样发生在时钟边沿前1ps(即建立时间要求为1ps)。 - `data`被声明为输入输出,但注意这里可能有误,通常一个信号在同一clocking block中不能同时为输入输出。实际上,这里应该是分开的,但例子中写在一起了。正确的理解是:对于输入部分,采样发生在时钟边沿前5个单位时间;对于输出部分,驱动发生在时钟边沿后6个单位时间。 在引用[3]中,给出了一个更直接的例子,使用setup_timehold_time: ```systemverilog clocking cb @(posedge CLK); default input #setup_time output #hold_time; output a; output b; output c; input x; input y; input z; endclocking ``` 这里,`default`语句设置了默认的输入偏差(input skew)为`#setup_time`,输出偏差(output skew)为`#hold_time`。然后,下面列出的每个信号都会应用这些默认偏差,除非单独指定。 ### 配置方法 1. **全局设置**:使用`default input #&lt;value&gt; output #&lt;value&gt;;`为clocking block中的所有信号设置默认的输入输出偏差。 2. **单个信号设置**:如果某个信号需要特殊的偏差,可以在声明该信号时单独指定,覆盖默认设置。 ### 使用场景 - **输入信号(input)**:我们关心的是在时钟边沿到来之前信号必须稳定多长时间(即建立时间),所以input skew通常设置为一个正值,表示在时钟事件之前多少时间采样。例如,`input #2ns`表示在时钟上升沿前2ns采样信号,这样就能保证采样到的信号是稳定的。 - **输出信号(output)**:我们关心的是在时钟边沿到来之后信号需要保持稳定多长时间(即保持时间),所以output skew通常设置为一个正值,表示在时钟事件之后多少时间驱动信号。例如,`output #3ns`表示在时钟上升沿后3ns驱动信号,这样就能保证在输出信号变化之前,设计有足够的时间锁存上一个周期的值。 ### 特殊值:`#1step` 引用[1][2]提到,输入偏差可以使用`#1step`,这个特殊值表示采样发生在上一时钟步长的最后时刻(即当前时钟边沿之前的一个时间步)。在仿真中,这个时间步通常等于时间精度(time precision)。使用`#1step`可以避免在时钟边沿与测试平台采样之间发生竞争条件。 ### 注意事项 - 输入偏差(input skew)不能为负值(因为采样不可能在时钟边沿之后)。 - 输出偏差(output skew)可以为负值吗?在标准中,输出偏差可以是负值,但通常不推荐,因为负的输出偏差意味着在时钟边沿之前驱动信号,这可能会导致设计中的保持时间违规。实际中,输出偏差通常为非负值。 ### 示例:配置setuphold 假设我们有一个时钟周期10ns,设计要求输入信号的建立时间为2ns,保持时间1ns;输出信号的建立时间为3ns,保持时间为2ns。我们可以在clocking block中这样配置: ```systemverilog clocking cb @(posedge clk); // 输入信号:在时钟上升沿前2ns采样(满足建立时间要求) default input #2ns; // 输出信号:在时钟上升沿后2ns驱动(注意:这里输出偏差设置为2ns,是为了满足设计的保持时间要求) // 因为驱动后,信号会保持一段时间,直到下一个驱动事件。这里2ns的驱动延迟,意味着在时钟边沿后2ns驱动, // 这样在时钟边沿后0~2ns这段时间内,输出信号保持之前的值,从而满足设计的保持时间要求(2ns&gt;1ns)。 default output #2ns; input data_in; output data_out; endclocking ``` ### 在测试平台中使用 在测试平台中,我们可以通过clocking block的句柄来同步采样驱动: ```systemverilog program test; // ... 接口连接 ... initial begin // 等待下一个时钟边沿 @(cb); // 采样输入信号(在时钟边沿前2ns采样) $display(&quot;data_in = %b&quot;, cb.data_in); // 驱动输出信号(在时钟边沿后2ns驱动) cb.data_out &lt;= 1&#39;b1; // 等待两个时钟周期 ##2; end endprogram ``` ### 总结 - **setup时间(建立时间)**:在clocking block中通过输入偏差(input skew)来保证。输入偏差的值应大于或等于设计要求的建立时间。 - **hold时间(保持时间)**:在clocking block中通过输出偏差(output skew)来保证。输出偏差的值应大于或等于设计要求的保持时间(注意:输出偏差设置的是驱动延迟,在延迟期间,信号保持之前的值,从而满足保持时间)。 通过合理配置clocking block中的input skewoutput skew,我们可以确保测试平台与设计之间的交互满足时序要求,避免竞争条件数据不稳定问题。 [^1]: [^2]: [^3]: [^4]: &sect;&sect;相关问题&sect;&sect; 1. 在clocking block中,如果输出偏差(output skew)设置为负值会有什么影响? 2. 如何根据设计时序要求计算clocking block中的input skewoutput skew? 3. 在同一个clocking block中,能否为同一个信号同时指定输入输出?如果不能,该如何处理双向信号? 4. clocking block中的`#1step`具体是如何避免竞争条件的?&lt;/think&gt;### SystemVerilog Clocking Block 中 Setup Hold 的配置方法 在 SystemVerilog 中,clocking block 通过 **input skew** **output skew** 参数来实现 setup hold 时间的控制,确保信号满足设计的时序要求。以下是详细配置方法: #### 1. 基本配置语法 ```systemverilog clocking cb @(posedge clk); default input #&lt;setup_time&gt; output #&lt;hold_time&gt;; // 全局设置 input #&lt;setup&gt; signal_in; // 单个信号设置 output #&lt;hold&gt; signal_out; endclocking ``` #### 2. Setup 时间配置(输入信号) - **作用**:确保时钟边沿前信号稳定 - **配置位置**:`input` 声明后 - **原理**: - 采样点 = 时钟边沿 - setup 时间 - 确保满足 $T_{\text{setup}} &lt; T_{\text{clk}}$ ```systemverilog clocking cb @(posedge clk); input #2ns data; // 在时钟上升沿前 2ns 采样信号 endclocking ``` *应用场景*:当设计要求输入信号在时钟边沿前 2ns 稳定时[^3]。 #### 3. Hold 时间配置(输出信号) - **作用**:确保时钟边沿后信号保持稳定 - **配置位置**:`output` 声明后 - **原理**: - 驱动点 = 时钟边沿 + hold 时间 - 确保满足 $T_{\text{hold}} &gt; 0$ ```systemverilog clocking cb @(posedge clk); output #3ns ready; // 在时钟上升沿后 3ns 驱动信号 endclocking ``` *应用场景*:当设计需要输出信号在时钟边沿后保持 3ns 不变时[^2]。 #### 4. 特殊值 `#1step`(关键配置) - **作用**:避免 RTL Testbench 的竞争条件 - **原理**:采样发生在**前一时钟步长末尾** - **应用**: ```systemverilog clocking cb @(posedge clk); default input #1step; // 推荐用于所有输入信号 endclocking ``` *优势*:完全规避 $T_{\text{setup}}$ 冲突问题[^1][^2]。 #### 5. 完整配置示例 ```systemverilog interface mem_if(input logic clk); logic [31:0] addr; logic [63:0] data; logic valid; // 设置默认时序:输入采样在时钟前1步,输出驱动在时钟后2ns clocking cb @(posedge clk); default input #1step output #2ns; // 单个信号覆盖默认值 input #1.5ns addr; // 特殊setup要求 input data, valid; // 使用默认#1step output #3ns ready; // 特殊hold要求 endclocking endinterface ``` #### 6. 时序关系图解 ``` 时钟周期时间线: |&lt;----- 周期 n -----&gt;|&lt;----- 周期 n+1 -----&gt;| &uarr; 时钟边沿 输入信号采样点: 时钟边沿 - setup | (input #1.5ns) | (input #1step) 输出信号驱动点: 时钟边沿 + hold | (output #2ns) | (output #3ns) ``` #### 7. 最佳实践原则 1. **输入信号**:优先使用 `#1step` 避免竞争 ```systemverilog default input #1step; // 最佳实践[^1][^2] ``` 2. **输出信号**:hold 时间 &ge; 设计规范 ```systemverilog output #max(2ns, Thold_design); // 满足设计保持时间 ``` 3. **混合信号**:双向总线需分时控制 ```systemverilog clocking cb @(posedge clk); inout #1step read_mode; // 读模式为输入 inout #3ns write_mode; // 写模式为输出 endclocking ``` 4. **时序检查**:结合 SVA 验证 ```systemverilog assert property (@(posedge clk) $stable(cb.data) throughout ##[0:cb.setup] ); ``` #### 8. 常见错误及解决方案 | **错误类型** | **后果** | **解决方案** | |---------------------------|--------------------------|--------------------------------| | 未设置 setup (`input #0`) | 采样竞争风险 | 使用 `input #1step` | | hold 时间不足 | 违反设计保持时间 | 增加 `output #&lt;hold&gt;` 值 | | 双向信号未分时控制 | 总线冲突 | 使用 `inout` + 模式控制 | | 跨时钟域未隔离 | 亚稳态 | 为每个时钟域单独定义 clocking block | 通过合理配置 setup hold 时间,clocking block 能有效解决数字设计中的时序同步问题,确保验证平台与 RTL 设计的正确交互[^1][^2][^4]。 [^1]: [^2]: [^3]: [^4]:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值