使用SystemVerilog内部工作的新发现,我已经开始着手使用其中一个fandangled pass-by-reference功能来更新另一个类的构造函数中的类计数器。设置(剥离基础)看起来像这样:
class my_queue;
int unsigned num_items; //Want to track the number of items this Queue has seen.
function push_new_item();
item new_item = new(num_items);
endfunction
endclass
class parent_item;
int unsigned x_th_item;
function new(ref int unsigned num_items);
x_th_item = num_items;
num_items += 1; //This should increase the counter in num_items.
endfunction
endclass
class item extends parent_item;
function new(ref int unsigned num_items);
super.new(num_items);
endfunction
endclass
问题是我的编译器抱怨
Illegal connection to the ref port 'num_items' of function/task parent_item::new, formal argument should have same type as actual argument.
我知道如何解决这个问题:在push_new_items中调用new()之后移动增量。
但是后来我仍然不知道如何在SV中正确使用pass-by-refrence,导致错误的原因是什么?
它是另一个传递引用还是语法错误?
答案 0 :(得分:1)
您不需要 ref 语义,请使用 inout 参数。 inout 在进入时被复制并在返回任务或功能时被复制出来。正如您在 ref 参数中看到的那样,类型兼容性要求更加严格。
您必须使用 ref 参数的唯一场合是耗时的任务,您需要在任务返回之前查看对参数的活动更新。
task my_task(ref bit tclock);
@(posedge tclock) // this would hang if tclock was an input
endtask
当参数类型是像数组这样的大对象时,您可能想要使用ref参数的另一个地方是优化。但是通过引用传递单个int实际上比直接复制它的值慢。
答案 1 :(得分:0)
function new(ref int num_items);
应该是
function new(ref int unsigned num_items);
谢谢你。