【问题标题】:How to do a logical operation per instance in a vector of instances如何在实例向量中对每个实例进行逻辑操作
【发布时间】: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 运算符 {}

标签: verilog system-verilog


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2012-06-30
    • 2020-04-11
    相关资源
    最近更新 更多