¿Cómo hago uso de multiplicadores para generar un sumador simple?

Estoy tratando de sintetizar un circuito Altera usando la menor cantidad de elementos lógicos posible. Además, los multiplicadores incorporados no cuentan contra los elementos lógicos, por lo que debería usarlos. Hasta ahora, el circuito parece correcto en términos de funcionalidad. Sin embargo, el siguiente módulo utiliza una gran cantidad de elementos lógicos. Utiliza 24 elementos lógicos y no estoy seguro de por qué, ya que debería usar 8 + un par de puertas combinacionales para el bloque de casos.

Sospecho que la víbora, pero no estoy 100% seguro. Sin embargo, si mi sospecha es correcta, ¿es posible usar multiplicadores como un simple sumador?

module alu #(parameter N = 8)
(
    output logic [N-1:0] alu_res,
    input [N-1:0] a,
    input [N-1:0] b,
    input [1:0] op,
    input clk
);       

wire [7:0] dataa, datab;
wire [15:0] result;

// instantiate embedded 8-bit signed multiplier
mult mult8bit (.*);

// assign multiplier operands
assign dataa = a;
assign datab = b;

always_comb
    unique case (op)
        // LW
        2'b00:  alu_res = 8'b0;
        // ADD
        2'b01:  alu_res = a + b;
        // MUL
        2'b10:  alu_res = result[2*N-2:N-1]; // a is a fraction
        // MOV
        2'b11:  alu_res = a;
    endcase

endmodule
Esta es una pregunta migrada de stackoverflow.com/questions/22304059/…
Su diseño existente utiliza 16 elementos lógicos para implementar el mux 4:1 de 8 bits representado por la casedeclaración y 8 elementos lógicos (junto con hardware de transporte dedicado) para implementar a + b. Realmente no hay nada mejor que eso.
Copiaré mi comentario de StackOverflow: " uniquepara síntesis significa parallel_casey full_case. Pruébelo con priority(solo full_case) en su lugar. Pruébelo también sin una palabra clave delante de la declaración del caso".
Desde mi experiencia, parallel_casetiende a requerir más puertas lógicas pero proporciona una ruta de datos más rápida.
@Greg Gracias Greg. Lo intentaré, aunque los libros de texto que he leído recomiendan evitarlos por alguna razón. Usé unique porque teóricamente debería resultar en menos hardware.
@Greg Probé con prioridad y sin una palabra clave. Ambos producen prácticamente lo mismo.
@DaveTweed Gracias. Supongo que necesito descubrir cómo simplificar el aluminio de alguna manera.
Punto de estilo: si usó, localparam [1:0] LW=2'b00, ADD=2'b01, MUL=2'b10...;encontraría el código mux de salida autodocumentado (o una enumeración SV)

Respuestas (1)

Utilice el "Visor de mapas tecnológicos" de Altera si desea ver exactamente cómo y dónde se infieren esos 24 elementos.

No estoy seguro de qué tecnología apuntó. Para un StratixV, utiliza 16 registros y 1 segmento DSP y, si lo necesita, obtendrá la siguiente etapa de registro de forma gratuita desde la salida mux.

Visor RTL

vista RTL

Vista de tecnología/recursosingrese la descripción de la imagen aquí

Puede ver que los elementos lógicos se usan uno por bit para el mux de salida y uno por bit para el sumador, con la celda DSP resaltada.

Es posible que pueda empaquetar todo en una sola celda SV DSP utilizando los diversos bits de modo (preagregadores para a / b, establezca la etapa múltiple en x1) para evitar el mux de salida, pero todo es discutible en ese tipo de ¡dispositivo!