Verilog(ヴェリログ)は、デジタル回路の設計用の論理シミュレータであり、そこで使用するハードウェア記述言語でもある。両者を区別する場合、言語の方を「Verilog HDL」と呼ぶ場合もある。 言語の開発にあたっては、ソフトウェア開発者にも受け入れられるようにという名分で、プログラミング言語のC言語やPascalの要素のように見えるもの(実際には、記述対象がソフトウェアではなくハードウェアという違うものなので「見える」というだけだが)取り入れたものだとされている。後継言語はSystemVerilogで、だいたいVerilogのスーパーセットである。IEEE 1364-2005として標準化しIEC国際規格にもなり, System Verilogの規格と統合して IEEE/IEC 62530:2011 SystemVerilog - Unified Hardware Design, Specification, and Verification Language となっている。CPU 上で動くプログラミング言語との相違点として、文(ステートメント)の実行は並列実行を基本とし、逐次実行も記述できる。これは、並列動作する電子回路を記述する言語だからである。また、Verilogモデルは実際のハードウェアの構成に近いモジュールの階層を構成できる。モジュールではまず、入力/出力端子、必要に応じて双方向端子を宣言する。次に、配線を示すwire、記憶素子を示すregとサブモジュールのリストなどを定義する。さらに、続いてその動作を規定するステートメントやステートメントをグループにしたブロック群を定義する。ブロックはbeginキーワードで始まり、endキーワードで終わる範囲で定義し、ブロック内はステートメントが並列に実行される。逐次実行したい場合は、ブロッキング代入を使うか、クロックのタイミングを待つ書き方をする。各ブロックは並列に実行される。Verilog 言語には、論理合成を適用して実際の回路に変換可能な記述(設計機能)とそうではない部分(検証機能)がある。検証機能はテストやデバッグ時にシミュレータ上で実行する際に使われる。設計中のモジュールが全て合成可能なステートメントだけで記述している場合、適切なソフトウェアを用いて半導体チップの回路、さらにレイアウトデータまで変換することができる。「Verilog-HDL」という表記が用いることがあるが、IEEEなどの文書では「Verilog」と「HDL」との間にハイフンが入らない「Verilog HDL」と表記している。Verilogは、ゲートウェイ・デザイン・オートメーション社が、ハードウェア・モデリング言語とそのためのシミュレータとして1984年頃開発した。その後、同社は1990年にケイデンス・デザイン・システムズが買収した。ケイデンスは、現在も大元のゲートウェイVerilogおよびVerilog-XL論理シミュレータの版権を持っている。同種のハードウェア記述言語であるVHDLの台頭に対し、ケイデンスはVerilogの規格を公開し標準化する道をとった。すなわちケイデンスはOVI(Open Verilog International)という組織へ版権の一部を移譲した。その後VerilogをIEEEに提出しIEEE 1364-1995として規格化し、Verilog-1995と呼ぶ。なおOVIはその後Accelleraという組織になっている。標準化にともないVerilogシミュレータは、ケイデンス以外の各社やフリーのものも各種登場するようになった。オリジナルのVerilog標準に対する不満を解消するために、Verilog-95に対する拡張をIEEEに提出した。この拡張はVerilog 2001といいIEEE 1364-2001になった。VHDLにあったgenerate文に対応し、大規模設計が容易になった。やがてOpenVeraやVerisityのE言語のようなハイ・レベルの検証言語が登場する。このことはその種の機能を盛り込んだVerilog、すなわちコデザイン・オートメーション社によるSuperlogの開発を促すこととなった。コデザイン・オートメーション社は、シノプシスによってその後買収された。SuperlogとVeraの基本部分はAccelleraに寄贈され、次のIEEE標準としてSystemVerilogとVerilogとに分かれた。言語の最新のバージョンは、アナログ素子および回路の機能記述を行うための言語であるVerilog-Aを包含し、さらにアナログ/デジタルのミックス・シグナル・モデルへの対応もなされており、Verilog-AMSという。IEEE 1364-2005 として規格化。その際、上位互換の SystemVerilog IEEE 1800-2005 も作った。IEEE/IEC 62530-2011 - SystemVerilog – Unified Hardware Design, Specification, and Verification Languageとして、Verilog HDLとSystem Verilogの文書を一本化した。上記のようにbegin、end、functionなどはPascalの文法を、オペレータや条件、繰り返し処理はC言語の文法を流用している。Verilogの最小単位はモジュールである。以下に、カウンタ回路の例で説明する。モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。プロセス(always とintialブロックのこと)内部からドライブする信号はreg型である必要があり、他はwire型である。キーワードregが必ずしもハードウェアであるレジスタを意味するものではない(論理合成の結果、FFを割り当てるとは限らない)。次にその中のalways節を説明する。always節は、括弧内の信号を指定した条件に変化があったときに実行する。posedgeは信号が0から1に変化した場合を指定する。or は括弧内の信号のどれか1つでも変化した場合を指定する。上記のように reset に合わせて reg型を初期化するのが基本的なデザインパターンである。always節中の"<="オペレータはCPU上で動く通常の手続き型言語と異なりハードウェア記述言語の特徴の一つであり、「ノン・ブロッキング代入」というものである。シミュレーション実行時に並列に評価する。下記の例の場合、cが変化すると、aとbへの代入を同時に行う(aとbの値を交換する)。これは実際のフリップフロップの動作に近いものである。もう一つの代入文である"="はブロッキング代入といい、手続き型言語のように逐次実行する。下記の例の場合、bかeが変化すると、aに代入された後、bに対する代入を行う。なお、#は時間経過を示し、シミュレーション時に使う。この場合、単位時間5経過の後、cにbを代入する。またc^eは一時変数に記録し、単位時間6経過後にdに代入する。時間は秒など実時間の指定も出来る。
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。