FC2カウンター FPGAの部屋 Verilog HDLでの数値リテラル(定数)の書き方
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

コメント

そういえば、引き算は使うなと言われたことがあります。しかたないので足し算でやった覚えがあります。
  1. 2008/03/28(金) 22:50:53 |
  2. URL |
  3. Sim #-
  4. [ 編集 ]

Simさん、こんにちは。

そうですね。引き算は符号拡張の時にあぶなそうです。以後、ビット幅の制限をつける習慣をつけようと思っています。
  1. 2008/03/29(土) 05:55:28 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

訂正

Verilogの等号演算 (==等)、関係演算(< 等)を使うときは、ビット幅の指定は必須です。
http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%C5%C5%B5%A4%B2%F3%CF%A9%2FHDL%2FVerilog%A4%C7%C8%C8%A4%B7%A4%AC%A4%C1%A4%CA%B5%AD%BD%D2%A5%DF%A5%B9#o7092696
  1. 2010/06/05(土) 08:15:56 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/763-a5242f78
この記事にトラックバックする(FC2ブログユーザー)