SystemVerilog中D触发器$past()算子的边界与断言疑问
关于SystemVerilog $past()算子与D触发器断言的行为解析
1. 第二个时钟上升沿处$past()的指向
是的,在第二个时钟上升沿触发时,$past(d)默认会指向第一个时钟上升沿时采样到的d信号值。$past()的核心逻辑是:以当前断言采样的时钟沿为基准,获取目标信号在前一个同类型时钟沿(这里是上升沿)被采样锁定的值,而非时钟周期内的任意区间电平。
2. d当前值与$past(d)的边界
d的当前值:指当前时钟上升沿触发瞬间采样到的d信号值,对应断言执行时刻的输入采样结果。$past(d):指前一个时钟上升沿触发瞬间采样到的d信号值,是被SystemVerilog采样机制存储的历史值。
两者的边界就是连续的两个时钟上升沿,每个沿对应一次固定的采样点,而非时钟周期的时间段。
3. 断言为何未按预期失败
结合D触发器的行为和断言逻辑分析:
D触发器核心代码(典型实现)
module dff( input clk, input d, output reg q ); always @(posedge clk) begin q <= d; // 非阻塞赋值,沿触发后更新q为当前沿的d值 end endmodule
常见断言逻辑(比如绑定到D触发器)
assert property(@(posedge clk) q == $past(d));
在第二个时钟上升沿时:
$past(d)取的是第一个时钟上升沿采样到的d值;- 而
q的值是通过非阻塞赋值q <= d得到的,该赋值在第一个时钟上升沿触发后,于非阻塞更新阶段完成,因此第二个时钟上升沿时,q的当前值恰好等于第一个时钟上升沿时的d值。
两者完全相等,断言自然通过。
你提到的波形图橙色区域可能是对$past()的误解:它采样的是时钟沿瞬间的信号值,而非时钟周期内的持续电平。即使第一个周期内d的电平有变化,$past(d)只锁定第一个上升沿时的采样值,和后续周期内的电平区间无关,因此不会出现断言失败的情况。
内容的提问来源于stack exchange,提问作者user2979872
相关产品推荐
相关产品推荐

