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