按位或 Verilog 结构中的所有字段

Bitwise-or all fields in Verilog struct

假设我有一组总线,每个总线都带有一个结构,如下所示:

typedef struct packed {
    logic [31:0] piano_concerto_in_d_minor;
    logic [31:0] piano_concerto_in_c_minor;
    logic [7:0]  nationality;
} rachmaninov_t;

//.........
module russian_composers(/* input/output busses go here */);
    rachmaninov_t [2] rachs;
    rachmaninov_t     output;
    assign rachs[0] = {32'haaaa5555, 32'h10001000, 8'h33};
    assign rachs[1] = {32'h5555aaaa, 32'h80008000, 8'h44};

我想按位或将它们放在一起,我会执行以下操作:

    assign output = rachs[0] | rachs[1];
    //value of output is {32'hffffffff, 32'h90009000, 8'h77}
endmodule

现在,如果我有一个参数化数量的 rachmaninov_t 结构并且我想像上面那样按位或将它们全部放在一起,我该怎么办?我已经试过了

assign output = |rachs;

它不起作用(这并不奇怪)。

我可以得到一个 generate 块来执行此操作吗?

虽然您可以为此使用 generate,但您也可以在组合逻辑中使用普通的旧 for 循环来执行此操作:

parameter NUM = 4; // The number of structs you need to or together
...
int i;

always_comb begin 
  output = '0;
  for (i = 0; i < NUM; i = i + 1) begin
    output |= rachs[i];
  end
end

刚刚意识到这将合成一个或链;希望综合工具可以改造成更大的树或树,但我不确定是否会。

也许您需要7.12.3 数组缩减方法

中描述的按位或缩减方法
assign output = rachs.or();