Function SystemVerilog-我可以将打包数组的未打包数组的未知大小传递给函数吗?

Function SystemVerilog-我可以将打包数组的未打包数组的未知大小传递给函数吗?,function,system-verilog,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_

我知道我可以将未知大小的压缩数组传递给函数,并通过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
但我可以将压缩数组的未压缩数组的未知大小传递给函数吗? 我尝试了以下方法:

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
其中:

   bit [9:0]   arr_vec_bit [$];
   int arr_vec_b_size = 10;
并得到以下错误:

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


其中第32行是函数调用。

通常,当您将大型数组/队列传递给希望修改其内容的函数时,最好使用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参数

   bit [9:0]   arr_vec_bit [$];
   int arr_vec_b_size = 10;
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