Verilog precisión de bit intermedio

0

Actualmente tengo la siguiente expresión verilog ...

wire [15:0] address_delta = (rx_address_in * 8 + (rx_eof_in ? rx_len_in : 8)) - (seek_address + OUT_BYTES);

rx_address_in es de 13 bits y OUT_BYTES es un parámetro que es una constante entera (así que supongo que 32 bits). Estoy asumiendo que la multiplicación de 8x se optimizará en un turno a la izquierda de 3. Si esta es una mala suposición, hágamelo saber. Estoy usando el último Vivado.

Ahora mismo mi diseño está teniendo problemas para cumplir con el tiempo. Aunque mi dirección_delta es de solo 16 bits, ya que estoy usando constantes de 32 bits dentro de la expresión, lo que creo podría hacer que las operaciones se realicen con una precisión mayor que la necesaria. ¿Cómo reescribirías esta expresión para mejorar la eficiencia o está bien como está?

Estoy pensando que podría hacer algo como esto ...

wire [15:0] seek_end = (seek_address + OUT_BYTES);
wire [15:0] address_delta = ((rx_address_in << 2'd3) + (rx_eof_in ? rx_len_in : 4'd8)) - seek_end;
    
pregunta chasep255

1 respuesta

0

No, usar una asignación intermedia no resuelve tu problema.

Los idiomas HDL no funcionan como C. Todavía hay una ruta de tiempo continuo desde seek_address a address_delta .

Para romper el camino debes, por ejemplo, inserte un registro. Pero eso puede impedir que su diseño funcione ya que seek_end llegará un ciclo de reloj más tarde.

Su cálculo no se hará en 32 bits. Tal vez en un simulador, pero la herramienta de síntesis eliminará todos los bits superfluos.

No nos dice qué tan rápido debe ser su diseño, pero como Elliot Alderson ya sugiere en el comentario: tres sumadores de 16 bits rara vez son críticos. (El rx_address_in << 2'd3 no causa ningún retraso.) A menos que esta expresión sea parte de un cono lógico.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas