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

SystemVerilog测试平台中@(posedge clk)与##1的区别是什么?

@(posedge clk) vs ##1 在SystemVerilog测试平台的核心区别

嘿,这个问题在SystemVerilog验证里是高频疑问,我来给你拆解清楚两者的本质差异和适用场景:

1. 本质类型完全不同

  • @(posedge clk) 是事件等待语句:它属于通用的过程控制语法,作用是暂停当前进程,直到检测到时钟上升沿这个事件发生。它不关心“周期数”,只盯着“事件是否触发”。
  • ##1 是时序延迟操作符:它是专为同步设计的语法,仅适用于断言(SVA)、sequence/property 或者 program 块中,作用是等待1个完整的时钟周期,本质是基于时钟节拍的计数逻辑。

2. 执行时机的关键差异

假设当前时间点刚好处于时钟上升沿时刻,两者表现天差地别:

  • 对于 @(posedge clk):如果进程在上升沿发生后才走到这个语句,它会错过当前上升沿,继续等待下一次的上升沿触发。比如:
    initial begin
        #10; // 假设clk在10ns发生上升沿
        @(posedge clk); // 这里会等待20ns的下一个上升沿,而非当前10ns的
        $display("Triggered at %0t", $time); // 输出20ns
    end
    
  • 对于 ##1(在program块/SVA中):它会基于当前时钟节拍计数,即使在上升沿时刻执行,也会准确等待下一个完整周期后的上升沿,逻辑上更贴合“等一个周期”的直观理解。比如:
    program test;
        initial begin
            #10; // 到达clk上升沿时刻
            ##1; // 等待1个周期,到20ns的上升沿
            $display("Triggered at %0t", $time); // 输出20ns
        end
    endprogram
    
    要是在SVA序列里,##1直接就表示“下一个时钟沿”,完全和当前沿的时间点无关。

3. 适用场景各有侧重

  • @(posedge clk):
    • 能用于任何过程块(initial、always),包括module里的异步或同步逻辑
    • 支持多事件组合,比如 @(posedge clk or negedge rst_n),同时等待时钟上升沿或复位下降沿
    • 适合在通用测试平台流程里做时钟触发的等待,比如初始化后的同步操作
  • ##1:
    • 仅限SVA断言、sequence/property 或者 program 块中使用(module的initial/always块不能直接用)
    • 适合描述严格的时序关系,比如断言里“当A发生后,下一个周期B必须发生”,或者program块里同步的测试步骤延迟

4. 行为灵活性不同

  • @(posedge clk) 是异步的事件等待,进程会在事件发生的瞬间被唤醒,不管当前处于仿真时间的哪个阶段
  • ##1 是同步的周期延迟,它的操作严格对齐时钟节拍,不会在非时钟沿的时刻唤醒进程,更符合测试平台中“同步执行”的需求

内容的提问来源于stack exchange,提问作者geschema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:40:49