2012-09-20 6 views
11

ISE 12.4で構文チェックに合格するモジュールを取得しようとしていますが、それは私には分かりません。最初のコードスニペット:それは文句だ、なぜ私は本当に理解していないVerilogは常にブロック内に/ genvarを生成します

ERROR:HDLCompiler:731 - "test.v" Line 46: Procedural assignment to a non-register <c> is not permitted.

:私は構文チェックをしようとすると

parameter ROWBITS = 4; 

reg [ROWBITS-1:0] temp; 

genvar c; 
generate 
    always @(posedge sysclk) begin 
     for (c = 0; c < ROWBITS; c = c + 1) begin: test 
      temp[c] <= 1'b0; 
     end 
    end 
endgenerate 

、私は、次のエラーメッセージが表示されます。 "c"はワイヤーではない、それはジェネバーです。これは、完全に正当な構文と同等でなければなりません。

reg [3:0] temp; 

always @(posedge sysclk) begin 
    temp[0] <= 1'b0; 
    temp[1] <= 1'b0; 
    temp[2] <= 1'b0; 
    temp[3] <= 1'b0; 
end 

生成しないとこれを簡単に書く方法についてのコメントはありません。これは、 "temp"に対する複数のifとnon-blockingの代入を含むはるかに複雑なコードの縮小例です。また、ISEの新しいバージョンがあると私には分かっていません。私はすでにそれを知っています。 OTOH、を知っている場合は、ISEのそれ以降のバージョンで修正されています。あなたが動作しているバージョンを教えてください。あなたが生成するブロック内のネストを逆にする必要がある

答えて

15

genvar c; 
generate 
    for (c = 0; c < ROWBITS; c = c + 1) begin: test 
     always @(posedge sysclk) begin 
      temp[c] <= 1'b0; 
     end 
    end 
endgenerate 

技術的には、これは4つの常にブロック生成:この単純な例では

always @(posedge sysclk) temp[0] <= 1'b0; 
always @(posedge sysclk) temp[1] <= 1'b0; 
always @(posedge sysclk) temp[2] <= 1'b0; 
always @(posedge sysclk) temp[3] <= 1'b0; 

を、4間の行動に差はありません常にブロックし、4つの割り当てを含む単一の常時ブロックですが、それ以外の場合もあります。

設計のメモリ内表現(シミュレータの場合)を構築するとき、または論理ゲート(マッピングツールの場合)にマッピングするときは、genvar依存の操作を解決する必要があります。 always @posedgeは、デザインが動作するまで意味を持ちません。

制限がある場合、合成可能なコードの場合でも、alwaysブロックの中にforループを置くことができます。合成の場合、ループはアンロールされます。しかし、その場合、forループはreg,integer、またはそれに類するもので動作する必要があります。 alwaysブロック内のforループを使用すると、クロックの各エッジで発生する操作が記述されるため、設計の精緻化中に静的に展開できる操作ではないため、genvarを使用することはできません。

+0

感謝を行います。私はそれがこのようなものになるのではないかと心配しました。問題の一部は、forループを使用してif文またはcase selectorのシーケンスを生成したいのです。これは別のalwaysブロックでは実行できません。 – user1684538

+0

すべてのコードを1つのalwaysブロックに生成する方法はありますか?そうでないのはgenvarですか? – user2569332

2

モジュール内では、Verilogには本質的に2つの構成要素、つまり項目と文が含まれています。ステートメントは、begin..end、functions、tasks、alwaysブロック、およびinitialブロックの間にあるものを含む手続き型コンテキストで常に見つけられます。構文を生成するなどの項目は、モジュールに直接リストされます。 Forループとほとんどの可変/定数宣言は、両方のコンテキストに存在できます。

コードでは、forループが生成アイテムとして評価されるように見えますが、ループは実際にはalwaysブロックの手続きコンテキストの一部です。 forループを生成ループとして扱うには、それはモジュールコンテキスト内になければなりません。 generate..endgenerateキーワードは完全にオプションであり(一部のツールではそれらを必要とする)、効果はありません。生成ループの評価方法の例については、this answerを参照してください。

2

ファイルをコンパイル/生成する必要がない場合は、事前処理技術を使用できます。これにより、生成するパワーが得られますが、Verilogファイルがきれいになります。このファイルはデバッグが容易で、シミュレータの問題が少なくなります。

私はRubyItを使用して、ERB(Embedded Ruby)を使用してテンプレートからVerilogファイルを生成します。 module_name.vファイルの生成

parameter ROWBITS = <%= ROWBITS %> ; 
always @(posedge sysclk) begin 
    <% (0...ROWBITS).each do |addr| -%> 
    temp[<%= addr %>] <= 1'b0; 
    <% end -%> 
end 

:生成module_name.v

parameter ROWBITS = 4 ; 
always @(posedge sysclk) begin 
    temp[0] <= 1'b0; 
    temp[1] <= 1'b0; 
    temp[2] <= 1'b0; 
    temp[3] <= 1'b0; 
end 
4

$ ruby_it --parameter ROWBITS=4 --outpath ./ --file ./module_name.rv 

をあなたがtempのすべてのビットをしたい場合は、生成ボックは必要ありません。同じ常時ブロックに割り当てられます。あなたのシミュレータはIEEE 1800(SytemVerilog)をサポートしている場合

parameter ROWBITS = 4; 
reg [ROWBITS-1:0] temp; 
always @(posedge sysclk) begin 
    for (integer c=0; c<ROWBITS; c=c+1) begin: test 
     temp[c] <= 1'b0; 
    end 
end 

あるいは、その後、

parameter ROWBITS = 4; 
reg [ROWBITS-1:0] temp; 
always @(posedge sysclk) begin 
     temp <= '0; // fill with 0 
    end 
end 
0

のverilogのためだけの迅速な対応のための

parameter ROWBITS = 4; 
reg [ROWBITS-1:0] temp; 
always @(posedge sysclk) begin 
    temp <= {ROWBITS{1'b0}}; // fill with 0 
end 
関連する問題