ハードウェア記述言語(HDL)とは
ハードウェア記述言語(HDL)は、
デジタル回路の設計、構成を記述するための専用
コンピュータ言語です。回路の動作を文字で記述することで、電子回路の経時的振る舞いと空間的構造を表現します。HDLは単なる回路図ではなく、回路の機能そのものをコードとして記述できる点が大きな特徴です。また、シミュレーションによる検証環境も備えているため、実際のハードウェアを実装する前に、設計の妥当性を確認することができます。
HDLは
プログラミング言語に似た構文を持つため、
プログラミング言語の一種と誤解されることがありますが、両者は根本的に異なります。
プログラミング言語が主に逐次処理を記述するのに対し、HDLはハードウェアの並行動作を記述します。HDLの構文や意味は、時間や並行性といったハードウェアの基本的な属性を表現することに特化しており、
プログラミング言語とは大きく異なります。また、PLCで用いられるラダー言語もHDLとは別のものです。
HDLの役割と処理系
HDLで記述されたコードは、以下の二つの処理系で扱われます。
1.
合成系:HDL記述に基づき、ネットリストや
プログラマブルロジックデバイス(PLD)の設定データを生成します。
2.
シミュレータ:HDL記述に基づき、回路の動作をシミュレーションします。シミュレータには、デジタル事象のみを扱うものから、アナログ事象まで詳細に扱うものまであります。
シミュレーションによって、ハードウェア設計者は実装前に回路の動作を確認し、設計の妥当性を検証することができます。
HDLの歴史
最初のHDLは、1977年に
カーネギーメロン大学の「ISP」とカイザースラウテルン大学の「KARL」がほぼ同時に開発されました。ISPは設計の入出力関係を記述する
プログラミング言語的なものでしたが、回路生成はできませんでした。一方、KARLは大規模集積回路の回路配置も記述可能でした。1980年代には、ABELや
SFLといったHDLが登場し、1985年にはゲートウェイ・デザイン・オートメーション社によって、現在の主流の一つであるVerilog HDLが開発されました。
1987年には、アメリカ国防総省の要求で
Adaの流れを汲むVHDLが開発され、技術者はより抽象的なレベルでの設計が可能になりました。その後、HDLで記述されたプログラムから
論理合成できるシステムが登場し、HDLはデジタル設計の中心的な役割を担うようになりました。
IEEEによるVHDLとVerilog HDLの標準化により、これらは事実上の業界標準となり、他のHDLはあまり使われなくなりました。しかし、VHDLとVerilog HDLには、アナログ回路や再帰的な論理構造の記述が苦手という共通の弱点があり、その弱点を克服するためのHDLもいくつか登場していますが、VHDLやVerilog HDLに取って代わるには至っていません。現在では、SystemVerilogのようにVerilog HDLを拡張したHDLが開発されており、VHDLも同様の拡張が進んでいます。
HDLを使った設計
デジタル回路設計は、HDL記述か回路図入力によって行われますが、大規模な記述の確認が困難なため、HDL記述が増えています。設計の初期段階では、紙と鉛筆で仕様や構造図を描きますが、構造の妥当性を確認するためにHDLを使うこともあります。また、MATLABや
C++のような数学的モデル記述や、
フローチャートや
状態遷移図を利用することもあります。その後、RTL(Register Transfer Level)と呼ばれる抽象度でハードウェアを記述します。
RTLでは、演算器やレジスタとその間の信号伝達を用いてハードウェアを記述し、階層的な構造で回路を部分的に設計したり、既存の回路記述を再利用することも可能です。RTL記述はシミュレータで動作を確認でき、妥当性検証や性能見積もりに利用されます。その後、
論理合成ツールを用いて、ゲート水準の記述に変換し、集積回路を実現します。
HDLの記述は、設計工程が進むにつれて常にコードレビューが行われ、自動化された検査で曖昧な構文やコーディング上の問題が検出されます。また、STARCが作成したHDLスタイルガイドに従うことで、論理的な欠陥を減らすことができます。
論理合成が完了すると、ネットリストが下工程に引き渡されますが、物理的なテクノロジによっては、HDLが下工程でも重要な役割を果たすことがあります。
HDLコードのシミュレーションとデバッグ
HDLによる設計の重要な側面は、HDLプログラムをシミュレーションできることです。シミュレーションによって、設計のHDLモデルが仕様に対して妥当であることを検証できます。シミュレーションを行うためには、テストベンチと呼ばれるシミュレーション環境を記述する必要があります。テストベンチには、テスト対象のデバイス、入出力ピン、信号の宣言、クロック波形などが含まれます。また、テストベンチを実行するシミュレータは、シミュレータクロックを発生させ、テストベンチ内のイベントを処理します。
最近のシミュレータはGUI化されており、
デバッグツールも備えています。シミュレーションは、設計検証の重要な工程であり、必要に応じて設計変更も行われます。また、PLDや
FPGAを使ってハードウェアで検証することもできますが、シミュレーションよりも費用がかかることがあります。
HDLでの設計検証
設計検証は、テストケースを作成してシミュレーションを繰り返すという、手間のかかる作業でした。そこで、設計の生産性を向上させるために、
形式的検証や表明に基づく検証が用いられるようになってきました。
形式的検証では、プロパティと呼ばれる期待される動作や推定される動作に関する事実を数学的に証明します。表明に基づく検証では、設計者の意図をHDLコード内に含め、シミュレーション中に違反が検出されると報告します。表明に基づく検証は、まだ始まったばかりの手法ですが、今後のHDL設計に不可欠なものになると予測されています。
HDLは
プログラミング言語と似ているものの、大きな違いがあります。
プログラミング言語が基本的に手続き的であるのに対し、HDLは並列処理を記述できます。HDLでは、複数のコンポーネントが互いに独立して並行に実行され、入力の変化によってシミュレータのプロセススタックが更新されます。
プログラミング言語では
コンパイラが
機械語を生成しますが、HDLではシンセサイザ(合成系)がネットリストを生成します。また、
プログラミング言語の
インタプリタは、HDLではシミュレータに相当します。
ただし、近年ではより高水準なHDLや並列・並行処理を記述できる
プログラミング言語も登場しており、両者の境界は曖昧になりつつあります。電子システムが複雑化するにつれて、HDLとしても
プログラミング言語としても使える言語への要求が高まっています。
SystemCは、そのような要求に応えることができる言語の一つです。
周辺技術動向
HDLは当初、大規模集積回路のシミュレーションを目的としていましたが、
論理合成技術の発達により、HDLからの
論理回路生成が自動化されました。現在では、RTLよりもさらに高い抽象度での設計を可能にする高位合成技術が開発されています。
高位合成では、ハードウェアの動作や
アルゴリズムを記述し、それを基に
論理回路を生成します。また、ハードウェアとソフトウェアを同時に設計・合成する協調設計技術も研究開発が進んでいます。これらの技術を総合して、システムレベル設計と呼ぶこともあります。
システムレベル設計に用いられる言語としては、
C言語を拡張したSpecC、
C++のテンプレートライブラリとして実現した
SystemC、Verilog HDLを拡張したSystemVerilogなどがあります。特にSpecCや
SystemCなど、C/
C++をベースにした言語による設計を
C言語設計と呼ぶこともあります。
アナログ回路設計への拡張
HDLは主に
デジタル回路を対象としていますが、Verilog-AMSやVHDL AMSのように、アナログ回路も記述できるように拡張する動きもあります。
主なHDL
業界で主流として使われているHDLは、主に次の二つです。
VHDL
Verilog HDL、SystemVerilog(Verilog HDLの上位言語)
この他にも、ABEL、AHDL、Atom、Bluespec、Chisel、HDCaml、Hardware Join
Java、HHDL、HML、Hydra、JHDL、Lava、Lola、MyHDL、NSL、PALASM、
Ruby、RHDL、
SFL、
SystemC、ImpulseCといった様々なHDLがあります。
まとめ
HDLは
デジタル回路設計に不可欠なツールであり、回路の動作をコードとして記述することで、効率的な設計と検証を可能にします。今後もHDLは進化を続け、より高度なシステム設計を支えていくことが期待されます。