【发布时间】:2019-04-10 16:26:01
【问题描述】:
假设我有一个输入为 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)
)
但我想对M*N 线的每个N 位进行逻辑运算并将其连接为输入,我知道我可以通过使用生成语句来做到这一点:
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)
)
提前致谢!
【问题讨论】:
-
在这种情况下,唯一想到的语法糖是 something(或类似的打包结构)的 concat 运算符
{}。