我正在尝试部分选择 2D 打包数组作为 1D 向量。我认为打包数组是连续存储的,因此可以被视为一维向量。但是以这种方式访问数组是非法的还是我忽略了某些东西?
我有一些示例,其中以这种方式分配多维数组可以在没有警告的情况下工作。但看起来不允许以这种方式访问它们。
请看一下这段代码,看看我的意思。当代码运行时,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
最佳答案
如果声明一个二维压缩数组,但只选择一个维度,即指第一个维度,就像未压缩数组一样。压缩数组与一维压缩数组的赋值兼容,但您仍然需要提供正确的数组索引。
您可以执行多种操作来将二维数组作为一维数组进行访问。
您可以使用串联的部分选择
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
还有一个压缩联合,它为您提供了访问相同压缩一维数组的多种方式
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
关于arrays - 部分选择多维 systemverilog 数组作为 1D 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49553662/