2019年7月27日土曜日

IC Compilerにおけるderive_pg_connectionの順番

IC Compiler で電源を定義し回路(スタセル,マクロ)の電源ポートと接続するために
 derive_pg_connection コマンドを利用する.多電源回路では複数回コマンドを呼び出す必要があるが,スタセルの電源に接続したい電源名を最初に宣言する必要がある.

例えばVDDCとVDDMがあり,スタセルのVDDにVDDC配線を接続する場合は,
derive_pg_connection -power_net {VDDC} -power_pin {VDD} -ground_net {VSS} -ground_pin {VSS}
derive_pg_connection -power_net {VDDM}
とする.
もし
derive_pg_connection -power_net {VDDC}
derive_pg_connection -power_net {VDDM} -power_pin {VDD} -ground_net {VSS} -ground_pin {VSS}
と逆にすると,preroute_standard_cells コマンドでスタセルの電源レールを引いた時にVDDMとVSSのレールができてしまう.

preroute_standard_cells-net オプションをつけずに実行すると,デフォルトで電源とグラウンドのネットを使うとあるので,どうも一番最初に宣言した -power_net を回路の電源と認識するようだ.preroute_standard_cells コマンドで電源ネットを明示的に指定するためには以下のようにすれば良さそうだが未検証
preroute_standard_cells -net {VDDC VSS}

2019年7月23日火曜日

IC Compilerでホールド違反を回避できない時に気をつける事

(1) ホールド違反を回避しながら再配線する
set_fix_hold [all_clocks]
route_opt -incremental -only_hold_time

(2) focal_optを実行する
focal_opt -hold_endpoints all -register_to_register

focal_optはトポロジベースのポストルート最適化コマンドで,セットアップ違反,ホールド違反,DRC 違反などを回避可能だそうだ.ポストルート最適化なので route_opt のあとに実行する.

(3) コア面積の余裕を確認する
コア面積に十分余裕がないとホールド違反回避バッファを入れられないので,いくら
route_opt -incremental -only_hold_time
を実行してもホールド違反を回避できない.

create_floorplan で Utilization が 0.8 だから大丈夫?そんなことはなくて,TAP セル,Endcap セル,Tie セルなどがどんどん入るので余裕はない.さらにTiming Driven P&R では駆動力が足りない場合はより大きなセルに入れ替えたりパスを分割(path-spliting)して駆動力を確保するのでますます余裕はなくなる.

ある回路では,初期の Utilization が54.8%だったのに,配置配線後の実際のUtilizationは87.1%になっていた.

Utilizationは以下のコマンドで評価できる.
report_placement_utilization

2019年7月5日金曜日

HSPICEにおける非収束(Non-Convergent)の原因と対策

マニュアルを訳しただけです.

HSPICEでなんで収束しないの?そもそも収束って何?と言う人はSPICEの動作原理について勉強するといいかも.

[原因]
#0 回路構造の確認
回路にフローティングが存在すると,その点の電圧を決定できないために非収束となる.すべてのノードがなんらかしらの素子を経由しながら電源もしくはグラウンドに接続されている事を確認する.

#1 初期値の設定
安定状態が複数ある回路の場合,初期値を自動的に決められない.特にリングオシレータやフリップフロップは初期値を一意に決められない.その場合,.ic コマンド(initial condition)を使い初期値を与える必要がある.

#2 不適切なモデルパラメータの導入
物理モデルパラメータに沿わないパラメータを導入した結果,ソースドレイン電流や容量特製に不連続が発生する事がある.これはinitial timestep too smallエラーを引き起こす.

#3 PN結合の高抵抗
BJTやMOSFETのPN結合は高いオフ抵抗を持つ.このオフ抵抗が非収束の原因となる.HSPICEでは,.option gmindc .option gminを設定する事で,これらの素子に自動的に抵抗を挿入し収束可能性を向上する.

[対策]
#1 すべてのオプションを消して,HSPICEの標準の収束アルゴリズムを動かしてみる.

#2 .nodesetや.icを用いて初期値を適切に与える.

#3 デジタル回路であるなら,シンボリック動作点解析アルゴリズムを利用する.
.option symb=1

#4 ITL1とITL2を200から500の範囲で増やす.
.option ITL1=300 ITL2=300

#5 収束アルゴリズムを変える.HSPICEは標準でDCON=1,2とアルゴリズムを変え,
最終的にconverge=1を選ぶ.これでも収束しない場合設定で変えてやる.また
gmindcの値を小さくする(ただし1e-9より小さくしてはいけない)
.option converge=2 gmindc=1e-11
.option converge=3 gmindc=1e-11

#6 2 DC バイアスポイントによる方法もあるが,よくわからなかった.非収束の原因となるデバイスをオフにしてバイアスポイントを求め,次にこの素子をオンにしてバイアスポイントを求めるのだろうか.

2019年7月1日月曜日

HSPICEの性能を上げる10のtips

SynopsysのBlogを直訳したものです.
10 tips to improve performance using HSPICE

#1 HSPICEの収束性を上げるためにrun levelを適切に設定する.
.option runlvl = 1|2|3|4|5|6

#2 High Performance Parallel(HPP)オプションを使い,マルチスレッドで高速化する.
% hspice [file].sp -mt [numCPU] -hpp

あまりたくさんのCPUを指定しても速くならない.2~4CPU程度

#3 分散コンピューティング(Distributed Computing)オプションを使い,マルチマシンで高速化する
% hspice [file].sp -dp [numCPU]

分散コンピューティングのための事前に設定が必要.

#4 ポストレイアウトシミュレーションの場合, RC 縮約を使う.
.option sim_la

#5 ワイルドカードを使ってすべてのノードの電圧・電流を見るのではなく,見たいノードを指定する.
.probe tran v(xi.*)  i(xi.*)
× .probe tran v(*)  i(*)

#6 ポートの電流の向きを指定する.
.probe tran isub(xinv.vdd) isub(xinv.v*)
×  .probe tran isub(*)

#7 .alterを使っている場合,回路構造の解析を省略する.
.option altcc altchk

#8 回路要素のチェックや回路構造のチェックを飛ばしシミュレーション時間を短くする
.option notop noelck

#9 回路を変更していない場合,過去のシミュレーション結果を再利用する事でシミュレーション時間を短縮する
% hspice -i [file].tr0 -meas [meas file]

[meas file]は,HSPICEの構文のうち.measureなどの測定命令,.paramなどの設定命令のみを抜き出したもの

#10 .measureがすべて終了したらシミュレーションを終了する.
.option autostop