Verilog
改行文字は加えない。
$fscanf — ファイルから書式指定で文字列を読み込む。(*Verilog-2001)
$fclose — オープンしたファイルハンドルを閉じて開放する。
$readmemh — 16進数ファイルの内容をメモリ配列に読み込む。
$readmemb — バイナリファイルの内容をメモリ配列に読み込む。
$monitor — 何らかの変更が発生した時に、すべての変数リストを出力する。
$time — 現在のシミュレーション時刻の値。
$dumpfile — VCD(Value Change Dump)フォーマットでの出力ファイル名を宣言する。
$dumpvars — 変数を有効にしてダンプする。
$dumpports — 変数を有効にしてExtended-VCDフォーマットでダンプする。
$random — ランダムな値を返す。
ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。always節は、括弧内の信号を指定した条件に変化があったときに実行される。posedgeは信号が0から1に変化した場合を指定する。orは括弧内の信号のどれか1つでも変化した場合を指定する。上記のように、resetに合わせてreg型を初期化するのが基本的なデザインパターンである。
ディレイの例は以下の通りである。
上記のalways節は、もう1つの使い方を示している。たとえば、上の例では、リストに含まれる要素(bまたはe)が変化したタイミングでいつでもalways節が実行される。いずれかの変数が変化すると、即座に新しい値がaに代入される。ブロッキング代入文を使用しているため、bにはその代入後に(aの新しい値を用いて)新しい値が代入される。5単位時間のディレイの後、cにbの値が代入されると同時に、c ^ eの値が計算され、見えない保管場所に一時的に保存される。6単位時間後、保管されていた値がdに代入される。
プロセス内(initialまたはalwaysブロック内)で操作される信号は、reg型を持つ必要がある。また、プロセスの外で操作される信号はwire型を持たなければならない。この時使われるregという名前は、必ずしもハードウェアのレジスタを意味するわけではない。
構文の違いとしては、変数宣言にビット幅が必要であることや、手続きブロックの宣言の相違(カーリー・ブレイス{}の代わりにbegin/endを使用する)があり、その他多数の細かな違いがある。Verilogは変数に固定サイズを与えなければならないが、C言語の場合はサイズは変数の「型」から推定される(たとえば、integer型は8ビットであると)。
Verilogのコードはモジュールの階層(英語版)から構成する。モジュールは設計の階層をカプセル化し、他のモジュールとは、宣言された入力、出力、必要に応じて双方向ポートを使用して通信する。モジュールの内部では、net/変数の宣言(wire、reg、integerなど)、並行または逐次のステートメントブロック、他のモジュールのインスタンス(サブ階層)などの、あらゆる組み合わせが記述できる。逐次的な文は、begin/endブロック内に配置し、ブロック内では逐次的に実行される。しかし、ブロック自体は並列に実行されるため、この特徴によりVerilogはデータフロー言語となっている。
次に、配線を示すwire、記憶素子を示すregとサブモジュールのリストなどを定義する。さらに、続いてその動作を規定するステートメントやステートメントをグループにしたブロック群を定義する。ブロックはbeginキーワードで始まり、endキーワードで終わる範囲で定義し、ブロック内はステートメントが並列に実行される。逐次実行したい場合は、ブロッキング代入を使うか、クロックのタイミングを待つ書き方をする。各ブロックは並列に実行される。
有償 Incisive Enterprise Simulator (Verilog-XL、NC-Verilog) ケイデンス社 VCS シノプシス社 ModelSim メンター・グラフィックス社 VeriLogger Extreme シナプチキャド社 Veritak FinSim Aldec Active-HDL Dolphine SMASH Axiom MPSim ISim Xilinx社 (制限付き版は無償)
無償 Icarus Verilog GPL Cver Verilator VeriWell Verilog Simulator