FC2カウンター FPGAの部屋 2008年03月28日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Verilog HDLでの数値リテラル(定数)の書き方

昨日は、PCI-Expressのセミナに行ってきてとてもためになった。講師のかたありがとうございました。

さて、”Verilog版DDR SDRAMコントローラのバグフィックス”の”wp, rpと演算する数のビット幅を制限, ビット幅の制限がないと特に-の演算をする時に符号拡張が32ビットで行われるためにfullが出力されない”というバグについて、今後の戒めとするために詳しく書いておこうと思う。
DDR SDRAMコントローラのアクセスするアドレスを入力しておくaddr_fifo.vではルックアップテーブルを使用した分散RAMを使用して、自分でFIFOを構成している。コアジェネレータを使用せずに自分でFIFOを書いている主な理由は、次のアドレスも出力したいからだった。つまり出力アドレスと次に出力するアドレス(入っていれば?)を出力して、BANKやROWアドレスが違っているときにプリチャージ、ACTコマンドを入れるようにしようという目論見でそうなった。コアジェネレータで作ると当然ながらデータ出力は当然1つなのでニーズに合わない。
分散RAMを使用してFIFOにするために、ライトポインタ(wp)とリードポインタ(rp)を定義してある。どちらのポインタともに4ビットとして定義している。FIFOのFULLを判定する式はrp-1 == wp となるのでそのまま下のように書いた。

assign fifo_full = (rp-1==wp) ? 1'b1: 1'b0;


でも、少なくともシミュレータでは危ない記述だそうだ。
なぜだめかというと上の記述で-1はビット幅を指定していないので、32ビット幅に拡張されてしまうそうだ。つまり32'hFFFF_FFFFになってしまう。左辺は当然32ビット符号拡張されるが、== の比較のときに右辺も32ビットに拡張されてしまう。
これでも通常の場合はOKだが、rpが0、wpがFの時(ポインタは4ビットに定義してあるので)当然ながらFIFOはFULLなのだが、左辺は32'hFFFF_FFFF、右辺は32'h0000_000Fとなってイコールにならないので、FULL信号がアクティブにならなかった。
これを避けるためにはrp-1の-1をビット幅を制限する必要があるそうだ。ここではポインタは4ビットなので、4ビットに制限する。つまり1は4'b0001か4'h1と書く必要がある。よって下のように書き換えたらFULL信号が正常に出力されるようなった。

assign fifo_full = (rp-4'h1==wp) ? 1'b1: 1'b0;


たっくさん、教えていただいてありがとうございます。
今度から、かならず数値リテラルもビット幅を指定することにしようと思う。
  1. 2008年03月28日 05:48 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:3