按位或 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();
假设我有一组总线,每个总线都带有一个结构,如下所示:
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();