我想写一个通用宽度swap
,但我不确定语法应该是什么。
我的第一个猜测:
task automatic swap #( int W=1 ) ( ref logic [W-1:0] a, ref logic [W-1:0] b );
begin
automatic logic[W-1:0] temp=a; a=b; b=temp;
end endtask
但我收到以下错误(来自Cadence irun):
ncvlog: *E,SVNOCS: Class specialization syntax not allowed in method name for out-of-block method declaration.
此外,调用此类任务的语法是什么?
答案 0 :(得分:2)
任务和功能不能有自己的参数。您可以通过在参数化类中声明静态方法来实现相同的效果。通过使参数成为数据类型而不是位宽,可以使方法更通用。例如:
generic#(logic[4:0])::swap( my_a, my_b);
generic#(int)::swap( my_int_a, my_int_b);
generic#(my_struct_st)::swap( my_struct_a, my_struct_b);
generic#(my_class)::swap( my_class_a, my_class_b);
generic#(virtural my_interface)::swap( my_if_a, my_if_b);
然后在代码的某处,您可以这样做:
{{1}}