宣言文
module :記述するモジュール名を定義する
ex:module foo(inA , inB , outC , outD);
foo :モジュール名
inA , inB :入力信号線名※
outC , outD :出力信号線名※
※ここでは、2つ記述しているが入出力線の数に制限は無い
endmodule :モジュールの最後を指定するもの
input :入力信号の宣言
・入力が多ビット信号の場合は、以下のように表現する
・input[width - 1:0] inA;
→ビット長がwidth[bit]の場合の宣言方法
・モジュールの場合、wireとして内部で扱われる
output :出力信号の宣言
・多ビットの場合はinputと同様の形式で表現する
・モジュールの場合、regとして内部て扱われる
inout :入出力信号
・未だに一度も使ったことが無い
wire :ワイヤー宣言
・信号線の名前の宣言
・値を保持することができない
→接続されているものの状態で常に変化する
・多ビットの場合はinputと同様の形式で表現する
reg :レジスタ宣言
・レジスタの名前の宣言
・値を保持することが可能
・ロジックの消費が多い
・多ビットの場合はinputと同様の形式で表現する
parameter :定義値の宣言
・C言語での#defineと同等の働きをする
include :外部ファイルの設定内容を読み込む場合に使用
ex:同一フォルダ内のhogehoge.vhを読み込むとする
→'inclide "./hogehoge.vh"
演算
Verilog-HDLは、記述した内容が並列で動作する。そのため、演算の内容の集合(関数のようなもの)の範囲を明示するために以下の表現を用いる
この表現で明示された内容をひとまとまりとして考える。
assign :wire文の演算を行う。(左辺は必ずwire文)
左辺のwire文の内容を示すために、右辺でreg文が必要になった場合にはreg文も使用可能
always :イベントが発生するごとに動作する
記述方法→always@(…)
…には以下の3つの表現方法がある
・posedge :信号の立ち上がりに同期
・negedge :信号の立ち下りに同期
・なし :信号が変化したときに同期
※これらの表現やイネーブル信号をandやorで組み合わせることができる
if~else :条件選択(C言語と同じ)
・if文は上から順に条件比較を行う。そのため、多段になる場合はfunction文への書き換えを検討する
function :入力にあった出力を行う。原則wireと同様、値のみ返し値の保持は行わない
文法
function[width - 1:0] function名
input[widthA - 1:0] inA;
input[widthB - 1:0] inB;
//計算内容
endfunction
呼び出し方法
assign Wire名 = function名(A , B)
→function内のinAにAが、inBにBが代入される
case :条件分岐(C言語のswitch文に相当する)
文法
case(条件)
条件1:
条件2:
…
default:
endcase
その他
あとは思いつくものをつらつらと
結合
複数の信号線から一つの信号線を作成。または、信号線のビット位置の並べ替えを行う
ex:
1. assign hoge = {foo[2:1] , bar[3:0] , foo[5]}
→fooの2,3ビット目、barの1から4ビット目、fooの6ビット目の順で結合
2. assign {Co , add} = inA + inB + Cin;
→加算器のようなもの(桁上がりがCoに代入される)
3. assign hoge = {4{2'b01}};→「8'b0101_0101」
→"01"の並びのデータが4つ続く
選択
多ビット信号線から並んでいる1ビット以上の信号を選択する
ex:信号線hogeのmビット目からnビット目までを選択する
→hoge[n - 1:m - 1]
その他情報
ノンブロッキング文・ブロッキング文
言葉で書くと難しいので結果を書いてみる
レジスタ:
regA:「初期値をしてhogeが入っているとする」
regB
ブロッキング文(=)
regA = bar;
regB = regA;
→regA、regB共にbarの値が代入される
ノンブロッキング文(<=)
regA <= bar;
regB <= regA;
→regAにはbarが代入され、regBにはhogeが代入される
これは、読み出しの順番によって起こる違い
ブロッキング文はC言語と同様に上から順に演算が行われていく。一方、ノンブロッキング文は
右辺の読み出しを最初に行い、その後代入を行うため信号変化の前の値が代入される。
※レジスタを扱うときは、特別なことが無い限りノンブロッキング文を使ったほうがいい。
最終更新:2009年04月20日 15:01