Verilogの演算ルール、文法まとめ

(この記事は書きかけです。書き終わるまで参考にしないでください)

 

最近、HDLを勉強していて、1年くらいの勉強の成果としてFPGAでシンセ制作にチャレンジしています。

ソフトウェア言語の場合、計算をするときにいちいち値の範囲とかは考えませんが、verilogだと全ての変数(レジスタ)と途中の式についてunsignedなのかsignedなのか、ビット幅はどれくらいなのか、を決めて、そして把握して書いていかないと容易に意図しない計算結果を出してしまいます。あわわ。

毎回混乱するので、今回はverilogHDL(2001)の計算の時のルールを自分用メモとしてまとめました。
なおLHSはLeft Hand Sideの略で、式の左側(代入される側)を指します。RHSも同様に式の右側。

 

参考にしたサイト

デジタル・デザイン・ノート デジタル回路を設計する際に考慮すべきポイントがとてもわかりやすくまとまってる良サイト。

Verilogチュートリアル Veritakの開発者のページ。Veriogの文法仕様について詳しく乗っています。一読すべき。

 

符号と評価の基本

次のように評価します。

  1. 式の評価前にLHSとRHSの中で最大のビット幅のものを探す。これが計算時のビット幅になる。
  2. RHSが全てsignedの場合、符号付きで計算する。一つでもunsignedを含む場合、符号なしで計算する。
  3. RHSでの演算結果をLHSに代入する。乗算などでRHSのビット幅がLHSを超えている場合はMSB側を切り捨てて代入する。

算術シフト(>>>)

  • unsigned : 論理シフト(>>)になる。ゼロ拡張される。(上位ビットは0で埋まる)
  • signed : 算術シフト(>>>)になり、符号拡張される。(上位ビットはMSBの符号で埋まる)
  • LHS(Left Hand Side = 式の左側)には依存しない。
  • シフト後もビット幅は変わらない。
  • <<<は<<と同じ。同様にビット幅は変わらない(シフト後も幅拡張はされない)。

 

パートセレクト(hoge[3:0]),連接演算({a,b})

unsignedになる! signedで計算したい時、これを気にしてないととんでもないことになる。

  • 解決方法1 : 自動の幅拡張が起こらないよう、LHSとRHSのビット幅を揃えておく。
  • 解決方法2 : $signed()をつかってキャストする。

 

デシマル表現(単なる1とか、0とか)

signedになる。幅指定していないので、幅はverilogのルールに則り32bitだと解釈される。
ちなみにマイナスを付ける場合は -2’b1 みたいに書く。

 

演算いろいろ

計算後に確保しておきたいビット幅

  • 足し算 : 大きい方のビット幅+1
  • 乗算 : 両方のビット幅を足したもの

こういうのってQiitaとかにpostしたほうがいいんかな…?

0 Comments

Leave a Reply

Your email address will not be published.