2012-03-05 11 views
9

私はVerilogで多段コンパレータを作成しようとしていますが、1つのgenerateループで複数のgenvarsをインクリメントする方法を見つけることはできません。私は、次のことをしようとしている:複数のGenvarsをVerilogで生成するステートメントを生成する

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

と、次のエラーを取得:同じ生成文で複数のgenvarsをインクリメントする方法

Error-[SE] Syntax error 
    Following verilog source has syntax error : 
    "encoder.v", 322: token is '=' 
    j=0; 

誰もが知っていますか?または同等の機能を少なくとも備えていますか? ci1tcの半分の深さを持って、あなたがしたいと仮定すると

答えて

5

は、次のように動作するはずci1[0] = min(tc[0], tc[1])ci[1] = min(tc[2], tc[3])など、言う:forループを生成するための暗黙的に作成されます

module st_genvar(); 

    int ci1 [0:127]; 
    int tc [0:255]; 

    function int minw(int i1, int i2); 
     if(i1 < i2) 
     minw = i1; 
     else 
     minw = i2; 
    endfunction 

    genvar i; 
    //Level 1 
    generate 
     for (i=0;i<128;i=i+1) 
     begin: level1Comp 
      assign ci1[i] = minw(tc[i*2],tc[i*2+1]); 
     end 
    endgenerate 

endmodule 
11

Anyone know how to increment multiple genvars in the same generate statement?

これが許可されていませんループ変数のlocalparam文を実行し、そのlocalparamのみに基づいてループ内の項目を精緻化します。これは、genvarがlocalparamとして宣言されていれば、ループ内のどの項目もループ外で有効でなければならないことを意味します。

genvar i,j; 
//Level 1 
generate 
    j=0; 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    j = j+2; 
    end 
endgenerate 

はあなたがループ内で明示的なパラメータを使用してgenvarに依存して「定数」の値を作成することができます。この場合

//Done for each value of i 
genvar j; 
localparam integer i = i_for_each_iteration; 

j=0; //Not valid outside a procedural context so modelsim complains 
assign ci1[i] = minw(tc[j],tc[j+1]); 
j = j+2; //Also not valid outside a procedural context 

になります。

genvar i; 
//Level 1 
generate 
    for (i=0;i<128;i=i+1) 
    begin: level1Comp 
    localparam integer j = i*2; 
    assign ci1[i] = minw(tc[j],tc[j+1]); 
    end 
endgenerate 
+0

非常に興味深い! localparamはハードウェアに何かを作成しますか? – Adam

+1

No.ローカルパラメータは、設計の精緻化に使用される定数です。 –

関連する問題