ハードウェア記述言語
ハードウェア記述言語（ハードウェアきじゅつげんご、英: hardware description language、HDL）は、デジタル回路、特に集積回路を設計するためのコンピュータ言語ないしドメイン固有言語（DSL）である。回路の設計、構成を記述する。処理を検証するための試験（テストベンチ）記述ができ、シミュレーションできる開発環境もある。
プログラミング言語との類似性が見られる機能がある言語もあることから、プログラミング言語の一種などとする誤解が非常に多いが、間違いである。また、プログラマブルロジックコントローラの記述に用いられるラダー言語は別のものと扱われている。
概要
ハードウェア記述言語は、ハードウェアの動作仕様を記述するのに使う、文字で記述するコンピュータ言語で、電子回路の経時的振舞いと空間的構造を表現する。プログラミング言語と比較すると、ハードウェア記述言語の構文（シンタックス）や意味（セマンティックス）は、ハードウェアの基本的属性である時間や並行性を記述するものであり、全く異なるものである。回路の接続関係（コンポーネントと等電位点の列挙）を記述する言語として、ネットリストがある。
ハードウェア記述言語の処理系には、記述にもとづきネットリストやプログラマブルロジックデバイスのコンフィグレーションを生成する合成系と、記述に直接もとづきシミュレーションを行うシミュレータがある。シミュレータによってハードウェア設計者は実装前にハードウェアの動作を確認できる。シミュレータには、シミュレーションのレベルとして、ディジタルな事象としてのみ扱うものと、アナログな事象まで詳細に扱うものがある。アナログまで扱うように最初から設計された言語もあれば、拡張として追加された言語もある。
C++のようなプログラミング言語に実装した内部DSL（internal/embedded DSL）として実装されているSystemCのようなハードウェア記述言語もある。
プログラミング言語と同様に様々な言語がある。現在は米国防総省が開発に携わったAdaの流れを汲むVHDL、ゲートウェイ・デザイン・オートメーション社（Gateway Design Automation）が開発したVerilog HDLの標準化がまずIEEEで進み、その後IECの国際規格にもなり、広く普及している。
歴史
最初のハードウェア記述言語は、カーネギーメロン大学の「ISP」、カイザースラウテルン大学の「KARL」である。この二つの言語は1977年にほぼ同時に開発された。ISP はよりプログラミング言語的で、設計上の入力と出力の関係を記述する方式であった。ISP は設計のシミュレーションには使えるが、回路を生成することはできなかった。KARL は大規模集積回路の回路配置が記述可能な機能も持っていた。回路配置の記述機能は関連する対話型グラフィカル言語 ABL にもあった。1980年代初期にABLを使ったVLSI設計エディタをトリノの通信研究センター CSELT で開発している。1980年代中ごろ、欧州連合の委員会が出資した国際コンソーシアムが KARL と ABL を中心としたVLSI設計フレームワークを実装した。1983年、Data-I/O が ABEL を発表した。これはプログラム可能な論理回路を対象としたもので、主に有限状態機械の設計に使った。他に、日本で開発されたSFLがある。
最初の現代的意味でのハードウェア記述言語である Verilog は、1985年、ゲートウェイ・デザイン・オートメーション社が開発した。ケイデンス・デザイン・システムズがその権利を取得して Verilog-XL というシミュレータを開発し、これがその後約10年間で事実上の標準となった。1987年、アメリカ国防総省の要求で Ada 言語の流れを汲む VHDL を開発した。これらハードウェア記述言語とシミュレータによって、技術者はより抽象化されたレベルで設計が可能となり、回路規模も数百トランジスタから数千トランジスタへと拡大していった。
ハードウェア記述言語で記述されたプログラムから論理合成できるシステムが登場し、ハードウェア記述言語はデジタル設計の表舞台に立つようになった。合成ツールはハードウェア記述言語でRTLを記述したソースファイルをコンパイルし、製造可能な論理ゲートやトランジスタのネットリスト記述を生成する。当初のシステムでは、合成可能なRTLファイルを書くには熟練を要した。RTLで合成したネットリストは、従来の設計に比べるとサイズが大きく、性能も悪いことが多かった。熟練技術者による回路図による設計は、論理合成した同等の回路設計よりも常に優れていたが、論理合成の生産性の良さから、RTL合成が不得手としていた高速低電力な回路や非同期回路でもハードウェア記述言語が採用されていった。論理合成は、単にハードウェア記述言語をデジタル設計の中心に押し出しただけでなく、それ自体がデジタル回路設計のための画期的技術であった。回路図による設計とRTLによる設計は、プログラミング言語におけるアセンブリ言語による設計とC言語による設計の関係に似ている。
IEEEが VHDL と Verilog HDL を標準化したこともあり、VHDL と Verilog HDL は電子産業では事実上の標準となり、それら以外のハードウェア記述言語はあまり使われなくなっていった。しかし、VHDL と Verilog HDL には共通の弱点がある。どちらもアナログ回路やアナログとデジタルの混在した回路のシミュレーションが苦手であり、再帰的な論理構造を記述できない。そのような VHDL と Verilog HDL の弱点を克服するハードウェア記述言語もいくつか登場したが、VHDL や Verilog HDL を置換するには至っていない。
ハードウェア記述言語の改善は長年に渡っている。Verilog HDL から派生した SystemVerilog では、様々な新機能がある。VHDL の最新版でも SystemVerilog の拡張と同等の機能を持たせるよう開発が進んでいる。今後も VHDL と Verilog HDL の改良は続くという予測がある。
ハードウェア記述言語コードのシミュレーションとデバッグ
ハードウェア記述言語による設計の本質は、ハードウェア記述言語プログラムをシミュレーション可能な点にある。シミュレーションすることで、設計のハードウェア記述言語プログラム（モデル）が設計検証に合格するようにできる。設計検証は、コード実装（ハードウェア記述言語プログラム）がその設計が意図した機能（仕様）に対して妥当かを検証する重要なマイルストーンである。シミュレーションによって構造（アーキテクチャ）的な吟味もする。技術者は基本設計に対して複数の設計を実験的に書き、シミュレーションでそれらの動きを比較することができる。以上のようなことから、ハードウェア記述言語による設計ではシミュレーションが重要である。
ハードウェア記述言語で書かれたモデルをシミュレーションするには、テストベンチと呼ぶシミュレーション環境をまず記述する。テストベンチには少なくとも、モデルを実体（インスタンス）化したもの（Device Under Test、DUT）、そのモデルの入出力のためのピンと信号の宣言、クロック波形が必要である。テストベンチのコードはイベント駆動型である。テストベンチが生成するリセット信号の実装、インタフェース・トランザクション（ホストバスの読み書きなど）のモデリング、そしてDUTの出力モニタのための記述が必要となる。テストベンチを実行するソフトウェアをシミュレータと呼ぶ。シミュレータはテストベンチ内の全イベントの参照元となるシミュレータ・クロックを発生させる。イベントはテストベンチのプログラムが指示したときだけ発生するもの（テストベンチ内のコードでリセット信号を発生させるなど）と、およびそのようなイベントへの反応としてモデルが発生するものがある。最近のシミュレータはGUI化されており、デバッグツール一式も備えている。利用者は任意の時点でシミュレーションを中断/再開でき、ブレークポイントを設定でき、モデルの階層を監視／変更できる。さらにプログラム実行環境に利用者がコンパイルしたライブラリをPLI／VHPIインタフェースを通してリンクできるシミュレータもある。リンクは環境依存であり、シミュレータと利用者ライブラリのコンパイルとリンクは、HDL環境の外部で行う。
設計検証は、ソフトウェア開発工程で言えばソフトウェア試験（ソフトウェアテスト）とデバッグの工程である。設計工程の中でも最も時間がかかる可能性がある。試験結果によっては大きな設計変更もありうるため、シミュレータ環境で最初に行う。ただし、厳密に定義したコーディング規約に基づいているかどうかの検査を先に行うことにより、試験作業を大幅に短縮することもできる。プログラムをハードウェアで検証する目的でPLD（プログラマブルロジックデバイス）、FPGAを使うこともある。ハードウェアを使ったプロトタイピングはシミュレーションよりも費用がかかるが、シミュレーションではわからない設計上の問題点が明らかになることもある。他のハードウェアとのインタフェースの確認はハードウェアによるプロトタイピングが最善の方法である。FPGAは、シミュレータより高速に動作するだけでなく、実際に並行実行するための時間的な問題について検出可能である。
ハードウェア記述言語での設計検証
歴史的に、設計検証は労力を要する工程であり、テストケースを書いてはシミュレーション実行するということをDUTに対して繰り返す。チップが大規模かつ複雑になるにつれて、設計検証も開発期間の大部分を占めるようになってきた。設計の生産性を向上させるべく、特性仕様言語が開発された。
形式的検証において、「プロパティ」とは、オブジェクトの期待される振る舞いや推定される振る舞いに関する事実を記した文である。理想的には、ハードウェア記述言語プログラムが与えられたとき、プロパティは形式的数学的手法で真偽を証明可能である。実際には、多くのプロパティは無限の解空間を占めるため、真偽を証明できない。しかし、前提や制約が与えられると解空間が狭められ、プロパティチェッカ・ツールで真偽を証明できるプロパティが増える。
表明は回路の動作をモデルとしたものではなく、むしろ設計者の意図を捉え、ハードウェア記述言語コード内に込めるものと言える。シミュレーション環境では、シミュレータは全ての指定された表明を評価し、表明に違反した箇所と違反の程度を報告する。合成環境では、表明違反があれば、合成が中断されることもある。表明に基づく検証はまだ始まったばかりの手法だが、ハードウェア記述言語による設計の必須な部分となると予測されている。
ハードウェア記述言語とプログラミング言語
ハードウェア記述言語はプログラミング言語と似ているが、異なるものである。（近年の並列・並行プログラミング言語を例外として）プログラミング言語は基本的には手続き的で、並行・並列性に対応する構文・意味は限定的であるものがほとんどである。一方ハードウェア記述言語は、複数の並列処理するコンポーネント（フリップフロップ、加算器など）をモデル化でき、各コンポーネントは自動的に互いに独立に実行する。入力を変化させると、変化をトリガとして自動的にシミュレータのプロセススタックを更新する。
プログラミング言語ではコンパイラにより機械語を生成し、ハードウェア記述言語ではシンセサイザ（合成系）でネットリストを生成する。後者もコンパイルと呼ぶものもあるが、目的と対象が異なる。プログラミング言語のコンパイラはソースコードをプロセッサ固有の機械語に変換し、そのプロセッサ上で実行可能な形式にする。ハードウェア記述言語のシンセサイザは、ソースコードから物理的に実装可能なゲートのネットリストを生成する。ネットリストには様々な形態があり、ゲート遅延情報を持つシミュレーション・ネットリスト、下工程用のハンドオフ・ネットリスト、汎用の標準ネットリストであるEDIFなどがある。なお、プログラミング言語におけるインタプリタは、ハードウェア記述言語ではシミュレータに相当する（性能上の理由などのために、シミュレーションを実行する実行可能プログラムを生成するタイプのシミュレータもある）。
ハードウェア記述言語には、プログラミング言語用のプリプロセッサを流用しているものもある。
ハードウェア記述言語の意味論には、厳密でないものもあり、記述がまずいとシミュレーションと合成結果のふるまいが異なることがある、というものもある。
以上で述べたように、基本的にはハードウェア記述言語はプログラミング言語と異なるものであるが、より高水準からの記述を求めたハードウェア記述言語があり、一方で並列・並行の記述を言語機能に持つプログラミング言語もあるため、共通する要素を持つものもそれぞれあらわれている。
電子システムがますます複雑化するにつれ、再構成処理（再構成可能コンピューティング）が増えていることと、どちらも設計できる技術者の必要性から、ハードウェア記述言語としてもプログラミング言語としても使える言語への要求が高まりつつある。
一例として SystemC があり、組み込みシステムのハードウェアを詳細の不明なアーキテクチャ上のブロック（入出力信号がモデル化されたブラックボックス）としてモデル化できる。SystemC の高度に抽象化したモデル記述は、初期のアーキテクチャ選定に適している。
システムレベル設計
当初、ハードウェア記述言語は大規模集積回路のシミュレーションを目的に開発されたが、論理合成技術の開発によってハードウェア記述言語での記述からの論理回路生成の自動化ができるようになった。現在、RTLでの設計より更に高い抽象度でのハードウェア設計を可能とする高位合成技術の開発が進んでおり、メンター・グラフィックス社が提供する Catapult C Synthesis やシノプシス社のSynphony C Compiler などに例を挙げられるような、いくつかのツールが市販されている。RTLの上位に位置するのは、振舞い（ビヘイビア・レベル）と呼び、ハードウェアの動作やアルゴリズムを記述する。特にこの振舞いの記述を対象とした高位合成を動作合成と呼ぶ。
この振舞い記述では、ハードウェアをプログラミング言語によるソフトウェアの記述と殆ど同様の考えで記述することになる。ここから、ハードウェアとソフトウェアを同時に、区別なく設計・合成する技術の研究開発も進んでいる。ハードウェア・ソフトウェア協調設計（コデザイン、co-design）は、ソフトウェア技術者がハードウェア記述言語プログラムを理解し、ハードウェア技術者がソフトウェアプログラムを理解することによって、加速していく可能性がある。
こうした高位合成技術、協調設計技術を総合してシステムレベル設計またはシステム設計技術と呼ぶ。これらの技術を用いて、ハードウェアとソフトウェアとを区別なく、ソフトウェアの記述と同等の抽象度で論理（デジタル）システム全体を記述することをシステムレベル設計と呼ぶこともある。
このようなシステムレベル設計に用いる言語として、C言語を拡張した SpecC、C++のテンプレートライブラリとして実現したSystemC、Verilog HDLを拡張したSystemVerilogなどがある。特に SpecC や SystemC など、C/C++をベースにした言語による設計をC言語設計と呼び、日本ではシステムレベル設計といえばC言語設計を指すこともある。
アナログ回路設計への拡張
ハードウェア記述言語はデジタル回路を対象としているが、これを拡張してアナログ回路を記述できるようにする動きもある。主たる目的はアナログ回路、もしくはアナログ - デジタル混載回路のシミュレーションである。
これに該当する言語としてVerilog-AMSやVHDL AMSがある。