知りたいこと
リセット動作が明記されていないFFの実態を知りたいです。
詳細
verilog記述でFPGAのRTLを作成しています。
ネット上のFPGAのサンプルコードで、以下のようなコードをよく見かけます。
reg [7:0] hoge = 8'h00; always @(posedge CLK) begin if (poyo_en == 1'b1) hoge <= hoge + 8'h01; else hoge <= hoge; end
ここで言いたい特徴は
・FFのリセット動作が明記されていない。
・代わりに、regを宣言する段階で初期値を与えている。
といったことになります。
実は深く考えずにこういったコードを合成して何度も利用させてもらいましたが、まったくもって問題は発生しないということを実感しています。しかし、我に返ると、
この記述で生成される回路はいったいなんなのか?どういう動作をしているのか?
といったことがわかりません。もし、わかるかたがいらっしゃったらコメントをいただきたいと思って投稿しました。
昔々、ASICの現場で、
非同期リセットを明記することが習慣になっていて、それを行わないとデザインルールチェッカーに叱られました。理由や背景は忘れてしまいましたが、"非同期リセットで初期値が確定する回路を生成しているぞ"ということは明確であったと思います。
reg [7:0] hoge; always@(posedge CLK or negedge RESET) begin if(!RESET) hoge <= 8'h00; else hoge <= hoge + 8'h01; end
補足情報(FW/ツールのバージョンなど)
作業はXilinx FPGAのzynq上で行っており、ツールはVivado v2019.1 (64-bit)を使用しています。
あなたの回答
tips
プレビュー