You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:35:58