Array Referencing & Copying

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];