コンピュータ工学において、ハードウェア記述言語(HDL)は、電子回路の構造と動作を記述するために使用される特殊なコンピュータ言語であり、通常は特定用途向け集積回路(ASIC)の設計やフィールドプログラマブルゲートアレイ(FPGA)のプログラミングに使用されます。
ハードウェア記述言語(HDL)は、電子回路を正確かつ形式的に記述することを可能にし、回路の自動解析とシミュレーションを実現します。また、 HDL記述をネットリスト(物理的な電子部品とその接続方法を記述した仕様)に合成することも可能で、このネットリストを配置配線することで、集積回路を作成するためのマスクセットが生成されます。
ハードウェア記述言語(HDL)は、 C言語やALGOLなどのプログラミング言語によく似ています。式、文、制御構造からなるテキストによる記述です。ほとんどのプログラミング言語とHDLの重要な違いの一つは、HDLには時間の概念が明示的に含まれている点です。
HDLは、特に特定用途向け集積回路、マイクロプロセッサ、プログラマブルロジックデバイスなどの複雑な回路において、電子設計自動化(EDA)システムの不可欠な部分を形成します。
1970年代以降、デジタル電子回路の複雑さが爆発的に増大したため(ムーアの法則を参照)、回路設計者は、エミッタ結合ロジック(ECL)、トランジスタ・トランジスタロジック(TTL)、相補型金属酸化膜半導体(CMOS )などの特定の電子技術に縛られることなく、高レベルでデジタル論理記述を実行する必要があった。HDLは、回路のデータフローとタイミングのモデルであるレジスタ転送レベルの抽象化を実装するために作成された。 [ 1 ]
ハードウェア記述言語には、VHDLとVerilogという2つの主要な言語が存在します。これらの言語では、データフロー、動作記述、構造記述という3種類の記述方法があります。VHDLのデータフローの例を以下に示します。
LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164. ALL ;ENTITY not1 IS PORT ( a : IN STD_LOGIC ; b : OUT STD_LOGIC ); END not1 ;ARCHITECTURE behavioral OF not1 IS BEGIN b <= NOT a ; END behavioral ;HDLは、電子システムの構造と時間経過に伴う動作をテキストベースで表現する標準的な言語です。並行プログラミング言語と同様に、HDLの構文と意味論には、並行性を表現するための明示的な表記法が含まれています。ただし、ほとんどのソフトウェアプログラミング言語とは異なり、HDLにはハードウェアの主要な属性である時間の概念も明示的に含まれています。ブロックの階層間の回路接続を表現することだけが特徴である言語は、電気コンピュータ支援設計で使用されるネットリスト言語として適切に分類されます。HDLは、同じ回路機能に対して、構造レベル、動作レベル、またはレジスタ転送レベルのアーキテクチャで設計を表現するために使用できます。後者の2つのケースでは、シンセサイザがアーキテクチャと論理ゲートのレイアウトを決定します。
HDLは、ハードウェアの実行可能な仕様を記述するために使用されます。言語ステートメントの基本的な意味論を実装し、時間の経過をシミュレートするように設計されたプログラムにより、ハードウェア設計者は、ハードウェアを物理的に作成する前にそのモデルを作成することができます。この実行可能性こそが、HDLがプログラミング言語であるかのような錯覚を与える要因ですが、より正確には、仕様言語またはモデリング言語に分類されます。離散イベント(デジタル)モデリングと連続時間(アナログ)モデリングの両方をサポートするシミュレータが存在し、それぞれに対応したHDLが利用可能です。
ハードウェアの意味論を、データフローとは対照的に制御フローの意味論に基づいて動作するC++などの従来のプログラミング言語で表現することは確かに可能ですが、そのためには、プログラムに膨大で扱いにくいクラスライブラリを追加する必要があります。しかし一般的に、ソフトウェアプログラミング言語には時間を明示的に表現する機能がないため、ハードウェア記述言語として機能することはできません。2002年にSystem Verilogが登場する以前は、 C++とロジックシミュレータの統合が、ハードウェア検証でオブジェクト指向プログラミングを使用する数少ない方法の1つでした。System Verilogは、オブジェクト指向とガベージコレクションを提供する最初の主要なHDLです。
適切なハードウェア記述言語のサブセットを使用することで、シンセサイザまたは論理合成ツールと呼ばれるプログラムは、言語ステートメントからハードウェアの論理演算を推論し、指定された動作を実装するための汎用ハードウェアプリミティブの等価なネットリストを生成できます。シンセサイザは通常、テキスト内のタイミング構造の表現を無視します。たとえば、デジタル論理シンセサイザは、一般的にクロックエッジを回路のタイミング測定方法として使用し、タイミング構造を無視します。言語の合成可能なサブセットを持つことができるというだけで、ハードウェア記述言語になるわけではありません。
最初のハードウェア記述言語は1960年代後半に登場し、より伝統的な言語に似ていました。[ 2 ]永続的な影響を与えた最初のものは、1971年にC.ゴードン・ベルとアレン・ニューウェルの著書『コンピュータ構造』で説明されました。[ 3 ]この書籍では、レジスタ転送レベルの概念が導入され、これは最初にISP言語でDigital Equipment Corporation (DEC) PDP-8の動作を記述するために使用されました。[ 4 ]
DECのPDP-16 RTレベルモジュール(RTM)と、その使用法を解説した書籍の登場により、この言語はより広く普及しました。[ 5 ] その後、少なくとも2つの基本的なISP言語(ISPLとISPS)の実装が続きました。[ 6 ] [ 7 ] ISPSは設計の入力と出力の 関係を記述するのに適しており、DECの商用チームや、米国および北大西洋条約機構(NATO)の同盟国のいくつかの研究チームによってすぐに採用されました。
RTM製品は商業的に成功せず、新しい製造方法、特に超大規模集積回路(VLSI)が普及するにつれて、DECは1980年代半ばに販売を中止した。
1979 年頃にカイザースラウテルン大学で行われた別の研究により、VLSI チップのフロアプランニングと構造化ハードウェア設計をサポートする設計計算言語機能を含むKAiserslautern Register Transfer Language (KARL)という言語が開発されました。この研究は、KARL の対話型グラフィック姉妹言語である ABL の基礎にもなりました。ABL という名前は、「ブロック図言語」の頭文字をとったものです。 [ 8 ] ABL は 1980 年代初頭にイタリアのトリノにある Centro Studi e Laboratori Telecomunicazioni ( CSELT ) によって実装され、ABLED グラフィック VLSI 設計エディタが開発されました。1980 年代半ばには、欧州連合委員会の資金提供を受けた国際コンソーシアムによって、KARL と ABL を中心とした VLSI 設計フレームワークが実装されました。[ 9 ]
1970年代後半には、プログラマブルロジックデバイス(PLD)を用いた設計が普及したが、これらの設計は主に有限状態機械の設計に限られていた。 1980年、データ・ゼネラル社では、これらのデバイスを用いてデータ・ゼネラル・エクリプスMV/8000を設計し、それらに適合するプログラミング言語に対する商業的なニーズが高まり始めた。そして1983年、データI/O社はそのニーズを満たすべくABELを発表した。
1985年、設計がVLSIに移行するにつれて、Gateway Design AutomationはVerilogを導入し、IntermetricsはVHSICハードウェア記述言語(VHDL )の最初の完成版をリリースしました。VHDLは、米国国防総省の超高速集積回路プログラム(VHSIC)の要請により開発され、 Adaプログラミング言語と、ISPSの以前の開発で得られた経験に基づいています。[ 10 ]当初、VerilogとVHDLは、すでに別の形式(回路図ファイルなど)で取得および記述されている回路設計を文書化およびシミュレーションするために使用されました。HDLシミュレーションにより、設計者は回路図レベルでのシミュレーションよりも高いレベルの抽象化で作業できるようになり、設計容量が数百個のトランジスタから数千個に増加しました。1986年、米国国防総省の支援を受けて、VHDLはIEEE規格(IEEE Std 1076)として承認され、IEEE規格に準拠した最初のVHDLバージョンであるIEEE Std 1076-1987が1987年12月に承認されました。その後、 Cadence Design SystemsはGateway Design Automationを買収し、Verilog-XLの権利を取得しました。Verilog-XLは、その後10年間、Verilogシミュレータの事実上の標準となるHDLシミュレータです。
HDL の論理合成の導入により、HDL はデジタル設計のバックグラウンドから前面へと押し上げられました。合成ツールは、HDLソースコードファイル (RTL と呼ばれる制約付きフォーマットで記述) を、論理ゲートとトランジスタの観点から製造可能なネットリスト記述にコンパイルします。合成可能な RTL ファイルを作成するには、設計者の熟練と規律が必要でした。従来の回路図レイアウトと比較すると、合成された RTL ネットリストは、面積が大きく、パフォーマンスが遅くなることがほとんどでした。熟練した設計者が労力をかけて回路図作成/手動レイアウトを行った回路設計は、論理的に合成された同等の回路設計よりも常に優れたパフォーマンスを発揮しましたが、合成による生産性の優位性により、デジタル回路図作成は、RTL 合成が問題となる領域、つまり超高速、低消費電力、または非同期回路に取って代わられることになりました。
数年のうちに、VHDLとVerilogは電子業界で主流のHDLとして台頭し、古くて機能の劣るHDLは徐々に姿を消していきました。しかし、VHDLとVerilogは、アナログ回路や混合信号回路のシミュレーションには不向きであるなど、多くの共通の制約を抱えています。VerilogとVHDLの特定の制約を解消することを明確な目的として、Confluenceなどの特殊なHDLが導入されましたが、これらはVerilogとVHDLを完全に置き換えることを意図したものではありませんでした。
長年にわたり、HDLの改良に多大な努力が注がれてきました。Verilogの最新バージョンであるIEEE 1800-2005 SystemVerilogは、テストベンチのランダム化、設計階層、および再利用性の向上に対する高まるニーズに対応するため、多くの新機能(クラス、乱数変数、プロパティ/アサーション)を導入しています。VHDLの次期改訂版も開発中で、SystemVerilogの改良点に匹敵するものになると期待されています。
HDL を使用することで効率性が向上するため、現代のデジタル回路設計の大部分は HDL を中心に展開されています。ほとんどの設計は、要件のセットまたは高レベルのアーキテクチャ図から始まります。制御構造と決定構造は、フローチャートアプリケーションでプロトタイプを作成するか、エディタに入力することがよくあります。HDL 記述のプロセスは、回路の性質と設計者のコーディング スタイルの好みに大きく依存します。HDL は単なる「キャプチャ 言語」であり、多くの場合、C++ の数学的モデルなどの高レベルのアルゴリズム記述から始まります。設計者は、Perlなどのスクリプト言語を使用して、HDL 言語で反復的な回路構造を自動的に生成することがよくあります。専用のテキスト エディタには、自動インデント、構文依存の色付け、エンティティ/アーキテクチャ/信号宣言のマクロベースの展開などの機能があります。
HDLコードはその後、コードレビュー(監査)を受けます。合成の準備として、HDL記述は一連の自動チェッカーによるチェックを受けます。チェッカーは、標準化されたコードガイドラインからの逸脱を報告し、誤解を招く可能性のある曖昧なコード構造を特定し、浮動ポートや短絡出力などの一般的な論理コーディングエラーをチェックします。このプロセスにより、コード合成前にエラーを解決することができます。
業界用語では、HDL設計は一般的に合成段階で終了します。合成ツールがHDL記述をゲートネットリストにマッピングすると、ネットリストはバックエンド段階に渡されます。物理技術(FPGA、ASICゲートアレイ、ASIC標準セルなど)によっては、バックエンドフローにおいてHDLが重要な役割を果たす場合とそうでない場合があります。一般的に、設計フローが物理的に実現可能な形に近づくにつれて、設計データベースには、汎用的なHDL記述には格納できない技術固有の情報が徐々に蓄積されていきます。最終的に、集積回路が製造されるか、使用のためにプログラムされます。
HDL設計において不可欠なのは、HDLプログラムをシミュレーションできる機能です。シミュレーションによって、設計のHDL記述(モデルと呼ばれる)が設計検証に合格することができます。設計検証とは、設計の意図された機能(仕様)がHDL記述内のコード実装と整合していることを検証する重要なマイルストーンです。また、シミュレーションはアーキテクチャの探索も可能にします。設計者は、基本設計の複数のバリエーションを作成し、シミュレーションでそれらの動作を比較することで、設計上の選択肢を試すことができます。このように、シミュレーションはHDL設計の成功に不可欠です。
HDLモデルをシミュレートするために、設計者はトップレベルのシミュレーション環境(テストベンチと呼ばれる)を作成します。テストベンチには、少なくともモデルのインスタンス(テスト対象デバイス、DUTと呼ばれる)、モデルの入出力(I/O)のピン/信号宣言、およびクロック波形が含まれます。テストベンチコードはイベント駆動型です。設計者は、(テストベンチで生成された)リセット信号を実装したり、インターフェーストランザクション(ホストバスの読み書きなど)をモデル化したり、DUTの出力を監視したりするためのHDLステートメントを作成します。テストベンチを実行するプログラムであるHDLシミュレータは、シミュレータクロックを維持します。このクロックは、テストベンチシミュレーションにおけるすべてのイベントのマスターリファレンスとなります。イベントは、テストベンチのHDLによって指定された瞬間(テストベンチにコード化されたリセットトグルなど)にのみ発生するか、刺激やトリガーイベントに対する(モデルによる)反応として発生します。最新のHDLシミュレータは、デバッグツール一式を備えたフル機能のグラフィカルユーザーインターフェース( GUI)を搭載しています。これにより、ユーザーはいつでもシミュレーションを停止および再開したり、シミュレータのブレークポイント(HDLコードとは独立)を挿入したり、HDLモデル階層内の任意の要素を監視または変更したりできます。また、最新のシミュレータは、定義済みのPLI / VHPIインターフェースを介して、HDL環境をユーザーがコンパイルしたライブラリにリンクすることもできます。HDLシミュレータとユーザーライブラリはHDL環境の外部でコンパイルおよびリンクされるため、リンクはシステム(Windows、Linux、Solaris上で動作するx86、SPARCなど)に依存します。
設計検証は、デバイスの機能仕様、設計者による仕様の解釈、およびHDL言語の不正確さの間の乖離により、設計プロセスの中で最も時間のかかる部分となることが多い。設計の初期段階では回路が頻繁に大きく変更されるため、初期のテスト/デバッグサイクルの大部分はHDLシミュレータ環境で行われる。HDL記述はハードウェアでプロトタイプを作成してテストすることもできる。この目的にはプログラマブルロジックデバイスがよく使用される。ハードウェアプロトタイピングはHDLシミュレーションに比べてコストがかかるが、設計の現実世界における状況を把握できる。プロトタイピングは、他のハードウェアデバイスやハードウェアプロトタイプとのインターフェースを確認する最良の方法である。低速なFPGA上で動作するものでも、純粋なHDLシミュレーションよりもはるかに短いシミュレーション時間で済む。
従来、設計検証は、テスト対象設計に対してシミュレーションテストケースを作成して実行するという、骨の折れる反復作業でした。チップ設計が大規模化、複雑化するにつれて、設計検証の作業は拡大し、今では設計チームのスケジュールの大部分を占めるようになりました。設計生産性を向上させる方法を模索する中で、電子設計自動化業界はプロパティ仕様言語を開発しました。
形式検証の観点から言えば、プロパティとは、別のオブジェクトの期待される、あるいは想定される動作に関する事実的な記述のことです。理想的には、与えられたHDL記述に対して、1つまたは複数のプロパティを形式的な数学的手法を用いて真偽を証明できます。しかし実際には、多くのプロパティは解空間が無限であるため、証明できません。ただし、動作に関する仮定や制約のセットが与えられれば、プロパティチェッカーは解空間を絞り込むことで、特定のプロパティを証明(または反証)することができます。
アサーションは回路の動作をモデル化するものではなく、HDLコードにおける設計者の意図を捉え、文書化するものです。シミュレーション環境では、シミュレータが指定されたすべてのアサーションを評価し、違反箇所とその深刻度を報告します。合成環境では、合成ツールは通常、違反が見つかった時点で合成を停止するポリシーで動作します。アサーションベースの検証はまだ発展途上ですが、HDL設計ツールセットの不可欠な要素となることが期待されています。
HDLはソフトウェアプログラミング言語と大まかに似ていますが、大きな違いがあります。ほとんどのプログラミング言語は本質的に手続き型(シングルスレッド)であり、並行処理を扱うための構文的および意味論的なサポートは限られています。一方、HDLは、複数の並列プロセス(フリップフロップや加算器など)をモデル化できる点で、並行プログラミング言語に似ています。これらのプロセスは互いに独立して自動的に実行されます。プロセスの入力に変更があると、シミュレータのプロセススタックが自動的に更新されます。
プログラミング言語とHDLはどちらもコンパイラ(HDLの場合はシンセサイザと呼ばれることが多い)によって処理されますが、その目的は異なります。HDLの場合、「コンパイル」とは論理合成、つまりHDLコードリストを物理的に実現可能なゲートネットリストに変換するプロセスを指します。ネットリストの出力形式は様々で、ゲート遅延情報を含む「シミュレーション」ネットリスト、合成後の半導体ダイ上での配置と配線用の「ハンドオフ」ネットリスト、あるいは汎用的な業界標準の電子設計交換フォーマット(EDIF)(後でJEDEC形式ファイルに変換するため)などがあります。
一方、ソフトウェアコンパイラは、ソースコードリストを、ターゲットマイクロプロセッサ上で実行可能なマイクロプロセッサ固有のオブジェクトコードに変換します。HDLとプログラミング言語は互いに概念や機能を借用し合うため、両者の境界は曖昧になりつつあります。しかし、汎用プログラミング言語がハードウェアのモデリングに適さないのと同様に、純粋なHDLは汎用アプリケーションソフトウェアの開発には不向きです。
しかし、電子システムがますます複雑化し、再構成可能なシステムが普及するにつれて、ハードウェア設計とソフトウェアプログラミングの両方のタスクを実行できる単一の言語に対する業界のニーズが高まっています。SystemCはその一例です。組み込みシステムのハードウェアは、詳細を省略したアーキテクチャブロック(モデル化された信号入力と出力ドライバを備えたブラックボックス)としてモデル化できます。ターゲットアプリケーションはCまたはC++で記述され、ホスト開発システム向けにネイティブコンパイルされます。これは、組み込みCPUをターゲットとする場合とは対照的です。組み込みCPUをターゲットとする場合は、組み込みCPUのホストシミュレーションまたはエミュレートされたCPUが必要になります。
SystemCモデルの抽象度が高いことは、初期段階のアーキテクチャ探索に非常に適しています。なぜなら、シグナルレベルの実装上の問題をほとんど気にすることなく、アーキテクチャの変更を容易に評価できるからです。しかし、SystemCで使用されるスレッドモデルは共有メモリに依存しているため、並列実行や低レベルモデルをうまく処理できません。
HDLは、その抽象度においてアセンブリ言語と比較されることがある。HDLにおけるプログラミングの複雑さを軽減するために、ハードウェア設計の抽象度を高めようとする試みがあり、その結果、高位合成と呼ばれる分野が生まれた。
Cadence、Synopsys、Agility Design Solutionsなどの企業は、 SystemCを、高水準言語と並行処理モデルを組み合わせることで、従来のHDLよりも高速なフィールドプログラマブルゲートアレイ(FPGA)の設計サイクルを実現する方法として推進しています。標準CまたはC++ (並列プログラミングを可能にするライブラリやその他の拡張機能を含む)に基づくアプローチは、 Mentor GraphicsのCatapult Cツールや、Impulse Accelerated TechnologiesのImpulse Cツールに見られます。
Intelによる同様の取り組みとしては、 SYCLに関連するデータ並列C++を高水準合成言語として使用することが挙げられる。
Annapolis Micro Systems , Inc.のCoreFire Design Suite [ 11 ]とNational Instruments LabVIEW FPGAは、高レベル設計入力のためのグラフィカルなデータフローアプローチを提供し、 SystemVerilog、SystemVHDL、Handel-Cなどの言語は同じ目標を達成しようとしていますが、FPGAを既存のソフトウェアエンジニアがより利用しやすくするのではなく、既存のハードウェアエンジニアの生産性を向上させることを目的としています。
また、 MathWorks HDL Coderツール[ 12 ]、Intel FPGA用DSP Builder [ 13 ] 、またはXilinxのXilinx System Generator(XSG)[ 14 ]を使用して、 MATLABおよびSimulinkでハードウェアモジュールを設計することも可能です。
プリント基板の接続性を定義するために、言語ベースのテキスト入力方式を用いるプロジェクトがいくつか存在する。その中でも、可読性、再利用性、検証性の向上に重点を置いた新しいアプローチが登場している。これらの最新の手法では、電子機器向けに特化して開発されたオープンソースの設計言語を用い、宣言型マークアップを採用して回路の動作を規定する。この変化により、ソフトウェア開発の原則がハードウェア設計に統合され、プロセスが効率化され、自動化、再利用性、検証が重視されるようになる。