【问题标题】:Array of systemverilog interfaces with different inputs具有不同输入的 systemverilog 接口阵列
【发布时间】:2014-12-01 15:05:52
【问题描述】:

我想实例化一个 systemverilog 接口数组,其中每个数组元素使用不同的输入。

如果所有元素都使用相同的输入,那么实例化很简单:

x_if x_IF[`NUM_INTERFACES](clk);

这里,如果`NUM_INTERFACES2,那么clk 输入会同时发送到x_IF[0]x_IF[1]

但如果我也有

reg clk[`NUM_INTERFACES];

如何实例化x_IF,以便clk[0] 输入到x_IF[0]clk[1] 输入到x_IF[1]

这是一个简单的例子;我期待在某种循环中(可能使用generate)为一组 12 个接口实现这一点。

【问题讨论】:

  • 如果您使用generate 循环来实现它,您将不会有一个数组,而是有12 个不同的实例,每个实例都在自己的范围内。
  • 没错,这就是为什么我想知道如何在循环中完成这项工作。终于有了解决办法;我在声明中未连接接口输入,后来在生成循环中为它们分配了值。

标签: arrays interface system-verilog


【解决方案1】:

我会避免使用assign 语句,尤其是分层引用;它使代码更难阅读和维护。

你本来可以做的

reg clk[`NUM_INTERFACES];
x_if x_IF[`NUM_INTERFACES](clk);

实例数组的一个特点是,如果连接到端口的信号宽度是端口宽度的倍数,则每个实例都会获得信号的一部分。

参见LRM 1800-2012 部分28.3.6 原始实例连接列表,它也适用于模块端口。

如果您使用生成循环而不是实例数组,那么我会这样做

reg  clk[`NUM_INTERFACES];

generate
   for (genvar i=0; i<`NUM_INTERFACES; i++) begin :loop
      x_if x_IF(clk[i]);
   end
endgenerate

【讨论】:

  • 您的意思是x_if x_IF[i](clk[i]);?即使那样,这不会创建多个增量长度最多为 NUM_INTERFACES 的接口数组吗?还是因为(clk[i])而起作用?
  • 不,我不是那个意思。 generate for 循环的每次迭代都会创建一个名为 loop[i].x_IF 的实例,因为名为 loop 的开始块将被详细说明为循环 [0]、循环 [1] 等。
  • 感谢您的解释。我不知道使用 loop[i] 引用信号的能力。
  • 请注意,如果 i 是 genvar 或常量,您只能引用 loop[i]。
【解决方案2】:

我能够通过从生成循环内部分配接口输入并在声明中不分配它们来实现这一点。

x_if x_IF[`NUM_INTERFACES]();
reg  clk[`NUM_INTERFACES];

// Code to create clk[`NUM_INTERFACES]

generate
   for (genvar i=0; i<`NUM_INTERFACES; i++) begin
      // Assume that the input port of x_if is called `inp`
      assign x_IF[i].inp = clk[i];
   end
endgenerate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多