SystemVerilog Unpacked Arrays

An unpacked array is used to refer to dimensions declared after the variable name.

Unpacked arrays may be fixed-size arrays, dynamic arrays, associative arrays or queues.

Single Dimensional Unpacked Array

 module tb; byte stack [8]; // depth = 8, 1 byte wide variable initial begin // Assign random values to each slot of the stack foreach (stack[i]) begin stack[i] = $random; $display ("Assign 0x%0h to index %0d", stack[i], i); end // Print contents of the stack $display ("stack = %p", stack); end endmodule 
Simulation Log Assign 0x24 to index 0 Assign 0x81 to index 1 Assign 0x9 to index 2 Assign 0x63 to index 3 Assign 0xd to index 4 Assign 0x8d to index 5 Assign 0x65 to index 6 Assign 0x12 to index 7 stack = '

Multidimensional Unpacked Array

 module tb; byte stack [2][4]; // 2 rows, 4 cols initial begin // Assign random values to each slot of the stack foreach (stack[i]) foreach (stack[i][j]) begin stack[i][j] = $random; $display ("stack[%0d][%0d] = 0x%0h", i, j, stack[i][j]); end // Print contents of the stack $display ("stack = %p", stack); end endmodule 
Simulation Log
ncsim> run stack[0][0] = 0x24 stack[0][1] = 0x81 stack[0][2] = 0x9 stack[0][3] = 0x63 stack[1][0] = 0xd stack[1][1] = 0x8d stack[1][2] = 0x65 stack[1][3] = 0x12 stack = ', '> ncsim: *W,RNQUIE: Simulation is complete.

Packed + Unpacked Array

The example shown below illustrates a multidimensional packed + unpacked array.

 module tb; bit [3:0][7:0] stack [2][4]; // 2 rows, 4 cols initial begin // Assign random values to each slot of the stack foreach (stack[i]) foreach (stack[i][j]) begin stack[i][j] = $random; $display ("stack[%0d][%0d] = 0x%0h", i, j, stack[i][j]); end // Print contents of the stack $display ("stack = %p", stack); // Print content of a given index $display("stack[0][0][2] = 0x%0h", stack[0][0][2]); end endmodule 
Simulation Log
ncsim> run stack[0][0] = 0x12153524 stack[0][1] = 0xc0895e81 stack[0][2] = 0x8484d609 stack[0][3] = 0xb1f05663 stack[1][0] = 0x6b97b0d stack[1][1] = 0x46df998d stack[1][2] = 0xb2c28465 stack[1][3] = 0x89375212 stack = ', '> stack[0][0][2] = 0x15 ncsim: *W,RNQUIE: Simulation is complete.

In a multidimensional declaration, the dimensions declared before the name vary more faster than the dimensions following the name.

 bit [1:4] m_var [1:5] // 1:4 varies faster than 1:5 bit m_var2 [1:5] [1:3] // 1:3 varies faster than 1:5 bit [1:3] [1:7] m_var3; // 1:7 varies faster than 1:3 bit [1:3] [1:2] m_var4 [1:7] [0:2] // 1:2 varies most rapidly, followed by 1:3, then 0:2 and then 1:7