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

choose interface parameters in module declaration

假设我有一个参数化接口,例如

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

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

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

但出现错误:

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

当前的 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

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

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

   assign out = in.data;
endmodule          

上面的if语句不是过程语句,是generate-if