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
1 2 3 4 5 |
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
1 2 3 4 5 6 7 |
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.
1 2 3 4 5 |
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]; |