ローム0.6umプロセス用 東大版 ライブラリ (Synopsys Design Compiler, Verilog-XL, Avant! ApolloXO)
# Copy Right(C) Makoto IKEDA, VDEC University of Tokyo 1999.
目次
- 概要
- Synopsys合成ライブラリ
- ネットリストレベルのシミュレーション
- 配置配線へのデータ受渡し
以下にそれぞれのライブラリの使用方法を簡単に述べます。詳細は、関連のページ
(NEL 九大版など)などにありますので、そちらを参照下さい。
また、ここでは、あくまでもここのツールを独立して使用することを前提として
いますので、 Cadence の CSI(Synopsys Interface) などは、各自で行なって下さい。
うまい方法がありましたら、設計手法のページとしてリンクなどを張りますので、
お知らせ下さい。
なお、現時点では各チップサイズにおけるセル数の限界は不明です。
ただし、ネットが複雑でない限りかなりの確立で Row/Core Retio を 1.0 に出来る
ので、その場合、
3.9mm角チップで ????(未確認)セル(SynopsysのCellArea で 程度が限界
4.5mm角チップで 15,000セル(SynopsysのCellArea で 7.8 X 10^6 um2 程度が限界
8.9mm角チップで 400,000セル(SynopsysのCellArea で 2.6 X 10^7 um2 程度が限界
と推測されます。
モデルとして、線形遅延モデルとテーブル遅延モデルの2種類が用意されています。
ただし、抽出条件は、標準値(Typical: 25度, 5V) のみとなっていますが、その他の
条件が必要な場合には別途作成しますので、御連絡下さい。(ただし必ずしも即応
出来ないことがありますので御了承下さい)
core部分の合成のみであれば、 rohm06_lin.db (もしくは tbl)をターゲット、
リンクライブラリに指定してください。
IOバッファを挿入したい場合にはさらに、RohmIO_lin.db(RohmIO_tbl.db)を
追加して下さい。
簡単に合成を行なうためのスクリプト例です。例題として、パラレルロード付き4bitカウンタ
(cnt.v,
sim_cnt.v: シミュレーション用ファイル)を用います。なお、ここでは IOバッファの挿入の
例を示すために無理矢理IOポートをしたて上げていますので、
一般的なカウンターとはなっていません。
コンパイルのオプション、制約条件などは個々の設計データに合わせて
適切に設定して下さい。ここでは、そのようなことは一切考慮しておりません。
% dc_shell < cmd.scr(説明付)
% verilog -v rohm06.v -v RohmIO.v sim_cnt.v
を実行することでネットリストレベルのシミュレーションが行なえます。
ただし、バス配線を用いている場合などは展開されてしまいますので、
適切な処置が必要です。
- パッド配置用のデータの作成
CellInfo.log ファイルから、スクリプト(RohmIOPlace.pl)
(別途 perlが必要です)を用いて
パッドピンファイルを抽出します。内容は CellInfo.logのなかの RZIBUF, RZOBUF, RZIOBUF等
のIOインスタンス名を抽出するものです。
% RohmIOPlace.pl -C CellInfo.log -PO pin.dat -S [0:2]
-Sオプションはチップの寸法で 0: 4.5mm, 1:8.9mm, 2: 3.9mmのいずれかを指定して下さい。
これにより得られた pin.dat の1カラム目を適切なパッド番号に修正します
(修正例:pinN.dat)。
使用可能なパッド番号は、設計規則のパッド配列の図面を参照下さい。
ただし、本スクリプトでは、電源/グランドの配置に関しては、ロジックテスターのテストボードの
使用を前提として作成してあり、それが守られていない場合にはエラーとなります。
それ以外の配置を希望される場合には、スクリプトの修正が必要となりますが、その際には、パッド位置
がずれないように十分注意して下さい。またまた、いずれの場合でも識別抵抗を挿入する3番ピン、
(3.9mm角チップでは加えて4番ピン)は使用禁止、2番ピンはグランドとしてのみ使用可能、コーナ部分の
ピンは電源/グランド固定となっています。
次に同じ RohmIOPlace.pl を用いて、Avant! ApolloXO 用のパッド制約ファイルを
作成します。
% RohmIOPlace.pl -PI pinN.dat -S [0:2] -TDF cnt_tdf.sc -CLF cnt_clf.sc -FRM cnt_frm.sc -ED cnt.edtext
pinN.dat は全てのカラムがタブで区切られていることを確認して下さい。
-Sオプションはチップの寸法で 0: 4.5mm, 1:8.9mm, 2: 3.9mmのいずれかを指定して下さい。
本スクリプトの実行にあたっては、画面に出力されるメッセージを良く確認するようにして下さい。
ピン番号を既に割当されている番号にしたような場合には、メッセージは出力されますが、
異常終了はしないようになっています。
ここで、パッド位置定義ファイル(cnt_tdf.sc)はIOセルの配置座標情報、
セル定義ファイル(cnt_clf.sc)はネットリストに出てこない電源用IOセル
などを定義するファイルとなっています。
EDTEXTファイル(cnt.edtext)は後述の、LVSで使用するためのファイルです。
- ネットリストの読み込み
Milkyway を使用してネットリストを読み込みます。
ネットリストの読み込みは以下のスクリプトNetIn.cmdの
ながれに沿って行ないます。但し、各設計において、
初回は必ずMilkywayを自分で操作し、内容を理解した上で、
スクリプトを使用して下さい。最初からスクリプトを使用してしまうと、
内容が理解できず、問題が生じた際に自己解決が出来なくなります。
また、実行後には必ずログを参照し、エラーなどが発生していないことを確認して下さい。
% Milkyway -replay NetIn.cmd -log NetIn.log
必要ファイル:
rohm06lin_apollo.tar.gz を適切な場所に展開し、Ref Lib のパスを設定
rohm06iolin_aplllo.tar.gz を適切な場所に展開し、Ref Lib のパスを設定
なお、遅延モデルを含んだセルを使用する場合にはそれぞれ適切なものを選択すること。
- 配置配線
配置配線は以下のスクリプト
PR.cmdの
ながれに沿って行ないます。
% Apollo -replay PR.cmd -log PR.log
また、Milkyway同様にオプションとして-cmd <file name>
を指定することで、実行したコマンドをファイルにセーブすることが出来、
次回に反復する場合に便利です。
- レイアウトデータの出力
レイアウトデータの出力は以下のスクリプト
StrmOut.cmdの
ながれに沿って行ないます。
% Milkyway -replay StrmOut.cmd
- バックアノテーション
% verilog -u +define+SDF +sdf_verbose -v rohm06.v -v RohmIO.v sim_cnt.v
ネットリストレベルのシミュレーションにSDFファイルを読み込ませることで、
配線遅延情報を加味したシミュレーションを行なう。-uは大文字小文字を区別しない
オプションで、Apolloの配置配線を大文字小文字を区別せずに実行しているため、SDF
ファイルが全て大文字となってしまうため必要となる。
+define+SDFはsim_cnt.vの中でSDFを読み込ませる $sdf_annotate文を有効に
するための定義文。+sdf_verboseはSDFを用いたシミュレーションのログを出力する
オプションである。
このシミュレーションとネットリストレベルのシミュレーションの結果が一致している、
もしくは動作的に等価であることを確認すること。
- 設計規則検査(必須)
ローム社のプロセスでは、ローム社提供のDRC, LVSルールファイルがCDROMにより提供されている。
ここでは、そのルールファイル(gbu14n1z.rul)を用いたDraculaDRCの実行方法と、エラーの
確認方法を示す。なお、Dracula はカレントに大量のファイルを作成するので、
ファイルが紛れないようにディレクトリを作成して実行することが望ましい。
- ルールファイルの編集
ルールファイルを各自の実行環境に応じて編集する
◯ 40行目: BATCH-QUEUE = DRA$BATCHをコメントアウト(頭に ; を入れる)
◯ 47行目: START-MACRO = $DRAC_MACRO/start_macro.drc をコメントアウト(頭に ; を入れる)
◯ 48行目: END-MACRO = $DRAC_MACRO/end_macro.drc をコメントアウト(頭に ; を入れる)
◯ 50行目: PROGRAM-DIR = $DRAC/ を各自のDraculaのインストール先に応じて
PROGRAM-DIR=/cad02/cadence/97A/tools/dracula/bin/のように修正する
◯ 50行目に追加:
INDISK=cnt.str
PRIMARY=COUNTER
ストリームファイル名およびトップストラクチャ名を指定する
◯ 50行目に追加:
・DRCの結果をCadence VirtuosoのInqueryで参照したい場合
KEEPDATA = YES もしくはINQUERY
この場合、カレントディレクトリに大量の**.DATファイルが生成されることにな
る。
・大量のDATファイルが残って欲しくない場合
KEEPDATA = NO
◯ 203行目のコメントを外して、始めに作成した EDtextファイルを指定する。
edtext = cnt.edtext
◯ 622行目から635行目(#1-4から#1-4 ENDまで)が有効になっていることを確認する
◯ 639行目から656行目(#1-5から#1-5 ENDまで)がコメントアウトされていることを確認する
- PDRACULAの実行
% PDRACULA
: /get gbu14n1z.rul n
: /finish
この操作の最中にエラーが出ていないことを確認すること。この操作により、
Draculaの実行モジュール jxrum.comなどが生成される。
- jxrun.comの実行
% jxrun.com > drc.log
drc.log を確認して、draculaの実行が最後まで正常に行なわれていることを
確認すること。Draculaの実行は正常な場合次のような形で終了する
*/N* AT STAGE: 250
ここで、本ルールの場合STAGE番号が250で終ることになっているので、それを
確認すること。
- エラーの確認
error.sumファイルを見る。
最初に ALL ERROR CELLS LISTINGとあり、ルールファイルでエラーとして生成される
セル名が列挙されている(これが全てエラーな訳ではない)
次に INDISK ..... CELL **** DELETED .....という行が続くが、これは
実際にはエラーが発生しなかったので、削除されたセル名を表している。
最後に OUTPUT CELL SUMMARY の項目に実際にエラーが発生しているセルが列挙されている。
セル名 レイヤー 範囲(llx, lly, urx, ury ) 個数
DRT03A63 63/0 -1423.72 -1364.93 1423.72 1364.93 2236 0
DRT04B63 63/0 -626.62 -653.17 731.47 125.18 200 0
通常は、ここにエラーが全くないのことが期待される。ここにエラーがある場合には、
何らかの方法でエラーを取り除くよう最大限の努力をすべきである。
上記の例はApolloで設計する場合しばしば発生する問題で、
太線におけるVIAの場合重なりを通常より大きくとらなくてはいけないというものであるが、
Apolloでは電源線の一部の部分において、このルールを守らないために生じてしまう。
この問題は通常は、配線を行なう際に FAT Wire を使うように設定することで回避することが可能である
(配置配線の流れを参照のこと)。
エラーの図形は drc.gdsに出力されているので、レイアウトエディタを用いて場所の確認を
行なうことが出来る。Cadence Virtuosoを使用している場合、上述のKEEPDATA=INQUERYを設定することで、
レイアウトエディタ中のInqueryモードによりエラーGDSを読み込まずにエラー場所を確認することが
可能である。
また、エラーセル名は最後の2文字(数字)がエラーセルのレイヤー名を
表しており、上の例では、 DRT03A63 という名前で レイヤー番号63に出力されたセルという
ことになる。そこで、DRT03A という名前をルールファイルで探すと
ENC[TO] wAL2VI2 ALMI2 LT **** OUT DRT03A 63 ;1203a
という行が見つかる。通常は行の後にコメントにて、設計規則書面の対応するルール名が
記載されているのでそちらを参考にして修正することになる。
- LVS
準備するファイル: rohm06.cir.gz,
rohm06io.cir.gz,
gbu18n1b.lvs(CDROM)
- ネットリストの作成 (LOGLVSの実行): 合成結果の cntout.vが必要
% LOGLVS <<!
fpin
cir rohm06.cir
cir rohm06io.cir
ver cntout.v
link
con
x
!
以上の操作により LVSLOGIC.DAT というファイルが生成されます。
fpin はVerilogのマクロなどの呼び出しの際にオープン端子がある時の
処理用ですので、そのような端子がない場合には不要です。
Verilog ネットリスト中では 1, 0 への接続を 1'b1, 1'b0 という形で記述しているが
Dracula LVS はこれを解釈してくれない。。ようなので、それぞれ VDD, VSSに修正する。
別な方法としては Milkyway で verilogOut させる手もあるが、一旦 Apollo に入ってしまった
正体不明のネットリストで LVSを行なうのは危険であるので、 Synopsys が出力したもの
を修正することを勧める。
また、Apolloにおいてクロックツリー合成などを行なっている場合には、当然Synopsysの
ネットリストとLVSを行なっても不一致が見られることとなるので、Milkyway で VerilogOutを
行なったネットリストを用いてLVSを行なうことになる。この場合には、VerilogOutした
ネットリストが本当に機能的に正しいかを Verilogシミュレーション(もしくは、フォーマルベリフィケーション?)により
確かめておく必要があるであろう。
- dracula の実行
gbu18n1b.lvs を以下のように修正
◯ 124行目: BATCH-QUEUE = DRA$BATCHをコメントアウト(頭に ; を入れる)
◯ 131行目: START-MACRO = $DRAC_MACRO/start_macro.drc をコメントアウト(頭に ; を入れる)
◯ 132行目: END-MACRO = $DRAC_MACRO/end_macro.drc をコメントアウト(頭に ; を入れる)
◯ 137行目: PROGRAM-DIR = $DRAC/ を各自のDraculaのインストール先に応じて
PROGRAM-DIR=/cad02/cadence/97A/tools/dracula/bin/のように修正する
◯ 137行目に追加:
INDISK=cnt.str
PRIMARY=COUNTER
ストリームファイル名およびトップストラクチャ名を指定する
◯ 223行目のコメントを外して、始めに作成した EDtextファイルを指定する。
edtext = cnt.edtext
◯ 340行目から362行目 element dio[p] から element bjt[p] までの行を全てコメントアウトする。
この部分は、アナログ設計を行なっている場合に、ダイオード、寄生バイポーラ、容量、抵抗などのLVSが必要な
場合には有効にする必要があるが、この場合ディジタルであるので、とりあえず無視するようにしておく
◯ 404行目の[]中にFを追加する
LVSCHK[FSP] WPERCENT=5 LPERCENT=5 CAPVAL=1 RESVAL=1 RESWPERCENT=1
この操作により、IOセル中に含まれている未使用トランジスタを無視してLVSを行なうことが出来る。
心配な場合には、これを外した場合とを比較すると良い。
またここで用いるIOセルについてはVSS, VSSOがショートしているため、
edtext においても VSSO 端子は VSS としてある。
% PDRACULA <<!
/get lvs.rul
/finish
!
この操作で jxrun.com が生成されているはずである。生成されていない場合には
lvs.rul のファイル中にエラーが存在しているということであるので、適宜修正すること。
jxrun.com の実行
% jxrun.com >& lvs.log
標準出力は出来る限り log にとっておくことを推奨する。
lvs.erc, lvs.lvs などにエラーがないことを確認する。