Struct Verilog强制对结构进行打包
我在一个模块中声明了一个结构,如下所示:Struct Verilog强制对结构进行打包,struct,verilog,system-verilog,Struct,Verilog,System Verilog,我在一个模块中声明了一个结构,如下所示: module myModule; struct { logic a; logic b; logic [A - 1:0] c[0:B - 1]; logic [C - 1:0] d; } [D - 1:0] e [0:E - 1][0:F - 1]; endmodule 我想使用c作为未打包的数组,但Verilog不允许这样做。它在定义了c的行上抛出一个错误: Unsupported: Unpacked arr
module myModule;
struct {
logic a;
logic b;
logic [A - 1:0] c[0:B - 1];
logic [C - 1:0] d;
} [D - 1:0] e [0:E - 1][0:F - 1];
endmodule
我想使用c
作为未打包的数组,但Verilog不允许这样做。它在定义了c
的行上抛出一个错误:
Unsupported: Unpacked array in packed struct/union
有办法解决这个问题吗?为了有一个压缩数组,所有元素都必须压缩。因此,要么将结构打包:
struct packed {
logic a;
logic b;
logic [A - 1:0] [0:B - 1] c;
logic [C - 1:0] d;
} [D - 1:0] e [0:E - 1][0:F - 1];
或者将e阵列全部解包
struct {
logic a;
logic b;
logic [A - 1:0] [0:B - 1] c;
logic [C - 1:0] d;
} e [0:E - 1][0:F - 1][D - 1:0];
顺便说一句,强烈建议对结构使用
typedef
,而不是使用匿名结构类型。为了拥有压缩数组,必须压缩所有元素。因此,要么将结构打包:
struct packed {
logic a;
logic b;
logic [A - 1:0] [0:B - 1] c;
logic [C - 1:0] d;
} [D - 1:0] e [0:E - 1][0:F - 1];
或者将e阵列全部解包
struct {
logic a;
logic b;
logic [A - 1:0] [0:B - 1] c;
logic [C - 1:0] d;
} e [0:E - 1][0:F - 1][D - 1:0];
顺便说一句,强烈建议对结构使用
typedef
,而不是匿名结构类型。由于c
是一个未打包的变量,因此不能使用SV的packed
结构。以下操作将起作用:typedef结构压缩{logic a;logic b;logic[a-1:0]c[0:b-1];logic[c--1:0]d;}mystruct;我的结构e[0:e-1][0:F-1]
注意,e
不应该有压缩维度,因为它是一个结构变量数组。因为c
是一个未压缩变量,所以不能使用SV的packed
结构。以下操作将起作用:typedef结构压缩{logic a;logic b;logic[a-1:0]c[0:b-1];logic[c--1:0]d;}mystruct;我的结构e[0:e-1][0:F-1]
注意,e
不应该有压缩维度,因为它是一个结构变量数组。谢谢。解决方案是将结构标记为已打包,并将e数组解包。我还为结构添加了一个typedef。如果结构只是一个项目,如何解决这个问题<代码>结构{…}e?@Moberg如果struct
有一个项目,则原始问题的答案不会改变。(就像元素c
)@dave_59我指的是e
根本不是数组的情况,例如:isstruct{logic[A-1:0]c[0:B-1];}e代码>法律?我得到了一个相同措辞的错误,但在我的情况下,可能只是Verilator根本不支持结构中的解包数组。解包结构可以包含任何类型。谢谢。解决方案是将结构标记为已打包,并将e数组解包。我还为结构添加了一个typedef。如果结构只是一个项目,如何解决这个问题<代码>结构{…}e
?@Moberg如果struct
有一个项目,则原始问题的答案不会改变。(就像元素c
)@dave_59我指的是e
根本不是数组的情况,例如:isstruct{logic[A-1:0]c[0:B-1];}e代码>法律?我得到了一个相同措辞的错误,但在我的例子中,可能只是Verilator根本不支持结构中的解包数组。解包结构可以包含任何类型。