假设我有一个模块,其中包含N
位的输入和一个实例化的位,如下所示:
module foo (
input wire [N-1:0] x,
input wire y
);
foo u__foo (
.x(x),
.y(x == something)
);
我想将其中的M
实例化为向量,并连接一个M*N
位的导线,我知道我可以这样做:
wire [M*N-1:0] x;
foo u__foo [M-1:0] (
.x(x)
)
但是我想对N
线的每个M*N
位进行逻辑运算,并将其也作为输入进行挂钩,我知道我可以通过使用generate语句来做到这一点: / p>
genvar i;
generate
for (i = 0; i < M; i = i + 1) begin
foo u__foo (
.x(x[i*N +: N]),
.y(x[i*N +: N] == something)
)
end
endgenerate
或者通过循环计算并将其连接起来:
reg [M-1:0] y;
always @* begin
for (i = 0; i < M; i = i + 1) begin
y[i] = x[i*N +: N] == something;
end
end
foo u__foo [M-1:0] (
.x(x),
.y(y)
)
我也知道我可以在foo
内添加一个新的输入并进行比较,但是我不能修改foo
。
是否存在语法糖,这意味着我可以更简洁地执行此操作,因此无需创建循环,该工具将自动拆分总线并对每N
位执行一次操作?我试图防止我的代码变得不必要。如果有仅SystemVerilog的解决方案,那么只要可综合,该解决方案也能正常工作。
foo u_foo [M-1:0] (
.x(x),
.y(x[N-1:0] == something)
)
谢谢!
答案 0 :(得分:0)
不。您可以使用流运算符来操作位排序,但是我认为generate
循环是您的最佳选择。