我试图将2D打包数组选择为一维矢量。我认为打包的数组是连续存储的,因此可以被视为一维向量。但是以这种方式访问阵列是违法的还是我忽略了什么?
我有几个例子,这种方式分配多维数组没有警告。但看起来不允许以这种方式访问它们。
请看一下这段代码,看看我的意思。代码运行时arr
显示X
个值。我本地计算机上的Questa和Aldec on EDA Playground都报告超出范围警告。
// Code your testbench here
// or browse Examples
module tb;
logic [2:0][7:0] TEMP = {{8'h22},{8'h11},{8'h00}};
logic [11:0] arr;
bit clk;
initial begin
#30 $finish;
end
initial begin
forever clk = #5 ~clk;
end
always_ff@(posedge clk)
begin
arr <= TEMP[12+:12]; //warns and doesn't work
//arr <= TEMP[0+:12]; //warns but works!!
TEMP[2:1] <= TEMP[1:0];
TEMP[0] <= TEMP[2];
end
always_ff@(posedge clk)
begin
$display("arr : %h", arr);
$display("TEMP[0] : %h",TEMP[0]);
$display("TEMP[1] : %h",TEMP[1]);
$display("TEMP[2] : %h",TEMP[2]);
end
endmodule
答案 0 :(得分:1)
如果声明一个二维打包数组,但只选择一个维度,即引用第一个维度,就像解压缩数组一样。打包数组与1-d打包数组兼容,但您仍需要提供正确的数组索引。
您可以通过多种方式将二维阵列作为一维阵列进行访问。
您可以使用连接的部件选择
arr = {TEMP}[0+:12];
arr = s.
您可以在打包结构中声明打包的数组。然后将整个结构视为一维阵列。
struct packed {logic [2:0][7:0] TEMP;} s = {{8'h22},{8'h11},{8'h00}};
arr = s[0+:12};
arr = s.TEMP[0]; // if you want to access the array
还有一个压缩联合,它为您提供了多种方式来访问相同的压缩1-D数组
union packed {
logic [2:0][7:0] TEMP;
logic [5:0][3:0] NIB;
} u = {{8'h22},{8'h11},{8'h00}};
arr = u[0+:12];
arr = u.NIB[2:0];// also 12 bits
答案 1 :(得分:0)
将TEMP
定义为
logic [2:0][7:0] TEMP
您正在声明2D打包数组。外部尺寸有3个元素;内部维度有8个元素。
由于它是打包数组,您还可以将其视为24位数字。但是,当您索引TEMP
时,您正在索引外部维度。因此,TEMP[12]
是外部维度的元素12。但是外部维度没有元素12(元素编号为2:0)。因此,您会收到警告以及X
。 (与Verilog中的情况一样)当您索引超出范围的元素时,将返回该类型的默认值,在这种情况下,类型为logic
,是X
。
所以,当你说
时 arr <= TEMP[12+:12]; //warns and doesn't work
您要将arr
设置为TEMP
的元素23:12。所有这些元素都超出了范围,所以你得到X
s(它“不起作用”)。但是,当你说
arr <= TEMP[0+:12]; //warns but works!!
您将arr
设置为TEMP
的元素11:0。元素2:0在范围内,因此返回TEMP
的实际值,但元素11:3超出范围,因此返回X
s。但是,由于这是一个打包数组,arr
设置为96'hXXXXXXXXX210
(或其他),而arr
为12位宽,所有X
都被截断,所以你的代码“有效”。