Verilogで犯しがちな記述ミス のバックアップソース(No.3)

更新

[[公開メモ]]

#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: 307944 (from 2010/06/03), today: 8, yesterday: 0