参数化任务在SystemVerilog中交换两个值

时间:2015-11-17 18:47:51

标签: swap system-verilog

我想写一个通用宽度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.

此外,调用此类任务的语法是什么?

1 个答案:

答案 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}}