論理合成の仕組みを知る
はじめは論理合成の概要から理解してください。論理合成のコマンドを覚えるよりも、まずは論理合成の全体的な流れを把握することが重要です。
1. 論理合成とは
論理合成
(Synthesis)
(Netlist)
RTLシミュレーションなどを行って、検証済みの回路のHDL記述をゲート回路に変換することを論理合成(Logic Synthesis)といいます。そのときに使用する専用のソフトウェアを論理合成ツールと呼びます。
- HDL記述: 設計者が作成したRTL記述
- 制約条件 (Constraints): 回路のゲート数や遅延時間(動作周波数)などの目標値
- テクノロジライブラリ: ASIC/FPGAベンダから供給される、論理合成用のゲート情報(面積・遅延)ライブラリ
もふねこ:
論理合成(Synthesis)は、みんなが書いたVerilogのコードを「実際の回路(ゲートの組み合わせ)」に変換する超重要な魔法だよ🐾!
最初は「ツールにお任せ」で大丈夫だけど、どんな流れで変換されているかを知っておくと、エラーが出たときの解決スピードが段違いにアップするよ!
2. 論理合成の内部プロセス
論理合成ツールは内部で主に以下の3つのステップを実行します。
Step 1: 論理式の抽出(Translation)
HDL記述を読み込み、内部で汎用的な論理式(ブール式)やフリップフロップなどの回路構造に変換します。
Step 2: 論理圧縮と最適化(Optimization)
抽出された論理式に対して、ブール代数の法則を用いた論理圧縮(カルノー図による簡略化のような処理)を行い、論理を最小化・最適化します。
Step 3: ゲートマッピング(Technology Mapping)
与えられた制約条件(面積や遅延)を満たすように、最適化された論理式を実際のターゲットライブラリの物理的なゲート素子(AND、OR、フリップフロップ等)に割り当てます。
最終的にゲートマッピングされた回路はVerilog-HDLフォーマット等のネットリストとして出力され、ゲートレベルシミュレーションや配置・配線などの次工程へと渡されます。
3. 論理合成の具体例(1ビット加算回路の桁上がり生成)
論理合成の過程を、1ビット加算回路の桁上がり信号(キャリー出力: Q1)を例に見てみましょう。
① 真理値表からHDL記述の作成
まず、仕様となる真理値表を確認し、それをもとに記述を作成します。ここでは always 文と case 文を使って記述します。
| A | B | CI | Q1 (キャリー) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
// 1ビット加算回路の桁上がり(Q1)の記述例
module ADDER_CARRY(A, B, CI, Q1);
input A, B, CI;
output Q1;
reg Q1;
always @(A or B or CI) begin
case ({A, B, CI})
3'b011: Q1 = 1'b1;
3'b101: Q1 = 1'b1;
3'b110: Q1 = 1'b1;
3'b111: Q1 = 1'b1;
default: Q1 = 1'b0;
endcase
end
endmodule
② 論理式の抽出と論理圧縮
この記述を論理合成ツールで読み込むと、ツール内部でまず以下のような論理式が導き出されます。
さらに論理合成ツールは、この論理式を論理圧縮して最適化します。
論理圧縮(カルノー図による最適化のイメージ)
| A, B | |||||
| 00 | 01 | 11 | 10 | ||
| CI | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 1 | |
ツールはこのような論理圧縮(ブール代数の簡略化)を自動的かつ一瞬で行います。
③ ゲートマッピング
最後に、ゲート数や遅延時間などの目標値を制約条件としてツールへ与え、その制約条件を満たすようにライブラリのゲート素子(ANDゲートやORゲート、複合ゲートなど)にマッピング(割り当て)します。
手作業による回路図設計 と ツールによるゲートマッピング の比較
人間が手作業で考えた回路図 (AND/OR)
基本ゲートだけを使った素直な回路だが、面積や遅延が最適とは限らない。
ツールがマッピングした回路図 (Target Library)
AOI22等] B --> AOI CI --> AOI AOI --> INV(NOT) INV --> Q1 style AOI fill:#bbdefb,stroke:#1976d2,stroke-width:2px; style INV fill:#bbdefb,stroke:#1976d2,stroke-width:2px;
提供されたライブラリの中で、最も面積が小さく・遅延が少ない複合ゲート(AOI: AND-OR-Invert等)へ自動的にマッピングされる。
このように真理値表や仕様からHDL記述を作成すれば、あとは論理合成ツールが「論理圧縮」から「ゲートへのマッピング」までを自動で行ってくれます。設計者が手作業でカルノー図を描き、論理圧縮して回路図を書くという膨大な時間とミスを伴う作業から解放されます。設計品質の大幅な向上と設計期間の短縮につながるのです。
4. テクノロジ・リマッピングの容易さ
論理合成ツールを使用するもう一つの大きなメリットが「テクノロジ・リマッピング」です。
合成
➡
合成用のライブラリを変更して再合成するだけで、同じHDL記述から簡単に他社のASICや異なるプロセスルールの回路を作成することができます。例えば「A社のライブラリで合成した回路が目標の性能に達しなかったため、より高性能なB社のライブラリに変更して再合成する」といったことが容易に行えます。
5. フリップフロップの生成と最適化の限界
論理合成ツールは、記述から論理式を抽出し「組み合わせ回路」を生成して徹底的に最適化を行います。しかし、レジスタ(フリップフロップ)に関しては扱いが異なります。
- ツールは、HDL記述中で暗黙的・明示的に指定された数だけフリップフロップを忠実に生成します。
- フリップフロップの「個数」や「位置(リタイミング等高度な機能を除く)」はツールが勝手に最適化・削減することは原則ありません。
- 設計者は「不要なフリップフロップが生成されないよう」、フリップフロップの数を意識してHDL記述を書く必要があります。
Q <= D;
end
論理合成後は、ツールのレポートメッセージなどで意図した数のフリップフロップが生成されているかを必ず確認するようにしましょう。
6. 演算子の共有化
A+Bの結果をXに代入し、B+Cの結果をYに代入し、XとYをセレクタで選択して、どちらか一方を出力する記述があります。
❌ セレクタ後段の加算(加算回路が2つになる)
always @(*) begin
X = A + B;
Y = B + C;
if (SEL) Z = X;
else Z = Y;
end
演算回路は回路規模が大きくなりやすいので、このような記述を論理合成する場合には演算回路を共有化して1個の加算回路になるように回路を合成した方が回路規模は小さくなります。論理合成ツールは記述された演算子の数だけ加算回路を合成します。
したがってこの記述の場合2個の加算回路と1個のセレクタで構成された回路が出来上がります。
加算回路を1個にするには記述の中で加算演算子を1個にする必要があります。
すなわちさきにAとCをセレクタで選択してZに代入しその後Z+Bを実行して出力すると記述をします。
✅ 加算演算子を1個にする
always @(*) begin
if (SEL) TMP = A;
else TMP = C;
Z = TMP + B;
end
すると論理合成ツールは1個のセレクタと1個の加算回路からなる回路を合成します。
論理合成ツールは記述された通りの回路構造で回路を生成しますので、設計者は回路構造を意識して記述をしなければなりません。HDL記述の書き方によっては、論理合成ツールが演算子を共有化してくれますが、その機能は確実ではないので、共有化をツールに任せるのは回路品質を悪くします。
7. 制約条件(Constraints)の与え方
目的の回路を生成するには、ツールに対して「どのような回路が欲しいのか」という目標値(制約条件)を与えます。例えば「動作周波数20MHz」「ゲート数1000ゲート以下」といった条件です。
| 制約の対象 | 代表的なコマンド(例:Design Compiler等) | 内容 |
|---|---|---|
| 動作周波数 (クロック) | create_clock |
クロック周期や波形を定義 |
| 面積 (ゲート数) | set_max_area |
許容される最大回路面積を指定 |
| 入力遅延 | set_input_delay |
外部入力信号が到達するまでの遅延時間 |
| 出力遅延 | set_output_delay |
外部出力信号に求められるセットアップ余裕 |
| ドライブ能力・負荷 | set_driving_cell / set_load |
前段セルの駆動能力や後段の負荷容量の指定 |
| 動作環境 | set_operating_conditions |
電圧・温度・プロセスの変動条件指定 |
これらの各種条件を設定することで、ツールはタイミングエラーが出ないよう、かつ面積が最小になるように組み合わせ回路を最適化します。(個々の制約コマンドの詳細は後続モジュール『S2: 各種制約条件』で解説します)
8. 階層構造における論理合成の手順
大規模な回路では、階層構造(サブモジュール化)を用いた記述が行われます。このような記述を論理合成する場合は、原則として「下の階層から(ボトムアップ)」合成を進めます。
ボトムアップ論理合成のツリー構造
- 最下層のブロック(例:BLK_B1、BLK_B2)をそれぞれ個別に論理合成する(順不同)。
- その上の階層(例:BLK_B)を読み込み、すでに合成済みの下位ブロックを接続し、BLK_B内部の最適化を行う。
- 別系統の下位ブロック(例:BLK_A)を合成する。
- 最上位(TOP)を読み込み、BLK_AとBLK_Bを接続して、全体(TOP)の最適化を行う。
論理合成する1ブロックのゲート規模は、ツールの性能にもよりますが数千〜数万ゲート程度(※ツールやPC環境により上限は異なります)をひとまとまりとして記述すると、効率の良い最適化が進められます。
また、最上位階層や区切りとなる階層は「モジュール接続だけの記述(構造記述のみ)」とすることが定石です。これらの階層にロジック回路(組み合わせ論理など)が混在していると、階層境界でのタイミング最適化が難しくなり、不具合が発生しやすくなります。
9. 論理合成は「繰り返しのプロセス」
検証済みのHDL記述を論理合成しても、ほとんどの場合、1度の合成だけで一発で目的の回路が生成されることはありません。「動作周波数が遅い(タイミング違反)」「ゲート数が大きすぎる(面積違反)」などの問題が必ず発生します。
結果確認
➡
① 制約条件の見直し(厳しすぎる条件の緩和など)
② HDL記述の構造見直し(パイプライン化、共有化など)
厳しすぎる制約条件を与えると、ツールが無理な最適化を行い、かえって結果(面積や消費電力)が悪化する場合があります。設計者はツールが出力するレポートを分析し、適切な条件を見極める必要があります。
また、制約条件の変更だけではどうしても目標を達成できない場合は、HDL記述自体を見直して修正し、再度論理合成を行います。なお、HDL記述を変更した場合は、論理機能が壊れていないことを確認するため、必ず再度RTLシミュレーションを行って検証することを忘れないでください。
こうして「合成 → 結果分析 → 修正」を幾度か繰り返すことによって、最終的に目標を満足するゲート回路(ネットリスト)を生成します。
10. 論理合成ツールの種類
論理合成ツールはいろいろなEDAベンダーから発売されており、たくさんの種類があります。合成のコマンドはツールごとに異なっています。本サイトでは代表的なツールのコンセプトに基づいて説明しています。コマンドの意味や使い方は、ご使用になる環境のツールのマニュアルをよく読んで確認してください。