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

Syntax 在模块声明中选择接口参数,syntax,system-verilog,Syntax,System Verilog,假设我有一个参数化接口,例如 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):

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

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

如果这是顶级模块(因此没有实例化),可以做什么?SystemVerilog要求接口端口不能保持断开连接。也许您的合成工具有一种指定参数的方法。否则,您必须在模块上方创建一个包装器模块。@dave_59:也许这只是一个模拟需求?对于合成,顶部模块的接口端口可以保持未连接状态,并且不像常规端口那样实例化(至少在我的示例中是这样)。在这种情况下,将使用默认参数值。