Verilog
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Verilog(ヴェリログ)は、デジタル回路の設計用の論理シミュレータであり、そこで使用するハードウェア記述言語でもある。両者を区別する場合、言語の方を「Verilog HDL」と呼ぶ場合もある。日本では、入門書で「Verilog-HDL」という誤った表記が用いられたため、「Verilog」と「HDL」との間にハイフンが入ると勘違いしている技術者も多い。
言語の開発にあたっては、エンジニアに受け入れられるようにプログラム言語のC言語やPascalの要素を取り入れたものとなっている。
プログラミング言語との相違点として、各ステートメントの実行が必ずしも逐次行わず並列実行される場合がある。これはハードウェアを記述する言語という特殊性による。またVerilogモデルは実際のハードウェアの構成に近いモジュールの階層から構成される。モジュールではまず入力/出力端子、必要に応じて双方向端子が宣言される。次に配線を示すwire、記憶素子を示すregとサブモジュールのリストなどが定義される。さらに続いてその動作を規定するステートメントやステートメントをグループにしたブロック群が定義される。ブロックはbeginキーワードで始まり、endキーワードで終わる範囲で定義されその中は順番に実行される。しかし各ブロックは並列に実行される。
Verilog言語には論理合成を適用して実際の回路に変換可能な記述とそうではない部分がある。設計中のモジュールが全て合成可能なステートメントだけで記述されている場合、適切なソフトウェアを用いて半導体チップの回路、さらにレイアウトデータまで変換することができる。
目次 |
[編集] 歴史
[編集] 始まり
Verilogは、ゲートウェイ・デザイン・オートメーション社によりハードウェア・モデリング言語とその為のシミュレータとして1984年頃開発された。その後、同社は1990年にケイデンス・デザイン・システムズが買収した。ケイデンスは、現在も大元のゲートウェイVerilogおよびVerilog-XL論理シミュレータの版権を持っている。
[編集] 標準化
同種のハードウェア記述言語であるVHDLの台頭に対し、ケイデンスはVerilogの規格を公開し標準化する道をとった。すなわちケイデンスはOVI(Open Verilog International)という組織へ版権の一部を移譲した。その後VerilogはIEEEに提出されIEEE-1364-1995として規格化され、一般にVerilog-1995と呼ばれる。なおOVIはその後Accelleraという組織になっている。
標準化にともないVerilogシミュレータは、ケイデンス以外の各社やフリーのものも各種登場するようになった。
[編集] Verilog 2001
オリジナルのVerilog標準に対する不満を解消するために、Verilog-95に対する拡張がIEEEに提出された。この拡張はVerilog 2001といいIEEE-1364-2001になった。VHDLにあったgenerate文に対応し、大規模設計が容易になった。
[編集] Superlog/System Verilog
やがてOpenVeraやVerisityのE言語のようなハイ・レベルの検証言語が登場する。このことはその種の機能を盛り込んだVerilog、すなわちコデザイン・オートメーション社によるSuperlogの開発を促すこととなった。コデザイン・オートメーション社は、シノプシスによってその後買収された。SuperlogとVeraの基本部分はAccelleraに寄贈され、次のIEEE標準としてSystemVerilogとVerilogとに分かれた。
言語の最新のバージョンは、アナログおよびアナログ/デジタルのミックス・シグナル・モデルへの対応もなされておりVerilog-amsという。
[編集] 文法(抜粋)
[編集] キーワード
module(入出力端子リスト) .. endmodule
- この範囲が一つの回路モジュールとなる。
begin .. end
- 汎用のブロック範囲。
initial
- モジュールの中で一回だけ実行されるブロック
always @(イベント式)
- イベント式にあるイベントが発生するびに実行されるブロック
if (条件式) else ..
- 条件判断文
for(変数定義;条件式;変移)
- 繰り返し処理
while(条件式)
- 繰り返し処理
input、output
- 入力端子、出力端子の定義。モジュールの最初に記述。
reg、wire
- 内部配線がレジスタ(値を記憶)か単なる配線かの指定。
function
- 関数定義
//、/* .. */
- コメント。実行には影響しない。
task
- 関数定義の内、平行処理するもの。
and、or、nand、nor、not、
- 基本ゲート
[編集] オペレータ(演算子)
+、-、*、/
- 加減乗除
++、--
- 1加算、1減算
=
- 代入(ブロッキング代入、後述)
<=
- 代入(ノンブロッキング代入)
assign
- 継続的代入。電気回路の配線接続に相当。
&、|
- and、or(ビット演算)
&&、||、!
- and、or、not(論理演算)
上記のようにbegin、end、functionなどはpascalからオペレータや条件、繰り返し処理はCからの文法を流用している。
[編集] モジュールの構成
Verilogの最小単位はモジュールである。以下に、カウンタ回路の例で説明する。
モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。
// // 表題 イネーブル付20段カウンター // module Div20x (rst,clk,cet,cep,count,tc); // パラメータ宣言 parameter length = 20; // カウント段数 parameter count_zero = 5'b00000; // 5bit幅,2進数の0を表す parameter count_one = 5'b00001; // 5bit幅,2進数の1を表す parameter size = 5; // bit幅,基数の指定を省略すると32bit,10進数になる。 // ポート宣言(外部から本モジュールへの接続を定義する) input rst; // リセット(正論理) input clk; // クロック input cet; // カウンターとTC出力のイネーブル input cep; // カウンターのみのイネーブル output [size-1:0] count; // 束線を示す。この場合5bit幅 output tc; // レジスタ宣言 reg [size-1:0] count; // alwaysまたはinitialブロックでドライブする信号は // reg型でなければならない // ネット宣言 wire tc; // 他の信号はwire型。ポート宣言したwire型信号の // ネット宣言は省略可能であり、省略することも多い。 // always文。rstやclock信号の変化に同期し並列に実行される always @ (posedge rst or posedge clk) begin if (rst) begin // 非同期リセット count <= count_zero; end else if (cet || cep) begin // イネーブル if (count == length-1) begin count <= count_zero; end else begin count <= count + count_one; end end end // assign文。tcの値は実行中、継続的に値が与えられる assign tc = (cet && (count == length-1)); endmodule
ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。
プロセス(always とintialブロックのこと)内部からドライブされる信号はreg型である必要があり、他はwire型である。キーワードregが必ずしもハードウェアであるレジスタを意味するものではない(論理合成の結果、FFが割り当てられるとは限らない)。
次にその中のalways節を説明する。always節は、括弧内の信号が指定された条件の変化があったときに実行される。posedgeは信号が0から1に変化した場合を指定する。or は括弧内の信号のどれか1つでも変化した場合を指定する。
always節中の"<="オペレータは通常の手続き型言語と異なりハードウェア記述言語の特徴の一つであり、「ノン・ブロッキング代入」というものである。シミュレーション実行時に並列に評価される。下記の例の場合、cが変化すると、aとbへの代入が同時に行われる(aとbの値が交換される)。これは実際のフリップフロップの動作に近いものである。
reg a, b; wire c; always @(c) begin a <= b; b <= a; end
もう一つの代入文である"="はブロッキング代入といい、手続き型言語のように逐次実行される。下記の例の場合、bかeが変化すると、aに代入された後、bに対する代入が行われる。
reg a, b, c, d; wire e; always @(b or e) begin a = b & e; b = a | b; #5 c = b; d = #6 c ^ e; end
なお、#は時間経過を示す。この場合、単位時間5経過の後、cにbが代入される。またc^eは一時変数に記録され、単位時間6経過後にdに代入される。時間は秒など実時間の指定も出来る。
[編集] 主要ソフトウェア
[編集] 商用シミュレータ
- Verilog-XL、NC-Verilog ケイデンス社
- VCS シノプシス社
- ModelSim メンター社
[編集] フリー・シミュレータ
- icarus gEDAプロジェクト
- cver [1]
[編集] シェアウェアー・シミュレータ/ツール
[編集] 商用論理合成
- design_compiler シノプシス社
[編集] 関連項目
カテゴリ: コンピュータの利用 | ハードウェア記述言語 | 電子工学