我正在使用用于绑定参数化模块的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
关键字在命名空间中考虑它。)
如果有人比我更清洁而不是解决这个问题,我将非常感激。
最后一件事,一切都需要合成。
答案 0 :(得分:0)
我正在努力解开为什么要展开一系列接口。为什么elem0和elem1甚至存在?如建议的那样,没有办法相互“分配”接口。我的建议是到处使用Channel数组[2]。您可以绑定到每个实例,并可以将每个实例连接到模块。也许如果你分享到你想要连接的内容,我可以提供更多帮助吗?
我怀疑模块任务是否可以合成。这对我来说似乎是个死胡同。