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が成り立たないときは、Expression0とExpression2との比較をする。なるほど。
つまり、上の例はこれと等価。
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)の表記でもちゃんと合成できた。勉強になった。
The comments to this entry are closed.
Comments
starc のスタイルガイド辺りには載ってかと。
実は、case(1'b1) とか書いちまった方が、
論理合成では結果が良くなったりするので...
Posted by: noboshemon | 2008.03.26 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 07:10 PM
え。。
これって、One-Hotを記述するための基本的な記述じゃないの?
Posted by: 原山みや | 2008.03.26 09:32 PM
え。。
これって、One-Hotを記述するための基本的な記述じゃないの?
Posted by: 原山みや | 2008.03.26 09:34 PM
> noboshemonさん
情報ありがとうございます。
会社のスタイルガイド見たら、ビット幅の指定も含めて書いてありました。
ASICよりの記述が多くて流し読みでしたけど、やっぱりちゃんと勉強しないと駄目ですね。
> JZ5 さん
情報ありがとうございます。すいません。Cのswitchを想定して書いていました。
そうです。文法の定義と、動きが知りたかったのですが、入門書には書いて無くて
難儀していました。リンク先見ましたが、IEEEのメンバーにならないとダウンロード
できませんでした。メンバーも何種類かあって悩ましいので、ゆっくりIEEEのサイト
を見ていきます。
高くて手がでなかったと言い訳しつつ、中途半端な本を2~3冊買うのを我慢して
規格書買おうと思いました。
Posted by: なつたん | 2008.03.27 09:26 AM
原山みや さん
>これって、One-Hotを記述するための基本的な記述じゃないの?
えーっ、そうなんですか!
勉強不足丸出しでお恥ずかしい。
とりあえずVerilog2001の本に、BNFを発見したので眺めてみます。
Posted by: なつたん | 2008.03.27 12:44 PM
> IEEEのメンバーにならないとダウンロード
できませんでした。
アッー! すみません。買わないといけないのです。
でも会員ならなくても購入できますよー。
会員より少し高めですが$120でした。
会員についてはよくわからないです。ぜひ調べて記事にしてくださいw
Posted by: JZ5 | 2008.03.27 10:32 PM
> JZ5 さん
言われて見れば、私も別の資料を非会員で買ったことがありました。
文法定義だけでなく、細かい事も知りたいなら必須ですね。
お金が入れば買ってみようと思います。
Posted by: なつたん | 2008.03.30 02:02 PM