STA:时序检查 - input2output型

作STA要分析的时序路径四种中的一种,可看作是reg2reg的变种。详见STA:时序检查


4. input2output

第四种是发起触发器和捕获触发器都在芯片外部。

发起触发器到捕获触发器路径如下:

在这里插入图片描述

参数定义:

T c l k 2 I N B T_{clk2INB} Tclk2INB:上升沿从时钟CLKM经过触发器UFF0传输到端口INB的延迟。

为端口INB相对于时钟CLKM的输入路径延迟,即 T c l k 2 I N B = T c l k 2 U F F 0 + T C K 2 Q U F F 0 + T U F F 02 I N B T_{clk2INB}=T_{clk2UFF0}+T^{UFF0}_{CK2Q}+T_{UFF02INB} Tclk2INB=Tclk2UFF0+TCK2QUFF0+TUFF02INB,通过下方SDC指定

# 最长路径,用于建立时间检查
set_input_delay -clock CLKM -max 1.5 [get_ports INB]

# 最短路径,用于保持时间检查
set_input_delay -clock CLKM -min 1 [get_ports INB]

T I N B 2 P O U T T_{INB2POUT} TINB2POUT:数据从设计端口INB,经过一系列组合逻辑元件,最终到达POUT的延迟

取决于综合后端口INB到POUT之间的组合逻辑,组合逻辑延迟通过标准单元库的SDF指定。

T P O U T 2 U F F 1 T_{POUT2UFF1} TPOUT2UFF1:数据从设计端口POUT输出,经过一系列组合逻辑元件,最终到达UFF1的延迟

T c l k 2 I N C T_{clk2INC} Tclk2INC:上升沿从时钟CLKM输入通过端口INC输入至设计内部的延迟。

此处INC为时钟定一点,所以该延迟就为源延迟,通过下方SDC指定

set_clock_latency 0.8 -source [get_clocks CLKM]

T I N C 2 P I N C T_{INC2PINC} TINC2PINC:时钟CLKM在设计内部传输的延迟。

设计内部时钟的网络延迟,通过下方SDC指定

set_clock_latency 0.2 [get_clocks CLKM]

T P I N C 2 U F F 1 T_{PINC2UFF1} TPINC2UFF1:时钟CLKM通过端口PINC输出至UFF1的延迟。

T c l k T_{clk} Tclk:时钟CLKM周期,注意该时钟并不是设计内部时钟。该值通过下方SDC指定

create_clock -period 10 -name CLKM [get_ports INC]

T s e t u p _ u n c e r t a i n T_{setup\_uncertain} Tsetup_uncertain:时钟CLKM建立时间不确定度,即预期时钟沿提前一段时间。

该值通过下方SDC指定

set_clock_uncertainty -setup 0.3 [get_clocks CLKM]

T h o l d _ u n c e r t a i n T_{hold\_uncertain} Thold_uncertain:时钟CLKM建立时间不确定度,即预期时钟沿延后一段时间。

该值通过下方SDC指定

set_clock_uncertainty -hold 0.4 [get_clocks CLKM]

T s e t u p U F F 1 T^{UFF1}_{setup} TsetupUFF1:UFF1的建立时间。

T o u t p u t U F F 1 T^{UFF1}_{output} ToutputUFF1:外部时序约束。POUT到UFF1/D端组合逻辑延迟与PINC到UFF1/CK端组合逻辑延迟的差,再加上UFF1的建立时间,即 T o u t p u t U F F 1 = T P O U T 2 U F F 1 − T P I N C 2 U F F 1 + T s e t u p U F F 1 / − T h o l d U F F 1 T^{UFF1}_{output}=T_{POUT2UFF1}-T_{PINC2UFF1}+T^{UFF1}_{setup}/-T^{UFF1}_{hold} ToutputUFF1=TPOUT2UFF1TPINC2UFF1+Tsetu

在静态时序分析(Static Timing Analysis, STA)中,**recovery** 和 **removal** 是用于描述异步复位信号相对于时钟信号的时序约束条件,尤其在使用 D 触发器(DFF)的设计中尤为重要。这些时序检查确保异步复位信号在释放时不会导致触发器进入亚稳态或数据采样错误。 ### recovery 时间 recovery 时间指的是在时钟的有效沿到来之前,异步复位信号必须保持稳定(即未被释放)的最短时间。这个时间确保了在时钟沿到达时,触发器已经从复位状态中恢复,并准备好接收新的数据输入。 ### removal 时间 removal 时间指的是在时钟的有效沿到来之后,异步复位信号必须继续保持稳定(即未被释放)的最短时间。这个时间确保了在时钟沿之后,触发器能够正确地完成复位操作,而不是在复位信号释放时立即开始采样新数据。 ### recovery 和 removal 的时序图解析 假设我们有一个 DFF,其异步复位信号为 `async_rst`,时钟信号为 `clk`。在时序图中,`async_rst` 的释放必须满足以下条件: 1. **Recovery 时间**:在 `clk` 的上升沿之前,`async_rst` 必须保持为高电平(假设复位信号为低电平有效)至少 `recovery_time`。这意味着 `async_rst` 的下降沿(复位释放)必须发生在 `clk` 上升沿之前至少 `recovery_time` 的时间点。 2. **Removal 时间**:在 `clk` 的上升沿之后,`async_rst` 必须继续保持为高电平至少 `removal_time`。这意味着 `async_rst` 的下降沿(复位释放)必须发生在 `clk` 上升沿之后至少 `removal_time` 的时间点。 这两个时间共同确保了异步复位信号在时钟沿附近不会导致触发器进入亚稳态。如果不满足 recovery 或 removal 时间,可能会导致触发器无法正确恢复到正常工作状态,从而导致数据采样错误。 ### 示例代码 以下是一个简单的 Verilog 代码示例,展示了如何在 RTL 设计中处理异步复位信号: ```verilog module dff_with_async_reset ( input clk, input async_rst, input d, output reg q ); always @(posedge clk or posedge async_rst) begin if (async_rst) begin q <= 1'b0; // 复位时将输出置为0 end else begin q <= d; // 正常工作时将输入数据传递给输出 end end endmodule ``` 在这个例子中,`async_rst` 是一个异步复位信号,它在 `clk` 的上升沿或 `async_rst` 的上升沿触发。当 `async_rst` 为高电平时,输出 `q` 被置为 0;否则,`q` 跟随输入 `d` 的值。 ### 相关问题 1. 如何在实际设计中避免 recovery 和 removal 时序违例? 2. recovery 和 removal 时间与时钟频率之间的关系是什么? 3. 在哪些情况下可以忽略 recovery 和 removal 检查? 4. 如何通过综合工具优化 recovery 和 removal 时序? [^1]: 参考引用1 [^2]: 参考引用2 [^3]: 参考引用3 [^4]: 参考引用4 [^5]: 参考引用5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值