« 今日の日記 | Main | FPGAにおける配置配線の話 »

2008.03.26

VerilogのCase文

Advanced FPGA Design: Architecture, Implementation, and Optimizationを読んでいたらおもしろい記述を見つけた。

module regwrite
  (
  output reg rout,
  input clk,
  input [3:0] in,
  input [3:0] ctrl
  );
  always @(posedge clk)
    case(1)
      ctrl[0]:rout <= in[0];
      ctrl[1]:rout <= in[1];
      ctrl[2]:rout <= in[2];
      ctrl[3]:rout <= in[3];
    endcase // case(1)
endmodule // regwrite

caseの中が定数で、ラベルに信号が入っている。こんな書き方できるのか。手持ちのVerilog本で調べてみたけど、こんな書き方しているのを見たことがない。この本は、こういうVerilogの文法を調べるために買ったんだけど、全然載っていない。分厚いという理由だけで選んだ自分を罵りつつも、本棚をあさる。

Verilog Golden Reference Guidesが、欲しい情報に一番近い。
それによるとcase文の文法はこう。

case (Expression0)
  Expression1, ... : Statement1
  Expression2, ... : Statement2
  ...
  [default [:] Statement]
endcase

Cのラベルの感覚でいたけど、実際はif文なのか。上の例で行くと、Expression0==Expression1が成り立つときにStatement1が実行される。Expression0==Expression1が成り立たないときは、Expression0Expression2との比較をする。なるほど。

つまり、上の例はこれと等価。

always @(posedge clk)
  if(1==ctrl[0])rout <= in[0];
  else if(1==ctrl[1])rout <= in[1];
  elee if(1==ctrl[2])rout <= in[2];
  else if(1==ctrl[3])rout <= in[3];

Quartus2では、case(1)の表記でもちゃんと合成できた。勉強になった。

|

« 今日の日記 | Main | FPGAにおける配置配線の話 »

Comments

starc のスタイルガイド辺りには載ってかと。
実は、case(1'b1) とか書いちまった方が、
論理合成では結果が良くなったりするので...

Posted by: noboshemon | 2008.03.26 at 01:34 PM

ラベルって何のことかと思いました。
http://ieeexplore.ieee.org/xpl/standardstoc.jsp?isnumber=33945
はダメですか? これによると Expression1, ... : Statement1 のところは

case_item ::=
expression { , expression } : statement_or_null
| default [ : ] statement_or_null

ですね。

Posted by: JZ5 | 2008.03.26 at 07:10 PM

え。。
これって、One-Hotを記述するための基本的な記述じゃないの?

Posted by: 原山みや | 2008.03.26 at 09:32 PM

え。。
これって、One-Hotを記述するための基本的な記述じゃないの?

Posted by: 原山みや | 2008.03.26 at 09:34 PM

> noboshemonさん
情報ありがとうございます。
会社のスタイルガイド見たら、ビット幅の指定も含めて書いてありました。
ASICよりの記述が多くて流し読みでしたけど、やっぱりちゃんと勉強しないと駄目ですね。

> JZ5 さん
情報ありがとうございます。すいません。Cのswitchを想定して書いていました。

そうです。文法の定義と、動きが知りたかったのですが、入門書には書いて無くて
難儀していました。リンク先見ましたが、IEEEのメンバーにならないとダウンロード
できませんでした。メンバーも何種類かあって悩ましいので、ゆっくりIEEEのサイト
を見ていきます。

高くて手がでなかったと言い訳しつつ、中途半端な本を2~3冊買うのを我慢して
規格書買おうと思いました。

Posted by: なつたん | 2008.03.27 at 09:26 AM

原山みや さん

>これって、One-Hotを記述するための基本的な記述じゃないの?

えーっ、そうなんですか!
勉強不足丸出しでお恥ずかしい。

とりあえずVerilog2001の本に、BNFを発見したので眺めてみます。

Posted by: なつたん | 2008.03.27 at 12:44 PM

> IEEEのメンバーにならないとダウンロード
できませんでした。
アッー! すみません。買わないといけないのです。
でも会員ならなくても購入できますよー。
会員より少し高めですが$120でした。
会員についてはよくわからないです。ぜひ調べて記事にしてくださいw

Posted by: JZ5 | 2008.03.27 at 10:32 PM

> JZ5 さん

言われて見れば、私も別の資料を非会員で買ったことがありました。
文法定義だけでなく、細かい事も知りたいなら必須ですね。

お金が入れば買ってみようと思います。

Posted by: なつたん | 2008.03.30 at 02:02 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/40637296

Listed below are links to weblogs that reference VerilogのCase文:

« 今日の日記 | Main | FPGAにおける配置配線の話 »