¿Qué es `+:` y `-:`?

Recientemente vi este operador en un código verilog / systemverilog.

logic [15:0] down_vect; logic [0:15] up_vect; down_vect[lsb_base_expr +: width_expr] up_vect [msb_base_expr +: width_expr] down_vect[msb_base_expr -: width_expr] up_vect [lsb_base_expr -: width_expr] 

Raramente he visto esto, me gustaría preguntar ¿Qué es esto? ¿Cuándo y cómo lo usas?

Esa syntax particular se llama selección de parte indexada . Es muy útil cuando necesita seleccionar un número fijo de bits desde un desplazamiento variable dentro de un registro de varios bits.

Aquí hay un ejemplo de la syntax:

 reg [31:0] dword; reg [7:0] byte0; reg [7:0] byte1; reg [7:0] byte2; reg [7:0] byte3; assign byte0 = dword[0 +: 8]; // Same as dword[7:0] assign byte1 = dword[8 +: 8]; // Same as dword[15:8] assign byte2 = dword[16 +: 8]; // Same as dword[23:16] assign byte3 = dword[24 +: 8]; // Same as dword[31:24] 

La mayor ventaja con esta syntax es que puede usar una variable para el índice. Las partes normales seleccionadas en Verilog requieren constantes. Por lo tanto, intentar lo anterior con algo como dword[i+7:i] no está permitido.

Entonces, si desea seleccionar un byte particular utilizando una selección de variable, puede usar la selección de parte indexada.

Ejemplo de uso de la variable:

 reg [31:0] dword; reg [7:0] byte; reg [1:0] i; // This is illegal due to the variable i, even though the width is always 8 bits assign byte = dword[(i*8)+7 : i*8]; // ** Not allowed! // Use the indexed part select assign byte = dword[i*8 +: 8]; 

El propósito de este operador es cuando necesita acceder a un segmento de un bus, tanto la posición MSB como las posiciones LSB son variables, pero el ancho del segmento es un valor constante, como en el ejemplo siguiente:

 bit[7:0] bus_in = 8'hAA; int lsb = 3; int msb = lsb+3; // Setting msb=6, for out bus of 4 bits bit[3:0] bus_out_bad = bus_in[msb:lsb]; // ILLEGAL - both boundaries are variables bit[3:0] bus_out_ok = bus_in[lsb+:3]; // Good - only one variable 
    Intereting Posts