Verilogで犯しがちな記述ミス の履歴(No.1)
更新- 履歴一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 電気回路/HDL/Verilogで犯しがちな記述ミス へ行く。
意図†
インプリメント時のワーニングをうまく見る方法が分からず、 簡単な記述ミスのせいで2,3時間を無駄にすることがしばしばなので、 自戒の意味でありがちなミスを記述していこうと思います。
宣言されていない信号線が幅1の wire として解釈される†
Verilog ではこれは言語仕様なので、警告も出ないのですよね。
このせいで、クロックが正しく繋がれていなかったり、 幅の広いバス線のはずが1ビット目しか繋がれていなかったり、 常に泣かされています。
宣言されていない信号線が使われたらエラーにするか、 最低でも警告を出すオプションがあればかなり開発が 順調に進むと思うのですが・・・
見つけられていないだけかもしれません?
演算子の優先順位†
ビット演算子と等号†
ビット単位の論理演算子である & や | よりも等号・不等号の方が優先順位が 高いことをすぐに忘れてしまい、痛い目を見ます。
LANG:verilog assign a = b == c & d;
これは、
LANG:verilog assign a = ( b == c ) & d;
と解釈されますので、
LANG:verilog assign a = b == ( c & d );
としたければ、括弧は必須です。
参考:http://homepage3.nifty.com/hdl_design/verilog_hdl2.htm
Pascal や Ruby ではビット論理演算が等号よりも強かったので、 今でも勘違いして痛い目を見ます。
C++ や C#, Java もビット論理演算が等号より弱いので、 そちらでも間違えまくりです(泣
等号と3項演算子†
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項演算子 ? : はすべての演算子の中で最も優先順位が低い、と覚えておけばいいのですね。
コメント†
Counter: 321844 (from 2010/06/03),
today: 85,
yesterday: 91