module tb;
bit [3:0][7:0] arr_mixed [1:0];//低维度的[3:0][7:0]是合并数组,但高维度的[1:0]则是散开放的。合并型数组可以实现连续的存储,赋值时不需要用 '{ }。
logic [15:0] vec16;//合并数组,
logic [31:0] vec32;
logic [63:0] vec64;
bit arr_unpacked [1:0][3:0][7:0];//三个维度都是非合并的,[3:0][7:0]低维度。非合并数组和动态数组直接赋值都需要 ’
//非合并可以直接bit arr_unpacked [2][4][8];
bit arr_unpacked_d2 [4][8];
//bit arr_unpacked [2][4][8];
bit [1:0][3:0][7:0] arr_packed;
initial begin: arr_assign
$display("packed vector/arry assignment");
vec16 = 16'hFFFF; xdisplay("vec16", vec16);
vec16 = '1; xdisplay("vec16", vec16);
vec16 = {4{4'hF}}; xdisplay("vec16", vec16);
vec32 = vec16; xdisplay("vec32", vec32);
vec32 = 'hFF;xdisplay("vec32", vec32);
vec64 = {vec32, vec32};xdisplay("vec64", vec64);
$display("packed array slice assignment");
arr_mixed[0] = vec32; xdisplay("arr_mixed[0]", arr_mixed[0]);
arr_mixed[1] = vec64; xdisplay("arr_mixed[1]", arr_mixed[1]);
arr_packed[0] = arr_mixed[1];xdisplay("arr_packed[0]", arr_packed[1]);
// Errors below
// arr_packed = arr_mixed;
// arr_unpacked = arr_mixed;
$display("unpacked array slice assignment");
arr_unpacked_d2 = '{0:'{0:0, 1:0, default:1}, 1:'{0:1, 1:1, default:0}, default:'{default:1}};//0:'{ 的0是4*8的4:0中的第0位置,剩下默认的3 4位置全部置为1
//0:0意思是第0位置赋值为0,1:0第1位置赋值0,default:1剩下位置赋值1,4*8一定要写够四个花括号,不然报错
//arr_unpacked_d2 = '{'{0:0, 1:0, default:1}, '{0:1, 1:1, default:0}, '{0:0, 1:0, default:1}, '{0:1, 1:1, default:0}};
//arr_unpacked_d2[0] = '{default:1};
arr_unpacked[0] = arr_unpacked_d2;
#1ns $finish();
end
function void xdisplay(string s, logic[63:0] val);
$display("%s = 'h%x", s, val);
endfunction
endmodule