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,您通常会生成一组模块或块,所有这些都是单独的进程。使用此解决方案,所有内容都在一个过程中,这意味着中间结果将不会传播。主要的区别在于模拟的细节,而不是它在功能上是如何工作的。嗯,我从来都不知道未打包的数组缩减运算符。大多数合成工具都支持它们吗?谢谢,这很有趣。你引用的文件是什么?你能给我一个链接吗?我从来都不知道解包数组归约运算符。大多数合成工具都支持它们吗?谢谢,这很有趣。你引用的文件是什么?你能给我一个链接吗。