假设我有一个带有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语句来实现:
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)
)
提前致谢!
不可以。您可以使用流媒体操作符来操作位排序,但我认为generate
循环是您的最佳选择。