function文(2)

前回はif文を使う方法について述べた。
今回はcase文を使う。筆者はcase文を好んで多用している(理由は後に述べる)ので
覚えてもらえるととーっても助かります(^^;)

さて前置きはこれくらいにして, case文とはC言語でいうswitch文のことである。
if文が複雑になるときに使う。 例えば

function [2:0]selector;
  input [1:0]select;
  input [3:0]signal;

  if( select == 2'b00)begin
   selector = {signal[3], signal[2], signal[1], signal[0]};
  end if( select == 2'b01)begin
   selector = {signal[2], signal[1], signal[0], signal[3]};
  end if( select == 2'b10)begin
   selector = {signal[1], signal[0], signal[3], signal[2]};
  end if( select == 2'b11)begin
   selector = {signal[0], signal[3], signal[2], signal[1]};
  end

endfunction

これをcase文で書いてみると

function [2:0]selector;
  input [1:0]select;
  input [3:0]signal;

  case( select)
   2'b00: selector = {signal[3], signal[2], signal[1], signal[0]};
   2'b01: selector = {signal[2], signal[1], signal[0], signal[3]};
   2'b10: selector = {signal[1], signal[0], signal[3], signal[2]};
   2'b11: selector = {signal[0], signal[3], signal[2], signal[1]};
  endcase

endfunction

となり条件文が読みやすい記述となる。
if文でもcase文でも注意してもらいたいのが, 条件の記述漏れである。
つまりこのような場合である。

 if( a == 2'b10)begin
   b = c;
   d = e;
 end else if( a == 2'b01)begin
   b = e;
   d = c;
 end 

この場合はaが2'b00と2'b11のときの動作が記述されていない。

 case( select)
   2'b01: selector = {signal[2], signal[1], signal[0], signal[3]};
   2'b10: selector = {signal[1], signal[0], signal[3], signal[2]};
 endcase

この場合はselectが2'b00と2'b11のときの動作が記述されていない。

条件漏れの場合はどんな回路が合成されるのだろうか?
大抵の合成ツールは記述を忠実に実現しようとし、値を保持するための回路を付加する。
(順序回路編で述べるフリップフロップやラッチが付加されてしまう)
つまりどう動作するか不定になるのだ。

case文の場合は条件の記述漏れを回避する方法がある。

 case( select)
   2'b01:   selector = {signal[2], signal[1], signal[0], signal[3]};
   2'b10:   selector = {signal[1], signal[0], signal[3], signal[2]};
   default: selector = {signal[1], signal[0], signal[3], signal[2]};
 endcase

このようにdefaultを使うことで条件にマッチしないときにdefaultの文が実行される。
条件をすべて列挙できればdefaultは不要だが, 人間が記述する以上ミスはあると考えよう。
case文を使うならdefaultもセットで、と覚えておいて頂きたい。

ということで、function文は強力な記述力を持っていることを理解して頂けただろうか。 function文をたくさん書いて習得しよう。

モジュールとwire【Altera DE0】へ進む
Verilog入門へ戻る


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-04-13 (水) 11:16:52 (2385d)