Verilog文法


宣言文

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