systemVerilog:影响任务变量的局部范围

时间:2014-12-08 21:22:29

标签: task system-verilog

所有

我想使用任务来更改本地范围变量的内容。

这里的代码片段无法正常工作:

  module dummy;
   int  test = 100; //global scope var, I don't want to change this one
   task assignTest;
      test =123; //should change the content of local scope var named test
   endtask // forceV

   initial
     begin  
       begin  
         int test; //I want to affect this variable
         assignTest;
         $display(">>local test=%d", test);
       end    
      $display(">>global test=%d", test);
     end

这是我得到的结果:

>>local test=          0
>>global test=        123

所以我得出结论,该任务对我所希望的局部变量没有影响。 有关如何实现这一点的任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:2)

有几种方法:

  1. 使用连接通过端口,因此调用assignTest变为assignTest(test)。有三种方法可以定义assignTest

    task assignTest(output int test);
    task assignTest(inout int test); 
    task automatic assignTest(ref int test);
    
  2. 将范围硬编码为任务中的本地test。这需要命名您的范围。例如:

    int  test = 100;
    task assignTest;
      init_scope.local_scope.test = 123;
    endtask // forceV
    
    initial begin : init_scope
      begin : local_scope
        int test;
        assignTest;
        $display(">>local test=%d", test);
      end    
      $display(">>global test=%d", test);
    end
    
  3. 工作示例here

    我推荐使用端口选项,因为它们非常灵活且可重复使用。三种样式中的哪一种取决于设计/实施要求。