Function SystemVerilog-我可以将打包数组的未打包数组的未知大小传递给函数吗?
我知道我可以将未知大小的压缩数组传递给函数,并通过inout更改数组。 例如: 功能是: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_
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