我想实例化一个systemverilog接口数组,其中每个数组元素使用不同的输入。
如果所有元素都使用相同的输入,则实例化很简单:
x_if x_IF[`NUM_INTERFACES](clk);
此处,如果`NUM_INTERFACES
为2
,那么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个接口的数组实现这一点。
答案 0 :(得分: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
答案 1 :(得分:0)
我能够通过从generate循环中分配接口输入并在声明中保留未分配来实现这一点。
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