Verilog
IEEE/IEC 62530-2011 - SystemVerilog – Unified Hardware Design, Specification, and Verification Language として、Verilog HDLとSystem Verilogの文書を一本化した。
fork/joinのペアは、Verilog内で並列処理を作るために使われる。fork/joinのペアの間にある文(またはブロック)は、実行フローでforkに到達したタイミングで同時に実行が開始され、forkとjoinの間で最も長い時間実行される文またはブロックの終了後、残りのコードの実行が再開する。
上のように書いた場合、出力は"ABC"または"BAC"のいずれにもなる可能性がある。最初の$writeと2番目の$writeのシミュレーションの実行順序は、シミュレータの実装に依存するためである。シミュレータによっては、意図的に順序をランダム化していることもある。そのため、偶然競合状態が起きたり、意図的な非決定的な振る舞いをする場合がある。
VHDLは、Verilogとは違い、複数のプロセスを動的に生成することはできない。
やがてOpenVeraやVerisityのE言語のようなハイ・レベルの検証言語が登場する。このことはその種の機能を盛り込んだVerilog、すなわちコデザイン・オートメーション社によるSuperlogの開発を促すこととなった。コデザイン・オートメーション社は、シノプシスによってその後買収された。SuperlogとVeraの基本部分はAccelleraに寄贈され、次のIEEE標準としてSystemVerilogとVerilogとに分かれた。
IEEE 1364-2005 として規格化。その際、上位互換の SystemVerilog IEEE 1800-2005 も作った。
簡単な2フリップフロップの例を以下に示す。
Verilogにおける"<="演算子は、普通の手続き型言語とは異なる、ハードウェア記述言語としてのもう1つの側面である。この演算子は「ノンブロッキング」代入文として知られ、alwaysブロックが実行されるまでアクションは登録されない。つまり、代入文を書いた順序は無関係であり、必ず同じ結果が生じる。そのため、flop1とflop2はクロックごとに値がスワップされることになる。
もう1つの代入演算子である"="は、ブロッキング代入文と呼ばれる。"="による代入が行われると、代入先の値は即座に更新される。もし上の例で"<="の代わりにブロッキング演算子の"="を使用したとすると、flop1とflop2の値はスワップされず、手続き型プログラミング言語のように、コンパイラはflop1の値をflop2の値にセットするのだと解釈する(その結果、flop2とflop1の値にセットするという冗長な論理は無視されることになる)。
モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。