第5回 配置配線
本日の講義内容
- Innovusを用いた配置配線
Innovusを用いた配置配線
配置配線の基本

本日はまず配置配線に取り組んでいきます。配置配線では、ツールを利用して論理ゲートレベル設計をレイアウトへと変換するのでした。ツールとしては、Cadence Innovusを利用します。
配置配線にあたっても、論理合成と同様、論理ゲートの具体的なデータが格納されたスタンダードセルライブラリの情報や、タイミング等の制約が必要になります。より具体的には、
- .libファイル: 標準化された形式で、スタンダードセルライブラリ内の各セル (各論理ゲートやフリップフロップなど) の論理的な動作、遅延情報、消費電力、入出力特性 (遷移時間や容量) が記述されたテキストファイル。Libertyファイルと呼ぶ。
- .lefファイル: スタンダードセルライブラリ内の各セルの物理配線情報がまとまったテキストファイル。
- .gdsファイル: スタンダードセルライブラリ内の各セルのレイアウトファイル。配置配線工程ではこれらと配線のレイアウトデータが組み合わさって最終的な一つのレイアウトファイルを生成する。
- .sdcファイル: タイミングやクロック信号、容量といった制約がまとまったファイル。通常、論理合成ツールが出力するものを用いる。
といったものが必要になります。
.dbファイルと.libファイル
SynopsysのDesign Compilerでは.dbファイルを利用しましたが、CadenceのInnovusでは.libファイルを利用します。これらは中身としては同様のLibertyファイルですが、前者は可読性の無いバイナリ形式で、後者は可読性のあるテキスト形式という違いがあります。製造プロセスによっては双方が揃っていないこともあるでしょう。.libのみが存在する場合、Synopsys Library Compilerというツールを用いて.libから.dbファイルを生成することができます。
レジスタファイルの論理合成・配置配線
環境設定
レジスタファイルの配置配線をおこないましょう。まず、Innovusを実行するための前準備として、~/.cshrc
の末尾に、
# for cadence INNOVUS
set path = ( /home/kadomoto/innovus/bin \
/home/kadomoto/innovus/tools.lnx86/bin \
/home/kadomoto/innovus/tools.lnx86/dfII/bin \
/home/kadomoto/innovus/share/oa/bin \
$path )
といった記述を追記しておきます。その後、
とすることによってツールを実行可能にします。以降はターミナル起動時にこれを読み込むので何もしなくてもInnovusが利用可能なはずです。
レジスタファイルの論理合成
配置配線に先立って、まず、論理合成用のファイルを用意します。
$ cp -r /home/resources/WORK ${自分の作業ディレクトリ}
$ cp /home/resources/syn_regfile_45nm.tcl ${自分の作業ディレクトリ}
として、以前作成したレジスタファイルのRTL設計ファイル (WORK/regfile.sv
, WORK/cpu_pkg.sv
) と論理合成用スクリプト (syn_alu_45nm.tcl
) を自分の作業ディレクトリへとコピーしましょう。論理合成スクリプトの冒頭は、今回論理合成・配置配線に利用する45nm CMOS製造プロセスのスタンダードセル固有の記述です。
なお、レジスタファイルのブロック図は以下のようなもので、中身としては32bitのレジスタが31個とゼロレジスタが1個存在するのでした。

ファイルが揃ったら、論理合成を実行します。
生成されたregfile.vnet
を見ると、レジスタファイルを構成するために大量のDFFセルが呼び出されていることがわかります。また、
などとして面積を確認すると、Total cell area
は21117.561043
となり、スタンダードセルを70%の密度で配置するとすると、配置配線後の最終的な面積は174μm角程度になると予想されます。
レジスタファイルの配置配線 (Innovusの起動・基本設定)
続いて、配置配線を実行していきましょう。
とすると、Innovusが起動します。

まず、Innovusに必要ファイルを読み込みます。File
->Import Design
から、設定画面を起動します。

Netlist
として、まずゲートレベル設計のVerilog HDLファイルを読み込みます。これは先ほど得られた論理合成後のregfile.vnet
です。Top Cell
についてもBy User
としてregfile
と明示的に指定しておきます。
Technology/Physical Libraries
としては、LEF Files
から.lefファイルを読み込みます。これには/home/resources/gscl45nm/gscl45nm.lef
を指定します。
Power
で電源ネット名を指定します。ここではそれぞれ、VDD
、VSS
とします。
その後、Create Analysis Configuration
から、タイミングライブラリや制約ファイルの指定をおこないます。様々な動作条件におけるタイミング制約を指定可能なことから、Multi-Mode Multi-Corner (MMMC) Browser
という名称になっています。

まず、タイミングや制約ファイルを指定しましょう。

MMMC Objects
の中からLibrary Sets
をダブルクリックして各セルのタイミングが記述された.libファイルを指定します。これには/home/resources/gscl45nm/gscl45nm.lib
を指定します。Name
にdefault
という名前を入力して保存します。
また、Delay Corners
をダブルクリックしてタイミング条件の指定をおこないます。library Set
に先ほど設定したdefault
ライブラリを指定して、これを元にタイミングを計算することにします。これについても、Name
にdefault
という名前を入力して保存します。
同様に、Constraint Modes
をダブルクリックして制約を設定します。SDC Constraint Files
として先ほど論理合成で生成したregfile.sdc
を指定します。やはりこれも、Name
にdefault
という名前を入力して保存します。
その後、こうした指定内容をAnalysis Viewsに設定します。Analysis Views
をダブルクリックして、Constraint Mode
とDelay Corner
をdefault
とし、Name
にdefault
という名前を入力して保存します。その後、Setup Analysis View
とHold Analysis View
に、このdefault
を設定します。これにてMMMCの設定は完了です。

Save&Close
より、Default.view
と名前を付けて終了します。

ここで、OK
として、初期設定を完了します。
レジスタファイルの配置配線 (フロアプラン)
続いて、フロアプランをおこないます。この工程では、最初に、スタンダードセルを配置する領域、マクロ(レイアウト済の大きめの部品)を配置する領域などを決めます。
初期設定を終えると、画面にスタンダードセル配置領域が既に仮決めされています。k
でルーラーを使うことができるので、さきほどの見積と同程度の面積になっているか確認してみると良いでしょう (Shift+k
で消せます)。
さて、画面上部のFloorplan
->Specify Floorplan
からスタンダードセル配置領域を詳細に指定できます。

ここではこのようにしてみましょう。Ratio
を1 (正方形) に、Core Utilization
を0.7として、配置密度を70%にします。また、Core to IO Boundary
をそれぞれ20と指定して、I/Oとの距離を20μmとします。

ここで、各I/Oピンの配置を指定します。Innovusを起動したターミナルに以下のようなコマンドを入力してみましょう。
innovus x> editpin -pin clk -layer metal3 -spreadType CENTER -side bottom -use CLOCK
innovus x> editpin -pin {rs2[0] rs2[1] rs2[2] rs2[3] rs2[4] rs1[0] rs1[1] rs1[2] rs1[3] rs1[4] rd[0] rd[1] rd[2] rd[3] rd[4]} -layer metal3 -spreadType CENTER -spacing 5 -side left
innovus x> editpin -pin {rs1_value[31] rs1_value[30] rs1_value[29] rs1_value[28] rs1_value[27] rs1_value[26] rs1_value[25] rs1_value[24] rs1_value[23] rs1_value[22] rs1_value[21] rs1_value[20] rs1_value[19] rs1_value[18] rs1_value[17] rs1_value[16] rs1_value[15] rs1_value[14] rs1_value[13] rs1_value[12] rs1_value[11] rs1_value[10] rs1_value[9] rs1_value[8] rs1_value[7] rs1_value[6] rs1_value[5] rs1_value[4] rs1_value[3] rs1_value[2] rs1_value[1] rs1_value[0] rs2_value[31] rs2_value[30] rs2_value[29] rs2_value[28] rs2_value[27] rs2_value[26] rs2_value[25] rs2_value[24] rs2_value[23] rs2_value[22] rs2_value[21] rs2_value[20] rs2_value[19] rs2_value[18] rs2_value[17] rs2_value[16] rs2_value[15] rs2_value[14] rs2_value[13] rs2_value[12] rs2_value[11] rs2_value[10] rs2_value[9] rs2_value[8] rs2_value[7] rs2_value[6] rs2_value[5] rs2_value[4] rs2_value[3] rs2_value[2] rs2_value[1] rs2_value[0]} -layer metal3 -spreadType CENTER -spacing 2 -side right
innovus x> editpin -pin {reg_we rd_value[31] rd_value[30] rd_value[29] rd_value[28] rd_value[27] rd_value[26] rd_value[25] rd_value[24] rd_value[23] rd_value[22] rd_value[21] rd_value[20] rd_value[19] rd_value[18] rd_value[17] rd_value[16] rd_value[15] rd_value[14] rd_value[13] rd_value[12] rd_value[11] rd_value[10] rd_value[9] rd_value[8] rd_value[7] rd_value[6] rd_value[5] rd_value[4] rd_value[3] rd_value[2] rd_value[1] rd_value[0]} -layer metal3 -spreadType CENTER -spacing 2 -side top
ここではまず最初のコマンドでclk
を下部に配置しクロックとして指定、その後、rd
、rs1
、rs2
を左側に等間隔で配置、rs1_value
、rs2_value
を右側に等間隔で配置しています。また、reg_we
とrd_value
を上部に等間隔で配置しています。こうしたピン配置はEdit
->Pin Editor
からより詳細に指定することもできます。

続いて、電源リングを作成します。チップ外周やマクロの外周には、幅広の電源配線を形成することが多いです。低インピーダンスかつ均一な電源供給を目指してそうするものです。
Power
->Power Planning
->Add Ring
より、次のように指定して、VDD
とVSS
のリング状配線を形成します。

設定完了すると、電源リングが形成されます。

その後、前準備として、以下のようなコマンドをターミナルに入力します。
innovus x> globalNetConnect VDD -type pgpin -pin vdd
innovus x> globalNetConnect VSS -type pgpin -pin gnd
これによって、各スタンダードセルの電源がグローバルな電源と接続されます。
続いてRoute
->Special Route
とすることで、電源リングからスタンダードセル配置予定の各列へ電源を配線できます。

上のように指定して、OK
とすると、交互にVDDとVSS電源レールが配線されます。

ここまでの結果を保存してみましょう。File
->Save Design
から次のように指定してファイルを保存できます。これをFile
->Restore Design
から呼び出すことで、保存した状態に復帰できます。なお、.enc
という拡張子は、以前のツール名称 (Encounter) の名残です。

レジスタファイルの配置配線 (配置)
次に、スタンダードセルを配置していきます。Place
->Place Standard Cell
として、起動したウィンドウでOK
としてみましょう。

右側のメニューから、Cell
のV (Visivility)
にチェックを付けると、スタンダードセル内部の配線も見ることができます。

レジスタファイルの配置配線 (CTS・配線)
さて、ここからいよいよ配線をしていきます。まず、クロックツリー合成 (CTS) 前向けの最適化を実行します。ECO
->Optimize Design
から、次のような設定でOK
します。

最適化によって少し配置が変化したのがわかると思います。

続いて、CTSを実施します。下のようなコマンドをターミナルに入力してみましょう。
最初のコマンドでクロックに用いるバッファセル名を指定し、その後のコマンドで合成を実行しています。

CTSによって、クロックの経路へバッファが挿入されます。また、うまくツリー状にクロックが分配されていることは、Clock
->CCOpt Clock Tree Debugger
から確認することができます。

その後、CTS後向けの最適化を実行します。ECO
->Optimize Design
から、次のような設定でOK
します。

最適化によってまた配置が変化します。特にI/Oピンへ長く引き回されていた配線にセルが入って配線長が短縮されているのがわかると思います。

続いて、スタンダードセル間の詳細配線を実施します。Route
->NanoRoute
->Route
より、以下のように指定して実行します。

詳細配線によって、スタンダードセル間がエラーの生じないよう接続されます。

詳細配線後にも最適化工程があります。まず、それに先立って、遅延計算や解析の設定をしておきます。
innovus x> setDelayCalMode -engine aae -SIAware true
innovus x> setAnalysisMode -analysisType onChipVariation -cppr both
その後、ECO
->Optimize Design
から、次のような設定でOK
します。

その後、最後に空いている部分にフィラーセルと呼ばれるセルを挿入します。これは製造ルール上のエラーを防ぐもので、一般に挿入の必要があります。たとえば、NwellやPwellは多くの場合細かく分割されないようにする必要があり、スタセルが無くてもこれらが繋がるようにフィラーセルを挿入します。
Place
->Physical Cell
->Add Filler
として、以下のように設定し、OK
します。

何も無かった部分に細いフィラーセルが挿入されているのがわかるかと思います。

これにて、最終的なレイアウトが得られました。

検証用のコマンドとして、以下のようなものがあります。実行して、ターミナルで結果を確認してみましょう。
Verify
->Verify DRC
: レイアウトは製造ルールを満たしているかVerify
->Verify Connectivity
: 想定通りの接続になっているか
Open Question: このレイアウトには実は問題点が残っており、製造できるかかなり怪しいです、どんなところが問題でしょうか?
レジスタファイルの配置配線 (レイアウト出力)
さて、無事完成したレイアウトを製造のために別の場所へ送付したり、あるいは他のレイアウトと組み合わせるためには、.gds形式で出力したいです。そこで、File
->Save
->GDS/OASIS
から、出力の設定をします。

ここで、Output File
には、出力ファイル名を、Map File
には、.gdsのレイヤ番号とレイヤ名の対応が記述されたmapファイル (/home/resources/gscl45nm/gds2_encounter.map
) を、Merge Files
には、各スタンダードセルの.gdsファイル (/home/resources/gscl45nm/gds/*
) をそれぞれ指定します。
出力されたファイルを別のアプリケーションから開いてみましょう。
として、レイアウトを見ることができればokです。

スクリプト化とコマンドライン実行
配置配線しようと思ったときに、今回のような手順を毎回おこなうのはかなり面倒だと思います。効率的に実行していくために、こうした手順を自動化する手段が用意されています。
Innovusの操作履歴は、innovus.cmd
というファイル名で保存されます。ここにおこなった操作がコマンドとして記録されているので、それをtclスクリプトなどにコピーして、そのスクリプトを実行するようにすればよいです。
実行したいコマンドを抜粋した.tclファイルを準備し、
とすることで、論理合成のときと同じようなかたちで、コマンドラインから配置配線を実行することができます。
自習課題
1から自分なりのディジタル回路をRTL設計して論理合成・配置配線してみましょう。手順としては、
- ディジタル回路のRTL設計を
.sv
で記述する - 講義中に利用した
.tcl
を参考に、自分が設計した回路に向けた.tcl
を作成する - Design Compilerで論理合成を実施する
- Innovusで配置配線を実施する
といったものになります。
(提出等の必要はありません。)
次回予告
本日はここまでです。次回はVLSI設計の流れを改めておさらいすると共に、プロセッサの高性能化、メモリや周辺回路、ソフトウェアといったトピックについて解説します。興味のある方はSRAMの構造やシステムソフトウェアについて復習してみてください。