¿Cómo truncar un ancho de bit de expresión en Verilog?

8

Considera una expresión como:

assign x = func(A) ^ func(B);

donde la salida de la función es de 32 bits de ancho, y x es un cable de 16 bits. Quiero asignar solo los 16 bits más bajos del xor resultante.

Sé que el código anterior ya lo hace, pero también genera una advertencia. El enfoque "obvio" no funciona:

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected
    
pregunta user23106

3 respuestas

6

Puede usar otra variable, aunque esto no es particularmente elegante.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

Un mejor enfoque sería utilizar una función.

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));
    
respondido por el dwikle
5

En tu ejemplo, estás truncando bits de forma implícita.

Hacer el truncamiento explícito a menudo puede eliminar las advertencias en la simulación / pelusa / síntesis.

Una forma de hacer esto en línea es usar un operador de conversión, por ejemplo:

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

Este enfoque puede tener sentido si es obvio en el contexto que todos los bits que se eliminan son 0.

Si algunos de los bits pueden ser distintos de cero, sugeriría seguir utilizando una red intermedia como @dwikle sugerida en una respuesta anterior , ya que deja más claro que realmente estás tirando bits. Aquí está de nuevo para referencia.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];
    
respondido por el mattgately
3

Creo que esto podría ayudar a mantener la cuenta atrás en la línea.

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

No estoy seguro si eso es válido con asignaciones sin embargo.

    
respondido por el pre_randomize

Lea otras preguntas en las etiquetas