带参数的系统verolog接口

System verolog interface with parameters

我正在尝试构建一个接口来连接两个模块。接口格式如下:

interface my_if #( 
    parameter H_WIDTH = 64,
    parameter L_WIDTH = 8
);
logic [H_WIDTH -1:0]  a;
logic [L_WIDTH -1:0]  b;
logic                 ready;
modport in ( input a, input b, output valid);
modport out( output a, output b, input ready);
endinterface;

我需要用这个接口连接两个模块,而我每次连接都有不同的地址和索引参数(例如,3个my_if接口连接我的两个模块,但每个都有不同的地址和索引参数)。我怎样才能使这项工作?

对包装器模块使用最大占用空间方法。实例化每个需要在其自己的包装器中连接的模块,该包装器使用该接口创建多个端口。以设计中使用的最大尺寸参数化每个接口。使用另一组参数(与接口无关)指定 my_module_x 的每个包装器内所需的向量大小(如总线开膛手)。该设计由 my_module_1、my_module_2、my_wrapper_1、my_wrapper_2 组成。包装器模块使用接口样式端口,non-wrapper 模块(在包装器中实例化)不使用接口端口(它们使用参数化向量样式端口)。每个 my_module_x (non-wrapper) 都有一个唯一的参数化来访问接口中最大大小 signal-vector 的唯一切片。对于每个模块 my_module_x 在 my_wrapper_x.

中实例化

将与此相关的所有参数化放入 SV 包中,将包导入所有相关模块,以便在设计(包)中的一个位置控制尺寸。

这种方法有开销,它可能会为您的设计付出代价,其中有多个相关但不完全相同的模块共享相同的接口,但大小不同。

你的问题听起来像是你有两个模块,它们通过 3 个不同参数的接口连接。如果我猜对了,答案就很简单了。

  1. 要使用任何接口连接模块,必须使用不同的正确参数实例化:
my_if #(64, 8) if64_8;
my_if #(32,4) if32_4;
my_if #(16,2) if16_2;

现在必须使用模块来处理接口

module m1(my_if in1, my_if in2, my_if in3);
 // ...
endmodule
module m2(my_if out1, my_if out2, my_if out3);
  // ...
endmodule

你可以连接它们:

  m1 m1 (if64_8.in, if32_4.in, if16_2.in);
  m2 m2 (if64_8.out, if32_4.out, if16_2.out);

这是一个可编译的例子

interface my_if #( 
    parameter H_WIDTH = 64,
    parameter L_WIDTH = 8
);
logic [H_WIDTH -1:0]  a;
logic [L_WIDTH -1:0]  b;
logic valid;
logic ready;
modport in ( input a, input b, output valid);
modport out( output a, output b, input ready);
endinterface

module top;
  my_if #(64, 8) if64_8();
  my_if #(32,4) if32_4();
  my_if #(16,2) if16_2();

  m1 m1 (if64_8.in, if32_4.in, if16_2.in);
  m2 m2 (if64_8.out, if32_4.out, if16_2.out);
endmodule

module m1(my_if in1, my_if in2, my_if in3);
  // ...
  initial begin
    $display("%0d, %0d, %0d", $bits(in1.a), $bits(in2.a), $bits(in3.a));
  end
endmodule
module m2(my_if out1, my_if out2, my_if out3);
  // ...
endmodule

$display 语句显示信号的宽度对于每个不同的'in'都是不同的。