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

parameterized task to swap two values in SystemVerilog

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

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

任务和函数不能有自己的参数。您可以通过在参数化 class 中声明静态方法来实现相同的效果。通过使参数成为数据类型而不是位宽,可以使这些方法更通用。示例:

class generic #(type T=logic);
  // Note: you may want to replace 'ref' with 'inout'
  static function void swap( ref T a, b );
    {b,a} = {a,b};
  endfunction
endclass

然后在您的代码中的某处,您可以这样做:

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);