Multiplicando por constante en Verilog

Hola buenas,

Estoy intentando implementar un algoritmo matemático complejo en una FPGA y por eso me preocupa bastante usar el menor número de recursos posibles. En concreto, tengo que realizar muchas operaciones de producto por una constante. Por eso he hecho un test sencillo y he visto algo raro.

El código que he escrito es el siguiente:
module test(
input [10:0] a,
output reg [10:0] b
);

always @* begin
b=a*10'sd5;
end
endmodule

Así que estoy intentando multiplicar la entrada por 5. El problema es que el sintetizador del software que estoy usando (ISE project de Xilinx) me coloca un multiplicador entero para hacer esta operación, cuando tiene sentido pensar que es mucho más sencillo hacerlo con un simple sumador (dado que 5 es 101 en binario solo tendríamos que sumar a y una versión desplazada dos posiciones de a). ¿Hay alguna forma de hacer que el sintetizador ponga el sumador?
Obviamente en mi trabajo no tengo que multiplicar por 5, sino por diferentes constantes de unos 30 bits así que ponerme a escribir a mano el desarrollo con sumas y desplazamientos no es una buena idea.

Muchas gracias!!!
 
Pienso que una manera de lograr lo que quieres es escribir en Verilog el lazo que realiza justamente lo que dices.

Dicho esto, en muchos dispositivos FPGA el multiplicador es un bloque de HW especifico (Hardware IP), por lo que puede ser mas economico usar tal bloque (que no puede ser usado para otras tareas), que utilizar los recursos de logic cells que consumirian los sumadores y registros de desplazamiento.
 
Última edición:
Arriba