2016-11-28 11 views
0

私はVerilogプログラミングに全く新しいので、reg変数を初期化する場所はわかりません。 編集:Verilog regの割り当てですか?

のは、以下のスニペットを見てみましょう Warning at synthesize

module test (
     output LED0 
     ); 
reg led = 1'b1; 
assign LED0 = led; 
endmodule 

または

module test (
     output LED0 
     ); 

reg led; 
initial begin 
    reg led <= 1'b1; 
end 

assign LED0 = led; 
endmodule 

私を与える:それはラインに割り当てられることはありませんので、LEDの初期値を使用します: reg led = 1'b1;

regは常に@ブロックでのみ割り当てられますか?

もう一つの例:ここでは

module fourBitCounter 
     (input clk, 
     output [3:0]counter 
     ); 

wire clk; 
initial begin 
reg[3:0] counter = 4'b1; 
end 

[email protected] (posedge clk) begin 

     if(counter > 15) 
       counter <= 0; 
     else 
       counter <= counter + 1; 
     end endmodule 

REGが0の初期値を持っていますが、私は1にする前にそれを設定している...何が間違っていますか?ありがとうございました!

+0

おそらく、内部と 'initial'ブロック' reg'キーワードを使用する必要はありません。 – toolic

+0

あなたは正しいです。でも、同じ結果... –

答えて

1

regタイプは常に@ブロックでのみ割り当てられますか?

いいえ、reg種類がalwaysブロックとinitialブロックに割り当てることができます(プラスtaskfunctionが、私はこの質問の範囲でそれらをスキップします)、あなたのfourBitCounterについては

で宣言さreg[3:0] counterinitialブロックは、counterとも呼ばれるローカル変数を作成します。この変数は、作成されたブロックの範囲内でしかアクセスできません。counterが割り当てられるように、最初のブロックのreg[3:0]を削除する必要があります。しかし、推測されたワイヤタイプとしてcounterと宣言し、always/initialブロックでワイヤを割り当てることができないため、まだ動作しません。

counterは、4ビット推測線(output [3:0] counteroutput wire [3:0] counterと同義です)の出力として宣言されました。 counteralwaysブロックに割り当てられ、initialブロックに割り当てられるので、regタイプである必要があります。したがって、output reg [3:0] counterと宣言する必要があります。

また、clkは入力と同様に宣言していますが、ローカルワイヤとしては両方にすることはできません。ポートはローカルにアクセスできますが、ローカルネットとして再宣言する必要はありません。

FYI:4ビット値の場合、MSBを格納するものがないため、15 + 1は0になります。Verilogのため

module fourBitCounter (
    input clk, 
    output reg [3:0] counter // 'output reg', not 'output' 
); 

//wire clk; // do not do this, clk is an input 
initial begin 
    counter = 4'b1; // no 'reg' here 
end 

always @(posedge clk) begin 
    if(counter > 15) // this will never evaluate as true with counter declared as 4-bit 
    counter <= 0; 
    else 
    counter <= counter + 1; 
end 
endmodule

assign文のみネットタイプ(例えばwire)に適用することができます。これは合法です:これは違法である

module test (output LED0); // LED0 is an inferred wire 
assign LED0 = 1'b1; 
endmodule 

module test (output reg LED0); // Explicit reg 
assign LED0 = 1'b1; // illegal, assign on a reg 
endmodule 
+0

ありがとうございました!それは私の間違った誤りを修正するのに役立ちましたが、もう一つの疑問があります。なぜ手続きブロック内で非割り当てを使用したのですか?なぜそうではない:counter <= 4'b1。 P.S.最初のブロックはまだ合成可能ではないかもしれませんか? –

+0

最初のブロックでは、ブロック割り当て( '=')を使用しました。 alwaysブロックでは、非ブロッキング代入( '<=')を使用しました。これは、常にブロック内に目的のフロップ/ラッチを割り当てるために使用する必要があります。私は最初のブロックでノンブロッキングを使用することができましたが、私は通常、自分のコーディングスタイルではありません。ノンブロッキングはスケジューラの更新を延期しますが、クロックエッジでは有効ですが、時刻ゼロでは役に立ちません。 – Greg

+0

次の場合を除いて、すべて意味があります。最初の例のように、レジスタにワイヤを割り当てることはできますか?何がそこに間違っていますか?たとえ私が最初のブロックの内側に割り当てられたとしても、私はまだ得られるだろう:割り当てられていないので、ledの初期値を使用する –

0

あなたの最初のコードサンプルから:

reg led;    // <-- This declares one register called "led" 
initial begin 
    reg led <= 1'b1; // <-- This declares a *separate* register called "led" 
end     //  which is only valid in the initial block 

同じ問題があなたの第二のサンプル中に存在します。ブロックinitialに別のレジスタを宣言しています。値を割り当てようとしている場合は、キーワードregまたはwireを使用しないでください。

+0

はい、確かに私は間違いを犯しました。しかし、変数名の前にregやワイヤーがなくても、それは機能しません。私の最初の例はどうですか? –

関連する問題