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

时间:2015-10-28 20:20:10

标签: struct bit-manipulation verilog system-verilog

让我们说我有一系列总线,每个总线都带有这样的结构:

@"{EnemyMove\s+X:(?<X>\d+)\s+Y:(?<Y>\d+)"

我想按位或者他们在一起,我会做以下事情:

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; 阻止这样做吗?

2 个答案:

答案 0 :(得分:3)

虽然您可以使用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

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

答案 1 :(得分:3)

也许你想要 7.12.3阵列缩减方法

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