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

SystemVerilog调度语义:类方法执行区域及代码示例问询

SystemVerilog调度区域与代码问题解答

一、类方法的执行时机

类中的普通方法(函数)执行时机属于Active Region(活跃区域)。SystemVerilog里函数是阻塞性的,调用时会立即在当前时间步的Active Region内完成全部执行逻辑,不会挂起或延迟到其他区域。如果是类中的任务(带task关键字),则可能因延迟或事件触发进入其他调度区域,但普通函数必然在Active Region执行。

二、Driver与Monitor的调度区域

  • Driver切换接口信号:通常在Active Region执行。Driver驱动信号时,无论是阻塞赋值(=)还是非阻塞赋值(<=),赋值操作的右边求值都发生在Active Region;阻塞赋值的左边更新也在Active Region,非阻塞赋值的左边更新在NBA区域,但驱动信号的核心动作(发起赋值)是在Active Region完成的。
  • Monitor采样DUT信号:建议在**Re-active Region(反应区域,即Postponed Region)**采样。这个区域是当前时间步的最后一个调度区域,此时所有信号的变化都已完成并稳定,能确保Monitor采样到的是DUT输出的最终稳定值,避免采样到中间过渡的信号值。

三、代码示例中变量b的取值

先看代码:

module tb;
  int b;
  class cla;
    function void changeb(input int bdash);
      b = bdash;
    endfunction
  endclass
  cla clainst = new();
  initial begin
    clainst.changeb(23); // Executes in the Active region or Re-active region
    $display("b=%0d", b); // Prints b=23 or b = 0   
  end
endmodule

变量b的取值是23,$display会打印b=23。原因是changeb是类的函数,调用时会阻塞执行,在Active Region内立即完成对全局变量b的赋值,赋值完成后才会执行下一行的$display,不存在调度延迟导致的未更新情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:29:54