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;