1

私は、さまざまな入力数で多くの追加があるアプリケーションで再利用したいと思っているVerilogコードを書こうとしています。 私はモジュールを持って言う:Verilog:一般化された加算器(可変幅/入力数)を作る方法はありますか?

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 

これは私が何をしたいのか、多かれ少なかれです。これを行うにはverilogの方法があり、合成可能なのですか?理想的には、forループはアンロールされ最適化され、NUM_INPUTS-1段階で加算を行なわないようにします。これは生成ステートメントに適していますか?

おかげ

答えて

2

あなたはこの

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

のためのブロックを生成する必要はありませんが、そのコードは、1クロックサイクルで実行するでしょう、あなたはデイブに感謝しますか? temp_dataは、追加操作ごとに単一クロック・サイクルまたはクロック・サイクルで更新されますか? – marlow

+0

編集しようとしましたが、できません。私はクロックがないことに気づきました(私のコードでも)、alwaysブロックの "*"。私はそれを得ると思う。ありがとう! – marlow

関連する問題