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

Struct Verilog结构中的按位或所有字段,struct,bit-manipulation,verilog,system-verilog,Struct,Bit Manipulation,Verilog,System Verilog,假设我有一个总线阵列,每个总线承载一个结构,如下所示: 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

假设我有一个总线阵列,每个总线承载一个结构,如下所示:

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\u 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
参数NUM=4;//需要合并的结构数
...
int i;
总是从梳子开始
输出='0;
对于(i=0;i

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

虽然您可以使用
生成
,但您也可以在组合逻辑中使用一个简单的旧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
参数NUM=4;//需要合并的结构数
...
int i;
总是从梳子开始
输出='0;
对于(i=0;i

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

也许你想要7.12.3数组缩减方法中描述的按位或缩减方法。

assign output = rachs.or();

也许您需要7.12.3数组缩减方法中描述的按位或缩减方法

assign output = rachs.or();

我真的不明白这样做和使用generate之间的区别。你能解释一下吗?其实没什么不同,都是一样的。最大的区别在于它将如何模拟和语法。这种语法肯定比使用生成块感觉更自然。在模拟中我会看到什么样的差异?嗯,使用generate,您通常会生成一组模块或块,所有这些都是单独的进程。使用此解决方案,所有内容都在一个过程中,这意味着中间结果将不会传播。主要区别在于模拟的细节,而不是它在功能上是如何工作的。我真的不明白这样做和使用generate之间的区别。你能解释一下吗?其实没什么不同,都是一样的。最大的区别在于它将如何模拟和语法。这种语法肯定比使用生成块感觉更自然。在模拟中我会看到什么样的差异?嗯,使用generate,您通常会生成一组模块或块,所有这些都是单独的进程。使用此解决方案,所有内容都在一个过程中,这意味着中间结果将不会传播。主要的区别在于模拟的细节,而不是它在功能上是如何工作的。嗯,我从来都不知道未打包的数组缩减运算符。大多数合成工具都支持它们吗?谢谢,这很有趣。你引用的文件是什么?你能给我一个链接吗?我从来都不知道解包数组归约运算符。大多数合成工具都支持它们吗?谢谢,这很有趣。你引用的文件是什么?你能给我一个链接吗。