在模块声明中选择接口参数

Dan*_*ner 4 syntax system-verilog

假设我有一个参数化界面,例如

interface Foo;
    parameter WIDTH=8;
    logic [WIDTH-1:0]data;
endinterface
Run Code Online (Sandbox Code Playgroud)

现在我想在模块中使用宽度为(例如)16的这些接口之一.我怎样才能做到这一点?我试过了

module foo(Foo #(.WIDTH(16)) in, output logic [15:0]out);
    assign out=in.data;
endmodule
Run Code Online (Sandbox Code Playgroud)

但得到一个错误:

Error (10170): Verilog HDL syntax error at test.sv(6) near text "#";  expecting ")"
Run Code Online (Sandbox Code Playgroud)

dav*_*_59 5

当前的SystemVerilog语法BNF不允许您指定接口端口的参数特化.它将从连接到端口的实例获取参数化

module foo(Foo in, output logic [in.WIDTH-1:0] out);
   assign out = in.data;
endmodule          

interface Foo #(
    parameter WIDTH=8
          );
    logic [WIDTH-1:0]data;
endinterface : Foo

module top;
   Foo#(.WIDTH(16)) f();
   logic [15:0] o;
   foo dut(f,o);
endmodule : top
Run Code Online (Sandbox Code Playgroud)

您可以对特定参数化进行详细检查,如果检查失败,将会产生编译错误

module foo(Foo in, output logic [in.WIDTH-1:0] out);
   if (in.WIDTH != 16) $error("Width not 16");

   assign out = in.data;
endmodule          
Run Code Online (Sandbox Code Playgroud)

if上面的陈述不是程序性陈述,而是一个generate-if