ハードウェア記述言語
ハードウェア記述言語の最新ニュースをまとめて検索!
ハードウェア記述言語(ハードウェアきじゅつげんご)は、デジタル回路、特に集積回路を設計するためのプログラミング言語の一種であり、コンピュータ言語と呼ぶこともある。略号はHDLで「エッチディーエル」と呼び 、フルスペルはHardware Description Languageである。回路の設計、構成を記述する。処理を検証するための試験(テストベンチ)記述ができ、模擬実行(シミュレーション)できる開発環境もある。
目次 |
[編集] 概要
HDL は文字で記述する言語で、電子回路の経時的振舞いと空間的構造を表現する。ソフトウェアのプログラミング言語と比較すると、HDLの文法(シンタックス)や意味論(セマンティックス)には、ハードウェアの基本的属性である時間や並行性の明確な記法を含んでいる。回路ブロック間の接続関係だけを記述する言語には、電気系のCADソフトウェアで使うネットリストがある。
HDL はハードウェアの動作仕様を記述するのに使う。HDLで書いたハードウェア仕様に基づいて経時的模擬実行(シミュレーション)を行うシミュレータがある。シミュレータによってハードウェア設計者は実装前にハードウェアの動作を確認できる。実行可能性がハードウェアなしに試験できるため、HDL はプログラミング言語であることが分かる。シミュレータには、離散的(デジタル)な事象(イベント)を扱うものと、連続的(アナログ)な事象(イベント)を扱うものがある。それぞれに適したHDLがある。
C++のようなソフトウェアのプログラミング言語に専用のクラスライブラリを追加して、ハードウェアの意味論を表現することも可能である。しかし C++ の定義だけでは、HDLのように時間を明示的に表現することや、同時性を表現することはできない。
特定用途向け集積回路(ASIC)の開発や、PLD・FPGA上に展開する論理回路の設計に用いる。ソフトウェアを記述するためのプログラミング言語に近い記述形態を持つが、その意味論(セマンティックス)は大きく異なる。
ソフトウェアのプログラミング言語のような他の人工言語と同様に様々な言語がある。現在は米国防総省が開発に携わったAdaの流れを汲むVHDL、Gateway Design Automation社(現ケイデンス・デザイン・システムズ社)が開発したVerilog HDLの標準化がまずIEEEで進み、その後IECの国際規格にもなり、広く普及している。
[編集] 歴史
最初のハードウェア記述言語は、1977年、カーネギーメロン大学(CMU)がISP(Instruction Set Processor)[1]を、カイザースラウテルン大学がKARLをほぼ同時に開発した。ISP はよりプログラミング言語的で、設計上の入力と出力の関係を記述する方式であった。ISPは設計のシミュレーションには使えるが、回路を生成することはできなかった。KARL は大規模集積回路の回路配置が記述可能な機能も持っていた。回路配置の記述機能は関連する対話型グラフィカル言語 ABL にもあった。1980年代初期にABLを使ったVLSI設計エディタをトリノの通信研究センター CSELT で開発している。1980年代中ごろ、欧州連合の委員会が出資した国際コンソーシアムが KARL と ABL を中心としたVLSI設計フレームワークを実装した[2]。1983年、Data-I/O が ABEL を発表した。これはプログラム可能な論理回路を対象としたもので、主に有限状態機械の設計に使った。
最初の現代的意味でのHDLである Verilog は、1985年、Gateway Design Automation が開発した。ケイデンス・デザイン・システムズがその権利を取得して Verilog-XL というHDLシミュレータを開発し、これがその後約10年間デファクトスタンダードとなった。1987年、アメリカ国防総省の要求でAdaの流れを汲む VHDL (Very High Speed Integrated Circuit Hardware Description Language) を開発した。これらHDLとHDLシミュレータによって、技術者はより抽象化されたレベルで設計が可能となり、回路規模も数百トランジスタから数千トランジスタへと拡大していった。
HDLに基づく論理合成が登場し、HDLはデジタル設計の表舞台に立つようになった。合成ツールはHDLのレジスタ転送水準(Register Transfer Level: RTL)を記述したソースファイルをコンパイルし、製造可能な論理ゲートやトランジスタのネットリスト記述を生成する。当初のシステムでは、合成可能なRTLファイルを書くには熟練を要した。RTLで合成したネットリストは、従来の設計に比べるとサイズが大きく、性能も悪いことが多かった。熟練技術者による回路図による設計は、論理合成した同等の回路設計よりも常に優れていたが、論理合成の生産性の良さから、RTL合成が不得手としていた高速低電力な回路や非同期回路でもHDLが採用されていった。論理合成は、単にHDLをデジタル設計の中心に押し出しただけでなく、それ自体がデジタル回路設計のための画期的技術であった。 回路図による設計とRTLによる設計は、プログラミング言語におけるアセンブリ言語による設計とC言語による設計の関係に似ている。
IEEEがVHDL と Verilogを標準化したこともあり、VHDLとVerilogは電子産業のデファクトスタンダードとなり、それら以外のHDLはあまり使われなくなっていった。しかし、VHDL と Verilog には共通の弱点がある。どちらもアナログ回路やアナログとデジタルの混在した回路のシミュレーションが苦手であり、再帰的な論理構造を記述できない。そのようなVHDLとVerilogの弱点を克服するHDLもいくつか登場したが、VHDLやVerilogを置換するには至っていない。
HDLの改善は長年に渡っている。Verilog から派生した SystemVerilog では、様々な新機能がある。VHDL の最新版でも SystemVerilog の拡張と同等の機能を持たせるよう開発が進んでいる。今後も VHDL と Verilog の改良は続くという予測がある。
[編集] HDLを使った設計
デジタル回路設計は、HDLによる記述か回路図入力によって行っている。回路図入力では、大規模な記述の確認が困難であるため、HDL記述が増えている。
設計の最初期は、紙と鉛筆で要求仕様や高水準な構造(アーキテクチャ)図を描くことから始まる。この構造が妥当であるかどうか重要である。構造の妥当性を確認する上で、HDLで記述する場合もある。HDLによる記述を行う工程は、設計者の熟練度や回路の性質に強く依存している。次の段階としてMATLABやC++の数学的モデル記述のような、高水準の算法(アルゴリズム)を記述することもある。制御と判断構造は、流れ図(フローチャート)描画ソフトウェアや状態遷移図編集ソフト(エディタ)で試作(プロトタイピング)することも多い。この後HDLの記述に変換を行う。
HDLでは、レジスタ転送レベル(RTL)と呼ぶ抽象度でハードウェアを記述する。この抽象度では演算器やレジスタとその間の信号伝達を用いてハードウェアを記述する。また、多くのHDLでは入れ子構造的に、ある回路の部分回路に分けて設計する。あるいは既にある回路記述を部分回路として利用することもできる。再利用によって設計の効率化が行える。
RTLは論理回路の表現としては抽象的であるため、このままではハードウェアにする事はできない。その代わり、この抽象度に適合したシミュレータを用いて、回路の論理的な動作を確認することができる。機能としては電気的特性などの再現は限られる。シミュレータを用いて、回路の妥当性検証や性能見積もりを行う。
この後ゲート水準と呼ぶ、論理回路を記述する抽象度の記述に展開することで、集積回路を実現する。この操作を論理合成と呼ぶ。論理合成を実行するための道具を論理合成ツール と呼ぶ。
HDLの記述の抽象度(水準)
- 構造(アーキテクチャ)- システムの構造、基本機能(アルゴリズム)を記述
- 動作(BL:Behavior Level) - 回路の動作を機能面から記述
- レジスタ転送(RTL:Register Transfer Level) - レジスタと演算器とその間の配線(接続)を記述
- ゲート(GL:Gate Level) - フリップフロップや論理素子:ゲート(not, and, or, xor)で回路図を表現
設計工程が次の段階に進むたびに、HDLコードは常にコードレビューを行う。論理合成の前に、HDL記述は一連の自動化された検査を受ける。この検査工程で、後の合成工程で解釈を間違う可能性のある曖昧な構文を検出したり、一般的なコーディング上の問題を検出する。
ここでよく用いるのが、STARCが作成したVerilog-HDLスタイルガイド、VHDLスタイルガイドである。このコーディング規則に従うと、電子回路の知識がないプログラマが作成したコードの論理的な欠陥を少なくすることができる。スタイルガイドに適合しているかを検査するソフトウェアも存在している。
HDL設計は、論理合成工程で終了すると考える。合成ツールがHDL記述をゲートのネットリストに変換すると、ネットリストが下工程に引き渡される。物理的なテクノロジ(FPGA、ASICゲートアレイ、ASIC標準セル)によっては、HDLが下工程でも重要な役割を演じることもある。一般に工程が進んで設計が詳細化していくと、設計データベースには技術固有の情報が格納されるようになっていく。技術固有のデータが増えると汎用的なHDL記述では格納しきれなくなる。
反復的な回路構造をHDL言語で記述するときに、Perlのようなスクリプト言語を使って自動生成することもある。Emacsなどのテキストエディタは、HDLのソースコードについて自動字下げ(インデント)、既定用語(キーワード)の強調表示、各種宣言のマクロ拡張などの機能を提供しているものがある。
[編集] HDLコードの模擬実行(シミュレーション)と虫取り(デバッグ)
HDL設計の本質は、HDLプログラムを模擬実行可能な点にある。模擬実行(シミュレーション)することで、設計のHDL記述(モデル)が設計検証に合格するようにできる。設計検証は、コード実装(HDL記述)がその設計が意図した機能(仕様)に対して妥当かを検証する重要な一里塚(マイルストーン)である。模擬実行によって構造(アーキテクチャ)的な吟味もする。技術者は基本設計に対して複数の設計を実験的に書き、模擬実行でそれらの動きを比較することができる。以上のようなことから、HDL設計では模擬実行(シミュレーション)が重要である。
HDLモデルを模擬実行するには、テストベンチと呼ぶ模擬実行(シミュレーション)環境をまず記述する。テストベンチには少なくとも、モデルの実体(インスタンス)化したもの(デバイス・アンダー・テスト、DUT)、そのモデルの入出力のためのピンと信号の宣言、クロック波形が必要である。テストベンチのコードは事象(イベント)駆動型である。テストベンチが生成するリセット信号の実装のためのHDL記述、インタフェース・トランザクション(ホストバスの読み書きなど)のモデルのためのHDL記述、DUTの出力を監視するためのHDL記述などが必要となる。テストベンチを実行するソフトウェアをHDLシミュレータと呼び、テストベンチないの全事象(イベント)の参照元となる模擬信号(シミュレータ・クロック)を発生させる。イベントはテストベンチのHDLが指示したときだけ発生するもの(テストベンチ内のコードでリセット信号を発生させるなど)と、およびそのようなイベントへの反応としてモデルが発生するものがある。最近のHDLシミュレータはGUI化されており、虫取りの道具(デバッグツール)も良くなっている。利用者は任意の時点で模擬実行(シミュレーション)を中断/再開でき、停止点(ブレークポイント)を設定でき、HDLモデルの階層を監視/変更できる。さらにHDL模擬実行環境に利用者がコンパイルしたライブラリをPLI/VHPIインタフェースを通してリンクできるシミュレータもある。リンクは環境依存であり、HDLシミュレータと利用者ライブラリを、HDL模擬実行環境とは別にコンパイルし、リンクする。
設計検証は、ソフトウェア開発工程で言えばソフトウェア試験(ソフトウェアテスト)と虫取り(デバッグ)の工程である。設計工程の中でも最も時間がかかる可能性がある。試験結果によっては大きな設計変更もありうるため、HDLシミュレータ環境で最初に行う。ただし、厳密に定義したコーディング規約に基づいているかどうかの検査を先に行うことにより、試験作業を大幅に短縮することもできる。HDL記述をハードウェアで検証する目的でPLD(プログラマブルロジックデバイス)、FPGAを使うこともある。ハードウェアを使ったプロトタイピングはHDLシミュレーションよりも費用がかかるが、シミュレーションではわからない設計上の問題点が明らかになることもある。他のハードウェアとのインタフェースの確認はハードウェアによるプロトタイピングが最善の方法である。FPGAは、シミュレータより高速に動作するだけでなく、実際に並行実行するための時間的な問題について検出可能である。
[編集] HDLでの設計検証
歴史的に、設計検証は労力を要する工程であり、テストケースを書いてはシミュレーション実行するということをDUTに対して繰り返す。チップが大規模かつ複雑になるにつれて、設計検証も開発期間の大部分を占めるようになってきた。設計の生産性を向上させるべく、Property Specification Language が開発された。
形式的検証において、Property(プロパティ)とは、オブジェクトの期待される振る舞いや推定される振る舞いに関する事実を記した文である。理想的には、HDL設計記述が与えられたとき、プロパティは形式的数学的手法で真偽を証明可能である。実際には、多くのプロパティは無限の解空間を占めるため、真偽を証明できない。しかし、前提や制約が与えられると解空間が狭められ、プロパティチェッカ・ツールで真偽を証明できるプロパティが増える。
表明は回路の動作をモデルとしたものではなく、むしろ設計者の意図を捉え、HDLコード内に込めるものと言える。シミュレーション環境では、シミュレータは全ての指定された表明を評価し、表明に違反した箇所と違反の程度を報告する。合成環境では、表明違反があれば、合成が中断されることもある。表明に基づく検証はまだ始まったばかりの手法だが、HDL設計の必須な部分となると予測されている。
[編集] HDLとプログラミング言語
HDL はソフトウェアのプログラミング言語と似ているが、重大な差異もある。プログラミング言語は本質的に手続き的(シングルスレッド)で、並行性に対応する文法(シンタックス)、意味論(セマンティックス)は限定的である。一方HDLは、複数の並行処理(プロセス)(フリップフロップ、加算器など)を模型(モデル)化でき、各処理(プロセス)は自動的に互いに独立に実行する。処理(プロセス)の入力を変化させると、変化を引き金(トリガ)として自動的にシミュレータのプロセススタックを更新する。
ソフトウェアプログラミング言語もHDLも翻訳系(コンパイラ)で処理する。HDLの場合はシンセサイザとも呼ぶこともある。翻訳(コンパイル)の目的と対象は異なる。HDLの場合のコンパイルは、HDLコードから物理的に実装可能なゲートのネットリストを生成することである。ネットリストには様々な形態があり、シミュレーション・ネットリスト(ゲート遅延情報)、ハンドオフ・ネットリスト(下工程用)、汎用の標準ネットリストであるEDIF形式(フォーマット)などがある。一方、ソフトウェアのコンパイラはソースコードをプロセッサ固有の機械語に変換し、そのプロセッサ上で実行可能な形式にする。
HDLとソフトウェアプログラミング言語は前処理系を共有しており、その境界は曖昧である。前処理系(プリプロセッサ)をC言語と同様のものを用いている場合、あいまいな記述であっても、動作するものを生成できるようにしてしまう。そのため、シミュレーションでは動くが、実機では動かない記述も存在する。また、コンパイルエラーは出ないが、シミュレーションではうまく動かないものもある。
また、HDLとソフトウェアプログラミング言語は概念を共有しており、境界は益々曖昧になりつつある。 純粋なHDLはソフトウェアアプリケーションに用いるのは困難である。ソフトウェアプログラミング言語は、そのままではハードウェアのモデリングには適さない。とは言うものの、電子システムがますます複雑化するにつれ、再構成処理(Reconfigurable computing )が増えていることと、どちらも設計できる技術者の必要性から、ハードウェア設計とソフトウェアプログラミングの両方に使える言語への要求が高まりつつある。
一例として SystemC があり、組み込みシステムのハードウェアを詳細の不明なアーキテクチャ上のブロック(入出力信号がモデル化されたブラックボックス)としてモデル化できる。SystemCの高度に抽象化したモデル記述は、初期のアーキテクチャ選定に適している。
[編集] 周辺技術動向
[編集] システムレベル設計
当初、HDLは大規模集積回路の模擬実行(シミュレーション)を目的に開発されたが、論理合成技術の開発によってHDLでの記述からの論理回路生成の自動化ができるようになった。現在、RTLでの設計より更に高い抽象度でのハードウェア設計を可能とする高位合成技術の開発が進んでおり、メンター・グラフィックスが提供するCatapult C Synthesisなどに例を挙げられるような、いくつかのツールが市販されている。RTLの上位に位置するのは、振舞い(ビヘイビア・レベル)と呼び、ハードウェアの動作やアルゴリズムを記述する。特にこの振舞い(ビヘイビア・レベル)の記述を対象とした高位合成を動作合成と呼ぶ。
この振舞い記述(ビヘイビア・レベル)では、ハードウェアをプログラミング言語によるソフトウェアの記述と殆ど同様の考えで記述することになる。ここから、ハードウェアとソフトウェアを同時に、区別なく設計・合成する技術の研究開発も進んでいる。ハードウェア・ソフトウェア協調設計(コデザイン)は、ソフトウェア技術者がHDLを理解し、ハードウェア技術者がソフトウェアプログラムを理解することによって、加速していく可能性がある。
こうした高位合成技術、協調設計技術を総合してシステムレベル設計またはシステム設計技術と呼ぶ。これらの技術を用いて、ハードウェアとソフトウェアとを区別なく、ソフトウェアの記述と同等の抽象度で論理(デジタル)システム全体を記述することをシステムレベル設計と呼ぶこともある。
このようなシステムレベル設計に用いる言語として、C言語を拡張したSpecC、C++のテンプレートライブラリとして実現したSystemC、Verilog HDLを拡張したSystemVerilogなどがある。特にSpecCやSystemCなど、C/C++をベースにした言語による設計をC言語設計と呼び、日本ではシステムレベル設計といえばC言語設計を指すこともある。
[編集] アナログ回路設計への拡張
HDLはデジタル回路を対象としているが、これを拡張してアナログ回路を記述できるようにする動きもある。主たる目的はアナログ回路、もしくはアナログ - デジタル混載回路のシミュレーションである。
これに該当する言語としてVerilog-AMSやVHDL AMSがある。
[編集] 言語
主に次の二つのHDLが業界で主流として使われている。
他に以下のようなHDLがある。
- Advanced Boolean Expression Language (ABEL)
- AHDL (アルテラ社のHDL)
- Atom (動作合成向けの高レベルHDL、Haskellベース)
- Bluespec (Haskellベースの高レベルHDL、現在はSystemVerilogの文法をサポート)
- HDCaml (Objective Camlベース)
- Hardware Join Java
- HML
- Hydra (Haskellベース)
- JHDL (Javaベース)
- Lava (Haskellベース)
- Lola (教育用の素朴な言語)
- MyHDL (Pythonベース)
- PALASM (PAL向け)
- Ruby - Ruby(プログラミング言語)とは異なるHDL
- RHDL (Rubyベース)
- SFL
- SystemVerilog - Verilog のスーパーセット。
- SystemC - C++の標準化されたクラスライブラリ
[編集] 関連項目
[編集] 脚注
[編集] 外部リンク
最終更新 2009年8月25日 (火) 12:48 (日時は個人設定で未設定ならばUTC)。
【ハードウェア記述言語】変更履歴

