Modos de selección:
- Bit-select: selección de 1 bit
- Part-select: selección de bits contiguos de una única dimensión de tipo packed
- Slice: selección de elementos contiguos de un array
Unpacked arrays
byte byarr [0:15]; // 16 non-contiguous
bytes byte byarr2 [16:1] = byarr; // OK
logic b = byarr[8][3]; // bit-select: bit 3 of byte 8 byte bysl[2] = byarr[5:6]; // 2-byte slice
byte by8 = byarr[8]; // 8-bit slice
logic [2:0] ps = byarr[11][2:0]; // part-select
Packed arrays
logic [3:0] [7:0] data; // 32-bit vector with 4 byte subfields
bit [0:31] pdata = data; // 32-bit vector, no subfields
logic sign = data[3][7]; // bit-select
logic [3:0] nib = data[0][7:4]; // part-select
byte high_byte = data[3]; // 8-bit slice
logic [1:0] [7:0] word = data[2:1]; // 2 byte slices, 2 subfields
shortint si = data[3:2]; // 16-bit signed integer
Cuando se accede a un rango de índices (una porción) de una matriz SystemVerilog, se puede especificar una porción variable usando las notaciones[start+:increment width] y[startt-:decrement width]. El ancho de incremento/disminución debe ser una constante.
bit signed [31:0] busA [7:0]; // unpacked array of 8 32-bit vectors
int busB [1:0]; // unpacked array of 2 integers
busB = busA[7:6]; // select a 2-vector slice from busA
busB = busA[6+:2]; // equivalent to busA[7:6];
busB = busA[6-:2]; // equivalent to busA[6:5];