如何在实例向量中对每个实例执行逻辑操作

时间:2019-04-10 16:26:02

标签: verilog system-verilog

假设我有一个模块,其中包含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)
)

谢谢!

1 个答案:

答案 0 :(得分:0)

不。您可以使用流运算符来操作位排序,但是我认为generate循环是您的最佳选择。