1

J'essaye d'écrire du code verilog que j'aimerais réutiliser pour une application qui a beaucoup d'addition avec un nombre variable d'entrées. Dire que j'ai un module:Verilog: Existe-t-il un moyen de créer un additionneur généralisé (largeur variable/nombre d'entrées)?

module parameterizable_adder #( 
    parameter WIDTH = 16, 
    parameter NUM_INPUTS = 16)( 
    input [NUM_INPUTS*WIDTH-1:0] in_data, output [NUM_INPUTS+WIDTH-1:0] out_data 
); 

    //treat this block as psuedo code 
    integer i; 
    for (i = 0; i < NUM_INPUTS; i = i + 1) begin 
    out_data = out_data + in_data[i*WIDTH+WIDTH-1:i*WIDTH]; 
    end 

endmodule 

Ceci est plus ou moins ce que je veux faire. Y a-t-il un moyen de le faire et de le synthétiser? Idéalement, la boucle for serait déroulée et optimisée de sorte qu'elle n'essaie pas de faire l'addition dans NUM_INPUTS-1 étapes. Est-ce mieux adapté à une instruction generate?

Merci

Répondre

2

Vous n'avez pas besoin de générer bloc pour cette

integer i; 
reg [NUM_INPUTS+WIDTH:0] temp_data; 
always @* begin 
    temp_data = 0; 
    for (i = 0; i < NUM_INPUTS; i = i + 1) 
     temp_data = temp_data + in_data[i*WIDTH +: WIDTH]; 
    out_data = temp_data; 
    end 
+0

Merci dave, serait que l'exécution de code en un seul cycle d'horloge? Temp_data serait-il mis à jour en un seul cycle d'horloge ou un cycle d'horloge pour chaque opération d'addition? – marlow

+0

J'ai essayé de modifier, mais je ne peux pas. J'ai remarqué qu'il n'y a pas d'horloge (dans mon code non plus), c'est un "*" pour le bloc toujours. Je pense que je comprends. Merci! – marlow