包装数组

时间:2017-03-23 16:22:52

标签: arrays verilog system-verilog register-transfer-level

我正在使用用于绑定参数化模块的interfaces数组 我的问题是我无法将几个简单的接口直接连接到接口数组中。

这是我使用的界面的简易版本:

interface channel ();
  wire req;
  wire ack;
  modport in (input req output ack);
  modport out(input ack output req);
endinterface

我想做的是:

Channel array[2]();
Channel elem0();
Channel elem1();

"assign" array = '{elem0,elem1};

我找到了一种解决方法,使用一个独立分配每根线的模块:

module passthrough (Channel.in from, Channel.out to );
  assign to.req   = from.req;
  assign from.ack = to.ack;
endmodule

使用它,我必须'施放'每个成员元素进入每个数组成员。使用前面的例子:

 passthrough pass0( .from(elem0), .to(array[0]));
 passthrough pass1( .from(elem1), .to(array[1]));

我不喜欢它,因为使用参数化模块的主要想法是使我的RTL更清晰,更短和可维护。

我自然会将此passthrough模块的实例化放在宏中,但仍然不满意。

然后我偶然发现了接口中嵌入的任务。虽然我不太熟悉(S)Verilog中的任务,所以我认为我的想法不会起作用。然而,这是我尝试过的:

interface channel ();
  reg req;
  reg ack;
  modport in (input req output ack);
  modport out(input ack output req);

  task wrap_from (Channel.in I);
    always@* begin
      req = I.req;
      I.ack = ack;
    end
  endtask
endinterface

这种方法的优点是每次我需要连接2个通道时都不需要创建模块。代码行也会更短。

不幸的是,我的编译器(ncsim)无法将channel识别为其自己的声明中的接口(我想它需要endinterface关键字在命名空间中考虑它。)

如果有人比我更清洁而不是解决这个问题,我将非常感激。

最后一件事,一切都需要合成。

1 个答案:

答案 0 :(得分:0)

我正在努力解开为什么要展开一系列接口。为什么elem0和elem1甚至存在?如建议的那样,没有办法相互“分配”接口。我的建议是到处使用Channel数组[2]。您可以绑定到每个实例,并可以将每个实例连接到模块。也许如果你分享到你想要连接的内容,我可以提供更多帮助吗?

我怀疑模块任务是否可以合成。这对我来说似乎是个死胡同。