当前位置:   article > 正文

SystemVerilog数组参数传递及引用方法总结_verilog 模块传递数组

verilog 模块传递数组

一、将常数数组传递给task/function

如下面的程序,将一个常数数组传递给function

  1. module my_array_test();
  2. function array_test(int array[4]);
  3. foreach(array[i]) begin
  4. $display("array[%0d] = %0d", i, array[i]);
  5. end
  6. endfunction
  7. initial begin
  8. array_test('{0:5, 3:6, 1:2, 2:9});
  9. end
  10. endmouule

传递常量数组给function的格式如下:

    '{数组索引:值, 数组索引: 值, 数组索引: 值};
运行结果如下:

二、传递关联数组给function/task

        如下面的function,其参数类型为关联数组。

  1. module my_associative_array_test();
  2. function associative_array_test(int array[bit [1:0]]);
  3. foreach(array[i]) begin
  4. $display("array[%0d] = %0d", i, array[i]);
  5. end
  6. endfunction
  7. initial begin
  8. associative_array_test('{3:10});
  9. end
  10. endmoule

备注:

       关联数组,即我们通常所说的哈希(Hash),它没有顺序,只是一系列的键-值(key-value)对。如本例中所传递的Hash,他里面只有1个元素。

运行结果如下:

三、传递数组的引用给function/task

  • 通关ref传递数组的引用给子函数,子函数可以修改数组的值,并且对外可见
  1. int array[4] = '{0, 1, 2, 3}; //'
  2. function automatic ref_test(ref int array[4], input int start);
  3. foreach(array[i]) begin
  4. array[i] = i + start;
  5. // $display("*******%d \n",start);
  6. $display("[NOW]array[%0d] = %0d", i, array[i]);
  7. end
  8. endfunction
  9. initial begin
  10. foreach(array[i]) begin
  11. $display("[BFE]array[%0d] = %0d", i, array[i]);
  12. end
  13. #100;
  14. ref_test(array, 4);
  15. #100;
  16. foreach(array[i]) begin
  17. $display("[AFT]array[%0d] = %0d", i, array[i]);
  18. end
  19. end

备注:

(1)在使用ref修饰函数参数时(在module/program中),需要将function/task修饰为automatic,否则xrun编译不通过,VCS可以。严谨起见,还是记得加automatic
(2)通过ref传递参数是一个唯一的参数传递限定符,将ref与任何其他方向限定符(input/output/inout)组合应该是非法的
(3)对于具有静态生命的子程序,通过引用的方式传递参数是非法的
运行结果如下:

 四、传递数组的引用给function/task,但不希望子函数修改数组的值

  • 通关键词const修饰ref,传递常数数组给子函数,子函数就不能修改数组值
  1. module my_ref_array_test();
  2. int array[4] = '{0, 1, 2, 3, 4}; //'
  3. function const_ref_array_test(const ref int array[5], input start);
  4. foreach(array[i]) begin
  5. //array[i] = i + start; //不允许修改,会有编译错误
  6. $display("[NOW]array[%0d] = %0d", i, array[i]);
  7. end
  8. endfunction
  9. initial begin
  10. foreach(array[i]) begin
  11. $display("[BFE]array[%0d] = %0d", i, array[i]);
  12. end
  13. const_ref_array_test(array, 5);
  14. foreach(array[i]) begin
  15. $display("[AFT]array[%0d] = %0d", i, array[i]);
  16. end
  17. end
  18. endmoule

注意:

(1)当用const修饰ref之后,子函数就不能修改数组值了,如果加了修改array元素的语句,将会出现编译错误
(2)为了保护引用传递的参数不被子程序修改,const 限定符可以与ref一起使用,表示参数虽然通过引用传递,但它是一个只读变量
(3)如果引用参数使用const修饰,那么该不允许子程序修改, 子程序尝试修改时编译器报错
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/139531
推荐阅读
相关标签
  

闽ICP备14008679号