Verilogで犯しがちな記述ミス のバックアップ差分(No.3)
更新- バックアップ一覧
- 現在との差分 を表示
- ソース を表示
- バックアップ を表示
- 電気回路/HDL/Verilogで犯しがちな記述ミス へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
[[公開メモ]] #contents * 意図 [#e8cde487] インプリメント時のワーニングをうまく見る方法が分からず、 簡単な記述ミスのせいで2,3時間を無駄にすることがしばしばなので、 ありがちなミスをここに記述して、日頃から注意しようという算段です。 * 宣言されていない信号線が幅1の wire として解釈される [#yc9cdc36] Verilog ではこれは言語仕様なので、警告も出ないのですよね。 このせいで、クロックが正しく繋がれていなかったり、 幅の広いバス線のはずが1ビット目しか繋がれていなかったり、 常に泣かされています。 宣言されていない信号線が使われたらエラーにするか、 最低でも警告を出すオプションがあればかなり開発が 順調に進むと思うのですが・・・ 見つけられていないだけかもしれません? * 演算子の優先順位 [#h3b77aca] 参考:http://homepage3.nifty.com/hdl_design/verilog_hdl2.htm ** ビット演算子と等号 [#y7fed919] ビット論理演算子の & や | よりも等号・不等号の方が優先順位が 高いことをすぐに忘れてしまい、痛い目を見ます。 LANG:verilog assign a = b == c & d; これは、 LANG:verilog assign a = ( b == c ) & d; と解釈されますので、 LANG:verilog assign a = b == ( c & d ); としたければ、括弧は必須です。 Pascal や Ruby ではビット論理演算が等号よりも強かったので、 今でも勘違いして原因が分からず途方に暮れます。 C++ や C#, Java もビット論理演算が等号より弱いので、 そちらでも間違えまくりです(泣 ** 等号と3項演算子 [#q956e1c4] LANG:verilog assign a = b == c ? d : e は、 LANG:verilog assign a = ( b == c ) ? d : e と解釈されるので、 LANG:verilog assign a = b == ( c ? d : e ) としたければ括弧は必須です。 これも結構やらかします。 3項演算子 ? : はすべての演算子の中で最も優先順位が低い、と覚えておけばいいのですね。 * コメント [#d73b3e6c] #article_kcaptcha **()は必須です [#s5808e25] >[アプロ] (2010-06-03 (木) 07:57:45)~ ~ assign文による組み合わせ回路で、条件判定する場合は、() でくくる癖をつけた方がいいですよ~ ~ また、あとあと論理がわかるように~ (c == 1'b1) ?~ とか明示するとよいでしょう~ // #comment_kcaptcha **宣言されていない信号線が幅1の wire として解釈されるの解決法 [#z77707c3] >[marsee] (2010-06-03 (木) 07:09:46)~ ~ 宣言されていない信号線が幅1の wire として解釈されるの解決法としては、`default_nettype noneを最初に記述するという方法があります。こうすると定義していない信号があるとエラーになります。ただ、これはVerilog2001の構文です。Xilinxのライブラリなどでは、1ビットのwireは定義していないこともあるので、コンパイルの順番によっては、そこでエラーになることがあります。そこで、最後に`default_nettype wireを書いておくと良いと思います。つまり、~ `default_nettype none~ Verilogの回路本体~ `default_nettype wire~ です。~ // #comment_kcaptcha
Counter: 296725 (from 2010/06/03),
today: 28,
yesterday: 0