SystemVerilog - 我可以将未知大小的压缩数组的解压缩数组传递给函数吗?

时间:2016-12-22 14:23:19

标签: function system-verilog

我知道我可以将未知大小的打包数组传递给函数并通过inout更改数组。 例如: 功能是:

function void foo_arr_bit (inout bit [31:0] mem, input int size, string  mem_name);
      for (int i=0; i< size(); i++)
           mem[i] = my_randomize_int(mem[i], mem_name);     
endfunction: foo_arr_bit

调用该函数:

foo_arr_bit (data_bit, 8, "data_bit");

但是我可以将未知大小的压缩数组的解压缩数组传递给函数吗? 我尝试了以下方法:

function void foo_arr_bit (int seed, inout bit [31:0] q [$], input string mem_name, int arr_size, const ref int vec_bit_siz);
      for (int i=0; i< size(); i++)
           mem[i] = my_randomize_int(mem[i], mem_name);     
endfunction: foo_arr_bit

调用该函数:

foo_arr_bit (seed, arr_vec_bit, "arr_vec_bit", t_data_bit, 9, arr_vec_b_size);

其中:

   bit [9:0]   arr_vec_bit [$];
   int arr_vec_b_size = 10;

并收到以下错误:

**错误(可抑制):( vlog-7034).. \ sv \ trx.sv(31):从类型'bit [9:'输入'bit [31:0] $ [$]'的数组赋值0] $ [$]':Ar 。 'my_randomize_array_vec_bit'的'q':元素宽度(32,10)不匹配

第32行是函数调用。

1 个答案:

答案 0 :(得分:0)

将大型数组/队列传递给期望它们修改其内容的函数时,通常使用 ref 是一种更好的做法。 (它需要更小的内存占用。)因此,使用 ref 代替 inout 应该适合您:

class foo_test();   
  bit [31:0] m_queue [$];

  function void foo_fill();
    m_queue.push_front(32'h0000_CAFE);
    foo(m_queue);   
  endfunction: foo_fill

  function void foo (ref bit [31:0] p_queue [$]);
    foreach(p_queue[i]) $display($sformatf("0x%8h", p_queue[i]));
  endfunction: foo

endclass: foo_test

顺便说一下,如果您使用队列或动态数组,可以使用 .size()函数并完全跳过size参数。