論理回路2
第10章 ハードウェア記述言語(その1)

  −設計手法とその特徴−

井澤 裕司  


1 はじめに
本章では、LSIの設計・開発に広く使用されている 「ハードウェア記述言語(HDL)」 について解説します。

これまで論理回路の設計は、 真理値表や遷移表 を作成することから始まり、
最終的には 回路図 を完成させて終了するように説明してきました。
しかし、現在ではCPUを始めとする多くのLSIの設計には回路図を用いず、
「ハードウェア記述言語」(HDL;Hardware Description Language) という手法が使用されています。

本章では、この 「ハードウェア記述言語」 とはどのようなものか、その設計手法と特徴を中心に説明します。

2 論理回路設計手法の変遷
前章までは、論理回路の設計目標は回路図を作成することにありました。

回路図が完成すると、設計した回路図中の ゲートやフリップフロップ を、
例えば74シリーズのような ディジタルIC に置き換えます。
それらのディジタルICを、プリント基板や実験で使用したブレッドボード上に
実装して配線すれば論理回路の完成です。

しかし、このような論理回路の設計・製作方法は、 実験や小規模な試作のレベルでしか用いられず、
実際の設計・開発手法とは大きくかけ離れています。

このような論理回路の設計手法は、半導体技術の進歩に伴い、大きく変化してきました。
その変遷について、簡単に整理してみましょう。

(1) ディジタルICの普及

1964年に世界初のディジタルIC(TTL)が登場し、 集積回路(IC) の時代が始まりました。

初期のディジタルIC(例えば74シリーズの100番まで)は、 単純なゲートやフリップフロップが中心でしたが、
半導体技術の進歩に伴い、 カウンタやシフトレジスタ、セレクタやマルチプレクサなど、
より高機能で使いやすいディジタルICが開発されるようになりました。

回路技術者は、このようなICのマニュアルを参照しながら、 実用的な論理回路を設計するのが一般的でした。
このときの主な設計手順は以下の通りです。

(1) 目標とする回路の機能を実現するのに最もふさわしいディジタルICを選択し、
   これらを組み合せて回路図を作成する。

(2) チェック用の基板を試作してデバッグを行い、問題なく動作することを確認した後、
   プリント基板等を製作してICを実装する。

すなわち、必要な機能をもつディジタルICの選択が、最も重要な作業の1つでした。
現在でも、比較的単純な一部の論理回路は、このような手順により開発されています。

(2) マイクロプロセッサの登場

1972年に登場したマイクロプロセッサは、やがてディジタル回路の設計手法にも大きな変革をもたらします。

半導体技術の進歩により、安価で使いやすいマイクロプロセッサが入手でき、 これらを動作させる
ソフトウェアの開発環境が整備されると、 それまでディジタルICで実現していた機能の一部は、機能の一部は、
このプロセッサに置き換えられてゆきました。
特に、複雑な状態遷移図で表わされる制御回路(シーケンサ)等は、プロセッサに実装される
プロセッサに実装されるようになりました。

一方画像処理など、マイクロプロセッサでは実現できない高速な動作が要求される領域が存在します。
このような分野には、専用のLSIを独自に開発したり、汎用のディジタルLSIと一般のディジタルICを
組み合わせる手法が用いられました。

(3) ディジタルICの1チップ化

いわゆる「Mooreの法則」により、1年半に2倍という指数関数的なスピードで、半導体の集積度は
向上してゆきました。
これに伴い、ディジタルICの1チップ化が1つの大きな流れになりました。

数多くのディジタルICを、1つの半導体チップ(LSI)に収めることができれば、 小型化が図れるだけでなく、
動作速度の向上や消費電力の低減を実現することができます。
LSI開発の初期コストは増えますが、量産化すれば1個あたりの価格を大きく下げることも可能です。

回路の設計にはCAD(Computer Aided Design)システムが導入され、機能ごとに階層構造化して
設計する手法が用いられました。
また、回路のデバッグや検証のため、CADによる論理シミュレーションも広く用いられ、
開発期間も短縮されるようになりました。

集積度がそれほど高くない頃は、回路設計に回路図が使用されていました。
しかし、数十万ゲートを越える大規模LSIの時代になると、回路図の枚数が膨大な量に膨れ上がり、
それらのCAD入力やデータ管理等に支障をきたす事例が頻繁に発生するようになりました。

これに伴い、回路図を用いずに、大規模なLSIを効率的に設計する手法について様々な検討が進められ、
HDL等の具体的な手法として提案されるようになりました。

(4) プログラミング可能な新しい半導体デバイスの登場

マイクロプロセッサのように、品種は少なくても大量に製造する場合は、専用のLSIを開発するのが有利です。
しかし、少量しか生産しない用途では、膨大な開発コストがかかる専用LSIを開発することは現実的ではありません。

そこで、このような少量多品種の回路にも対応できるように、プログラミング可能な新しい半導体デバイス
PLD(Programmable Logic Device) が開発されました。
このデバイスの内部には、EEPROMやヒューズROM、SRAMなどのメモリが内蔵され、内部の結線状態等を
これらのメモリに保存します。

比較的小規模なPLDは、CPUの周辺回路、例えばメモリのアドレスデコーダ等に使用されました。
このPLDのプログラミングには、回路図ではなく、 PALASMやABEL等のような論理式に相当する
簡単な言語が使われていました。

その後、半導体技術の進歩に伴い、このPLDの高速化、大容量化、多機能化が進み、
CPLD(Complex PLD) や、 FPGA(Field Programmable Gate Array) へと発展しました。
このFPGAは、主として少量多品種の製品や、本格的な 特定用途向けLSI(ASIC) を開発するまでの繋ぎとして
活用されてきました。
最近では、FPGAの高速化、大容量化、低コスト化に伴い、 家電製品や通信分野をはじめとする
様々な領域に導入されています。

(5) CADによる回路設計手法 -回路図からハードウェア記述言語(HDL)へ-

回路設計が大規模化するにつれて、 コンピュータによる回路設計システム(CAD: Computer Aided Design)
が欠かせないものとなりました。

ところが、ゲート数が数十万に達するようになると、 回路図をベースとした設計手法に限界が見えてきます。
回路図の枚数が膨大な量に膨れ上がり、それらをCADに入力したり修正する作業は、
必ずしも効率の良いものとは言えませんでした。

本来、回路図は人間にとって直感的で分かりやすい表現手段の1つです。
しかし、その枚数が極端に増えると、必ずしも使い勝手の良いものではなく、 コンピュータ処理にも向いていないことが
明らかになってきました。

そこで、PLDなど比較的小規模な論理設計に使用されていた言語 (PALASMやABEL等) が注目され、
これらを改良して大規模なLSI設計にも対応できる ハードウェア記述言語(HDL) が開発されるようになりました。
さらに、合成した論理をチェックするためのシミュレーション方法等についても、 詳細に記述できるようになりました。
現在最も普及しているハードウェア記述言語に、米国国防省が中心になって開発した VHDL がありますが、
その高い記述能力によりトップダウンの設計も可能となり、 開発期間の短縮に効果を上げています。

3 ハードウェア記述言語とは

 3.1 ハードウェア記述言語とは?
ハードウェア記述言語とは、文字通り論理回路をC言語のようなソースコードを用いて表現する言語です。

例えば、以下のような回路図を考えましょう。
入力は A と B 、出力は Z_OR と Z_AND です。
Z_OR は論理和(OR)、Z_AND は論理積(AND)に相当します。
これらの論理記号を、論理式を用いて表すことが可能です。

すなわち、

   Z_OR  = A + B
   Z_AND = A ・ B

のようになります。

ハードウェア記述言語の種類により、具体的な記述方法はそれぞれ異なりますが、
基本的には同じ論理式に対応する入出力の関係を表しています。

3.2 ハードウェア記述言語の特徴
前節で述べたように、ハードウェア記述言語(HDL)は、大規模な回路を設計する場合の回路図の
限界を解消するために、考案された手法です。
もう一度、回路図の問題点を整理してみましょう。

(1) 回路図は直感的ではあるが、CADシステムへの入力作業が煩雑になる。
(2) 回路図では、詳細かつ標準的な回路動作の記述は難しい。
(3) コンピュータにとって、回路図は必ずしも最適な表現形式ではない。

次に、現在最も広く用いられているVHDLについて、その特徴を列挙します。

(1) 様々なレベルで記述可能
ソフトウェアの分野で、アセンブリ言語から高級言語へと発展したように、HDLも、
下はゲートレベルから上はビヘイビアレベルの記述まで、幅広く対応できるようになりました。
例えば、トップダウン設計で、上位のビヘイビアレベルのみ記述するだけで、
全体を通したデバッグを早い段階で実施することもできます。
上位のデバッグを完了した後、下のレベルを記述することにより、設計期間の短縮が可能となりました。

(2) 論理合成のシミュレーション方法の記述
回路の記述だけでなく、合成した論理を検証するためのシミュレーション方法を記述することができます。

(3) 設計資源の再利用
HDLの場合、パラメタライズの手法により、設計資源の再利用が簡単に実現できます。

このパラメタライズとは、8ビットのレジスタと16ビットのレジスタを設計するときに、
レジスタ数のビット幅をパラメータで与えることにより、8ビットでも16ビットのどちらでも使えるような
汎用性のある回路をHDLで記述する方法です。
このような手法を活用すれば、ビット数にかかわらず、1つのソースコードで対応することが可能になります。

なお、回路図が完全に廃れたわけではありません。
具体的な回路はHDLで記述し、上位の階層でその回路をシンボリックな回路図で表現する例は数多く用いられています。

3.3 ハードウェア記述言語の種類
ハードウェア記述言語には、数多くの種類がありますが、その代表的なものを以下に示します。

(1) VHDL (VHSIC Hardware Description Language)

米国国防省が中心となって開発されたもので、現在最も普及している言語の1つです。

(2) Verilog HDL (Verilog Hardware Description Language)

米国旧Gateway Design Automation社により開発された言語で、20年にわたり広く使用されています。

(3) AHDL (Altera Hardware Description Language)

米国ALTERA社により開発された言語。同社から無償の開発ツール(MAX-PLUSU)が提供されています。

(4) その他(PALASM、ABEL等)

PLDなど、比較的小規模の回路に使用された簡易型の言語です。

なお、これらの簡単な例については、次の第4節で紹介します。

3.4 HDLとソフトウェアとの違いについて

ハードウェア記述言語(HDL)と一般的なソフトウェアとは、本質的な違いがあります。

例えばC言語で記述されたプログラムは、書かれた順番に従ってシーケンシャルに処理されます。
ソフトウェアでは、単一のCPUで動作するため、特殊な例を除いて同時に複数の処理をすることはできないからです。

しかし、ハードウェアを構成するすべての部品は、入力信号が与えられれば、いつでも動作します。
このように、HDLで記述された回路は、通常コンカレント(同時並行的)に動作するので注意が必要です。

以下、具体的な例で補足しましょう。
例えば
A = B and C
D = C or E
の場合、信号 C が変化すると、信号 A と信号 D は同時に変化します。
なお、
A = B and C
A = B or D
はエラーになります。
1つの信号 A に、異なる2つの信号を入力することができないためです。

4 ハードウェア記述言語(HDL)による記述例

それでは、実際にハードウェア記述言語(HDL)を用いて簡単な回路を記述した例を紹介しましょう。

なお、ソースコードの前半が入出力関係、 後半がその間の論理(ANDとOR)を記述しています。
VHDLの場合は、入出力のインタフェースを表す entity 部と、内部の動作を表すarchitecture部に分離して記述します。

詳細な説明は省略しますが、大まかな構成や、それらの相違点について比較しながら眺めて下さい。

4.1 AND回路とOR回路
(1) VHDLの例 (AND回路とOR回路)

(2) Verilog HDLの例  (AND回路とOR回路)

(3) AHDLの例 (AND回路とOR回路)

(4) タイムチャートの例  (AND回路とOR回路)

4.2 Dフリップフロップ
Dフリップフロップを、(1)VHDL、(2)Verilog HDL、(3)AHDL を用いて記述した例を以下に示します。

上の例と同様、ソースコードの前半は入出力関連、後半はクロック CLK の立ち上りで、入力 D の値が出力 Q に現れる動作を表しています。

(1) VHDLの例 (Dフリップフロップ)

(2) Verilog HDLの例 (Dフリップフロップ)

(3) AHDLの例 (Dフリップフロップ)

(4) タイムチャートの例 (Dフリップフロップ)

4.3 10進カウンタ回路(VHDL)
それでは、VHDLを用いて、第5章で説明した10進カウンタを2通りの方法で記述してみましょう。
(1) ゲート、フリップフロップレベルの記述
(2) RTL(Register Transfer Level)の記述

ソフトウェアに例えると、(1)はアセンブリ言語、(2)はC++のような高級言語に相当します。

(1) の場合、前半で Dフリップフロップを記述し、後半でそれらを4個組み合せて、カウンタを構成しています。
Dフリップフロップを別ファイルで定義した場合は、前半は不要です。

(2) では、カウントアップの動作を、count = count + 1; の行で表しています。
この場合、専用のライブラリ (IEEE.std_logic_unsigned.all) を呼び出す必要があります。

これらの詳細な説明は次章で行いますが、ここでは、両者を比較してその違いに注目して下さい。

(1) ゲート、フリップフロップレベルの記述




(2) RTL(Register Transfer Level)の記述

(3) 10進カウンタのタイムチャート

シミュレーションにより求めた10進カウンタのタイムチャートを、以下に示します。
10進数の0から9まで繰り返しカウントしていることが分かります。

このように、VHDLでは、下位のゲートレベルから上位のRTLまで、幅広いレベルで記述できることを示しました。

このとき、上位のRTLを使用すれば、ゲートレベルで設計する必要は全くないように思えます。
しかし、ゲートレベルの設計には、RTLでは得られない効果が期待できます。

ソフトウェアの領域で、高級言語ではどうしても記述できない部分には、アセンブリ言語が用いられることがあります。
HDLにおいても、高速性が極限まで要求される部分には、細部まで設計者の意図が反映できる
ゲートレベルでの記述が欠かせません。

また、ゲートレベルの論理回路が設計でき、それらの詳細な動作がイメージできる能力や経験、勘が、
上位のRTLで設計した回路のデバッグに役立つことがあります。

複雑なLSIになると、チェックすべきの信号のパターンは無限といってよいほどの数に膨れ上がります。
一般に開発期間は限られているため、チェックする信号のパターンを絞り込む必要に迫られます。
ソフトウェアの場合と同じように、人間が誤りを生じ易い部分には、ある共通点があります。
例えば、一定の信号パターンを繰り返し発生させる場合、それらの処理を開始する部分と、終了する部分で
バグが発生する確率が高くなります。

チェックするパターンを絞り込んだり、バグのある場所を特定するときに、ゲートレベルの論理回路を設計した時の
経験が、役に立つことが多いのです。

5 まとめ
本章では、 ハードウェア記述言語(HDL)の設計手法とその特徴 を中心に解説しました。

次章では、 ハードウェア記述言語 (VHDL)を用いた回路の具体的な記述法について紹介します。
論理回路2のトップページに戻る