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
相关产品推荐
相关产品推荐

