systemverilog中的一个问题

#0延迟为什么不起作用?

这与SV中事件调度有关

 https://blog.csdn.net/lionsde/article/details/106928252

虽然设计的代码在仿真器中理论上来说是可以并行执行的,但是在实际仿真中,代码都是运行在CPU上的一些程序而已。SV为代码的执行顺序定义了调度机制,最大限度的减少不确定性的产生。

SV被定义为一种基于离散事件执行模型的语言。换句话说,仿真是离散的,是基于时间片进行且只对特定的时刻点进行仿真的。

这里说的时间片其实没有时间概念,纯粹是工具为了仿真效果而提出的不同任务工作的区域,在一个时钟边沿有效,可以理解为一个时钟边沿上的进程,但不涉及时间的推进,只是进程顺序执行。只有在当前时间片上的所有仿真全部完成,仿真器才会进入下一个时间片。当然,每个时间片还会细分为多个区域,如下图所示:

 

 

 

module top;
    int a;
    
    initial begin
         a<=1;
         #0;
          $display("a=%d",a);
    end
endmodule
module top;
  int a;
  
  initial begin
     a<=1;
  end

  initial begin
     #0 a<2;
   end
  
  initial begin
      $display("a=%d",a);
  end


endmodule

后者#0 在非阻塞赋值之后执行。在同一个begin end 块中还是顺序执行。

如果连续调用两个task

posted @ 2021-06-22 18:18  liutang2010  阅读(460)  评论(0)    收藏  举报