sv program与module

参考:systemverilog之program与module

为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。
sv program与module_第1张图片

sv program与module_第2张图片
此时仿真结果和第二次一致,这是因为program的采样是在reactive中进行的,此时数据已经是变化后的稳定值,不会出现竞争的情况。

因此,我们一般推荐在Testbench中使用program,在设计dut中使用module,在顶层module中例化dut的module和 testbench的program。

program中的注意点:

  • program中不能例化其他program和module
  • 不能出现interface和always,可以使用initial forever替代always
  • program内部可以发起多个initial块
  • program中内部定义的变量最好采用阻塞赋值,当然采用非阻塞仿真器也不会产生error,驱动外部信号则应该采用非阻塞赋值
  • program中的initial块和module中的initial块执行位置不同,前者在reactive,后者在active块中执行。
  • program中存在的多个initial块中,如果有一个initial采用了退出系统函数$exit(),则会结束该program,而不仅仅是该initial块。
module counter(input clk);
    bit [3:0] cnt;
    always @(posedge clk) begin
      cnt <= cnt + 1;
      $display("@%0t DUT cnt = %0d", $time, cnt);
    end
  endmodule
  
program dsample(input clk); 
    initial begin
      forever begin
        @(posedge clk); 
        $display("@%0t TB cnt = %0d", $time, dut.cnt);
      end
    end
endprogram
  
  
module test_tb_top;
  bit clk1;
  bit [3:0] cnt;
    initial begin
      forever #5ns clk1 <= !clk1;
    end
    counter dut(clk1);
    dsample spl(clk1);
endmodule

你可能感兴趣的:(sv,program,time,region)