让我们说我有一系列总线,每个总线都带有这样的结构:
@"{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;
阻止这样做吗?
答案 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();