Systemverilog ::静态变量非阻塞分配程序块外?

时间:2014-08-16 23:16:38

标签: system-verilog

我是系统verilog的新手,我坚持使用基本概念,请提供以下行为背后的理由:

  1. 在系统verilog中,为什么在程序块作用域范围之外声明的静态类属性不能通过程序块的块分配进行分配?
  2. 2.为什么,即使静态变量被赋予非阻塞语句,该静态变量的变化也不会立即可见($ display),在延迟说#1后可用。

    示例:

    class A ;
     static int i;
    endclass
    
    program main ;
    A obj;
    
    initial
    begin
    
      obj.i = 123; // Not Allowed, can only be done using <= ... WHY ??
      $display(obj.i);
      #1 $display(obj.i);
    end
    endprogram 
    

2 个答案:

答案 0 :(得分:1)

IEEE 1800-2012 LRM早期版本的SystemVerilog中没有这样的规则对允许的分配类型有更多限制,但这些都已被删除。我不建议任何人再使用程序块。有很多不必要的混淆。见http://go.mentor.com/programblocks

答案 1 :(得分:-1)

  1. SystemVerilog中“program”块的目的是保证如果用户将其测试平台封装在程序块中并且将DUT保持在DUT之外,则测试平台和DUT之间不会出现任何竞争条件。程序块。避免竞争条件的另一种方法是通过将DUT / testbench交互限制到接口/时钟块来实现。另请注意:

    a)阻止分配(因为它们是立即执行的,因此执行的结果可能随着线程的执行顺序而变化)会导致竞争条件

    b)硬件(RTL)变量只能是静态的

    鉴于整个场景,编译器发现阻塞语句可能导致DUT和测试平台之间的竞争条件。因而错误。

  2. 使用非阻塞分配时,分配已安排,不会立即执行。一旦调度程序有机会执行它,它就会被执行。而这只会在当前线程产生后才会发生,因为阻塞表达式涉及时间增量。在给定的代码片段中,一旦执行的线程遇到#1就会发生; #1之后的$ display会看到非阻塞分配的结果,而之前的那个没有。