Calibre xRCでできたので,StarRCでできるのか調べた.以下のコマンドでできる.
COUPLING_REPORT_FILE: file
fileで指定したファイルに出力される.レポートは,キャパシタの総容量(Ct)に対するカップリングキャパシタの容量(Cc)の比,カップリングキャパシタの容量の絶対値(Cc),Victim Net,Aggressor Netの順で表示される.
2019年8月14日水曜日
2019年8月13日火曜日
Calibre xRCでカップリングキャパシタを報告する
Calibre xRCでカップリングキャパシタを報告するには以下の命令を使う.
PEX REPORT COUPLING CAPACITANCE filename
[NUMBER count]
[SPLIT_NET]
[THRESHOLD value]
[LAYOUT | SOURCE]
filename に指定するファイルにカップリングキャパシタの情報を出力できる.
以下はオプション
NUMBER count:カップリングキャパシタの数を指定する.デフォルトは1000
SPLIT_NET:出力を制御できる.宣言時Net Bへのレポートが別の行に出力される.
THRESHOLD value:value以下の容量を出力する.
LAYOUT | SOURCE:配線名をLayoutから選択する,もしくはソースネットから選択する
PEX REPORT COUPLING CAPACITANCE filename
[NUMBER count]
[SPLIT_NET]
[THRESHOLD value]
[LAYOUT | SOURCE]
filename に指定するファイルにカップリングキャパシタの情報を出力できる.
以下はオプション
NUMBER count:カップリングキャパシタの数を指定する.デフォルトは1000
SPLIT_NET:出力を制御できる.宣言時Net Bへのレポートが別の行に出力される.
THRESHOLD value:value以下の容量を出力する.
LAYOUT | SOURCE:配線名をLayoutから選択する,もしくはソースネットから選択する
2019年8月6日火曜日
Calibre xACT 3Dを使ってRC抽出を行う
Calibre には RC 抽出の方法が2つあり,モデルベースである xRC と,フィールドソルバである xACT 3Dがある.後者を使ってRC抽出をやってみる.Calibreのルールファイルは xRC と同一でよく,以下のようにコマンドを実行すればよい.
% calibre -lvs -hier -spice svdb/circuit.sp -nowait circuit.svrf > circuit.log
% calibre -xact -3d -pdb -rcc circuit.cal >> circuit.log
% calibre -xact -fmt circuit.cal >> circuit.log
マニュアルには
% calibre -xact -3d -rcc circuit.cal
と書いてあったが,-pdb オプションをつけないとPhysical Database (pdb) が生成されず3行目のコマンド実行に失敗する.xRC と xACT 3Dは違うのかというと,xACT 3Dは特に細かいカップリングキャパシタが報告されるようになった.
% calibre -lvs -hier -spice svdb/circuit.sp -nowait circuit.svrf > circuit.log
% calibre -xact -3d -pdb -rcc circuit.cal >> circuit.log
% calibre -xact -fmt circuit.cal >> circuit.log
マニュアルには
% calibre -xact -3d -rcc circuit.cal
と書いてあったが,-pdb オプションをつけないとPhysical Database (pdb) が生成されず3行目のコマンド実行に失敗する.xRC と xACT 3Dは違うのかというと,xACT 3Dは特に細かいカップリングキャパシタが報告されるようになった.
2019年8月5日月曜日
Calibre xRC でRCの縮約を行う
Calibre xRC で RC 縮約を行うには以下のオプションを使う
・Analog回路向け
PEX REDUCE ANALOG {NO | YES [DELAY_ERROR delay] [NOISE_ERROR noise]}
NO (default): 縮約を行わない
YES:RC 縮約を行う.以下のオプションがある
DELAY error:時間遅延の閾値.単位はs.デフォルトは0.5ps
NOISE_ERROR noise:エラーの閾値.単位は比.デフォルトは0.01(1%)
PEX REDUCE ANALOG YES を宣言すると,PEX REDUCE TICER と PEX REDUCE CC が有効になる.
PEX REDUCE TICER は指定するシミュレーション速度で差が出ないように縮約する命令(PEX REDUCE DISTRIBUTED と同じ),
PEX REDUCE CC はカップリングキャパシタの縮約する命令.
PEX REDUCE ANALOG と後述の PEX REDUCE DIGITAL は同時に宣言できない.
・Digital回路向け
PEX REDUCE DIGITAL {NO | YES [DELAY_ERROR delay] [NOISE_ERROR noise]}
NO (default): 縮約を行わない
YES:RC 縮約を行う.以下のオプションがある
DELAY error:時間遅延の閾値.単位はs.デフォルトは0.5ps
NOISE_ERROR noise:エラーの閾値.単位は比.デフォルトは0.01(1%)
・Analog回路向け
PEX REDUCE ANALOG {NO | YES [DELAY_ERROR delay] [NOISE_ERROR noise]}
NO (default): 縮約を行わない
YES:RC 縮約を行う.以下のオプションがある
DELAY error:時間遅延の閾値.単位はs.デフォルトは0.5ps
NOISE_ERROR noise:エラーの閾値.単位は比.デフォルトは0.01(1%)
PEX REDUCE ANALOG YES を宣言すると,PEX REDUCE TICER と PEX REDUCE CC が有効になる.
PEX REDUCE TICER は指定するシミュレーション速度で差が出ないように縮約する命令(PEX REDUCE DISTRIBUTED と同じ),
PEX REDUCE CC はカップリングキャパシタの縮約する命令.
PEX REDUCE ANALOG と後述の PEX REDUCE DIGITAL は同時に宣言できない.
・Digital回路向け
PEX REDUCE DIGITAL {NO | YES [DELAY_ERROR delay] [NOISE_ERROR noise]}
NO (default): 縮約を行わない
YES:RC 縮約を行う.以下のオプションがある
DELAY error:時間遅延の閾値.単位はs.デフォルトは0.5ps
NOISE_ERROR noise:エラーの閾値.単位は比.デフォルトは0.01(1%)
2019年8月3日土曜日
IC Compilerで矩形以外のフロアプランを使う(initialize_rectilinear_block)
IC Compiler でフロアプランを作成するとき,create_floorplan コマンドを使うが,これは長方形のフロアプランしか作成できない.長方形以外のフロアプランを作るときは initialize_rectilinear_block コマンドを使う.
initialize_rectilinear_block
[-bottom_io2core distance]
[-control_type ratio | length]
[-core_side_dim { side_a side_b side_c side_d [side_e side_f]}]
[-core_utilization ratio_val]
[-flip_first_row]
[-keep_io_place]
[-keep_macro_place]
[-keep_std_cell_place]
[-left_io2core distance]
[-no_double_back]
[-orientation N | W | S | E ]
[-right_io2core distance]
[-row_core_ratio ratio_val]
[-shape L | T | U | X]
[-start_first_row]
[-top_io2core distance]
[-use_current_boundary]
[-use_vertical_row]
例えばL字型のフロアプランであれば,以下のようにする.
initialize_rectilinear_block
-control_type length
-core_side_dim { side_a side_b side_c side_d }
-shape L
length オプションにした場合, side_a side_b side_c side_d は長さ(um)を指定する.ratio オプションにした場合,side_a side_b side_c side_d は4辺の比率となり -core_utilization で指定した Utilization を満たす様にサイズを自動的に調節する.
形は,-shape オプションでL字,T字,U字,X字が選択できる.頂点の数は形に寄って変わる.
T字,U字,X字の場合は以下のように指定する.
-core_side_dim { side_a side_b side_c side_d side_e side_f}
回転角は -orientation オプションで N (0°),W(90°), S(180°),E(270°)と選択できる.
H型などさらに複雑なフロアプランは,create_boundary コマンドで生成できる.
詳細はマニュアル(IC Compiler Design Planning User Guide)…と思いきや,マニュアルには「詳細は ICC で man を開くように」と書いてある.
initialize_rectilinear_block
[-bottom_io2core distance]
[-control_type ratio | length]
[-core_side_dim { side_a side_b side_c side_d [side_e side_f]}]
[-core_utilization ratio_val]
[-flip_first_row]
[-keep_io_place]
[-keep_macro_place]
[-keep_std_cell_place]
[-left_io2core distance]
[-no_double_back]
[-orientation N | W | S | E ]
[-right_io2core distance]
[-row_core_ratio ratio_val]
[-shape L | T | U | X]
[-start_first_row]
[-top_io2core distance]
[-use_current_boundary]
[-use_vertical_row]
例えばL字型のフロアプランであれば,以下のようにする.
initialize_rectilinear_block
-control_type length
-core_side_dim { side_a side_b side_c side_d }
-shape L
length オプションにした場合, side_a side_b side_c side_d は長さ(um)を指定する.ratio オプションにした場合,side_a side_b side_c side_d は4辺の比率となり -core_utilization で指定した Utilization を満たす様にサイズを自動的に調節する.
形は,-shape オプションでL字,T字,U字,X字が選択できる.頂点の数は形に寄って変わる.
T字,U字,X字の場合は以下のように指定する.
-core_side_dim { side_a side_b side_c side_d side_e side_f}
回転角は -orientation オプションで N (0°),W(90°), S(180°),E(270°)と選択できる.
H型などさらに複雑なフロアプランは,create_boundary コマンドで生成できる.
詳細はマニュアル(IC Compiler Design Planning User Guide)…と思いきや,マニュアルには「詳細は ICC で man を開くように」と書いてある.
2019年8月1日木曜日
ゲートレベルシミュレーションにおけるFFのリセット
リセットのない FF のゲートレベルシミュレーションを行うと,初期値がないので X が伝搬してしまう.Verilog HDL では force / release を使い値の強制設定と解除が可能であるが,うまく force / release しないと X の伝搬を防ぐ事ができない.特に実負荷シミュレーションではクロックスキューもあるので,release のタイミングと実際にクロックが入るタイミングがずれる問題もある.
普通に force / release してもうまくいかない時の対策
・複数サイクルにかけて force を入れる
・FF のデータ入力だけでなく出力端子にも force を入れる
以下のようなPerlスクリプトを書いて,DATA端子とQ端子を探し force / release していました.
force / release の使い方はこちら. http://kawaiihaseigi.blogspot.com/2017/07/verilog-force.html
普通に force / release してもうまくいかない時の対策
・複数サイクルにかけて force を入れる
・FF のデータ入力だけでなく出力端子にも force を入れる
以下のようなPerlスクリプトを書いて,DATA端子とQ端子を探し force / release していました.
force / release の使い方はこちら. http://kawaiihaseigi.blogspot.com/2017/07/verilog-force.html
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}
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
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 バイアスポイントによる方法もあるが,よくわからなかった.非収束の原因となるデバイスをオフにしてバイアスポイントを求め,次にこの素子をオンにしてバイアスポイントを求めるのだろうか.
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
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
登録:
投稿 (Atom)