我知道我可以将未知大小的打包数组传递给函数并通过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行是函数调用。
答案 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参数。