SystemVerilog 打包数组的行或列主要用于文字赋值吗?
Are SystemVerilog packed arrays row or column major for literal assignment?
我想对我打算合成的一些 SystemVerilog 代码使用多维数组。我的理解是,打包数组本质上是一个大向量,可以在代码中对切片或元素进行索引。
那么,是否允许以下内容?
logic [4:0] [2][2] my_array;
assign my_array = '{ 4'd1, 4'd2, 4'd3, 4'd4 };
如果是,文字解释为行或列主要吗?我知道我可以手动将文字分成与 2x2 数组匹配的层次结构,但这些模块将在高级语言的自动生成代码中实例化。我想定位我的数组,使其与高级语言的列主要方向相匹配。
您的代码有几个问题。不允许使用单个数字范围 [2]
,1800-2023 LRM 将更明确地说明为什么不允许这样做。一些工具允许这样做,但以大多数人对打包范围的期望的反向字节顺序实现范围。
如果您想要一个 2 行 3 列 5 位的 3 维压缩数组,您可以使用
logic [0:1][0:2][4:0] my_array;
最后,打包数组没有类型安全性。在编写文字串联时,如果元素数量错误或元素大小错误,则会出现无声截断或位填充。如果你有以下
logic [0:1][0:2][4:0] my_array;
my_array = {4'd1,4'd2,4'd3, 4'd4,4'd5,4'd6};
# my_array is '{'{5'h00, 5'h01, 5'h04}, '{5'h0d, 5'h02, 5'h16}}
你需要写成
my_array = {5'd1,5'd2,5'd3, 5'd4,5'd5,5'd6};
我想对我打算合成的一些 SystemVerilog 代码使用多维数组。我的理解是,打包数组本质上是一个大向量,可以在代码中对切片或元素进行索引。
那么,是否允许以下内容?
logic [4:0] [2][2] my_array;
assign my_array = '{ 4'd1, 4'd2, 4'd3, 4'd4 };
如果是,文字解释为行或列主要吗?我知道我可以手动将文字分成与 2x2 数组匹配的层次结构,但这些模块将在高级语言的自动生成代码中实例化。我想定位我的数组,使其与高级语言的列主要方向相匹配。
您的代码有几个问题。不允许使用单个数字范围 [2]
,1800-2023 LRM 将更明确地说明为什么不允许这样做。一些工具允许这样做,但以大多数人对打包范围的期望的反向字节顺序实现范围。
如果您想要一个 2 行 3 列 5 位的 3 维压缩数组,您可以使用
logic [0:1][0:2][4:0] my_array;
最后,打包数组没有类型安全性。在编写文字串联时,如果元素数量错误或元素大小错误,则会出现无声截断或位填充。如果你有以下
logic [0:1][0:2][4:0] my_array;
my_array = {4'd1,4'd2,4'd3, 4'd4,4'd5,4'd6};
# my_array is '{'{5'h00, 5'h01, 5'h04}, '{5'h0d, 5'h02, 5'h16}}
你需要写成
my_array = {5'd1,5'd2,5'd3, 5'd4,5'd5,5'd6};