2020年6月9日火曜日

SiliconSmartでキャラクタライズする項目を限定する

SiliconSmartでキャラクタライズする項目を限定するには,characterizeコマンドに-matchオプションをつける.

characterize -match {setup*|hold*|delay*} cells

-match オプションでマッチしたシミュレーションのみが実行される.runtime ディレクトリを見るとどのようなシミュレーションが実施されるかわかる.代表的なのは以下.
Cin:入力容量評価
delay:遅延評価
energy:動的エネルギー評価
hold:ホールド時間評価
initialization:初期状態の各ノードの電圧評価
leakage_power:リーク電力評価
ncmpw:最小パルス幅評価
setup:セットアップ時間評価

2020年6月5日金曜日

Calibre xactview を使う

Calibre xACT で抽出した RC つきネットリストを GUI で解析するには,Calibre xActView を使う.デバイスの構造を示す fs3 ファイルと,fs3 ファイル内のネット番号を実際のレイアウトのネットへ対応させる pdb が必要.いずれもCalibre xACTを実行していれば抽出されているはず.

起動方法
% xactview -fs3 filename.fs3 -pdb filename.pdb

起動するとレイアウトが表示される.



図はASAP7でのインバータである.Finが表示されない理由は不明.

Net and shapes
ネットをハイライトすることができる.Window -> Net and Shapes からNet and shapesを呼び出せる.Net Name からネット名を選んで Add するとハイライトされる.


Device Highlight
抽出されたデバイスがどれであるかハイライトできる.Window -> Devices から Device Highlight を呼び出せる.Device ID からネット名を選んで Add するとハイライトされる.


わかりづらいけれど,インバータを構成するPMOSとNMOSが白くハイライトされている.ただ,表示される Device ID と SPICE ネットリストのインスタンスとの関係がわからない.消えてしまったダミーゲートもリストにあるらしく,いまいち使い方がわからない.

Coupling Capacitanceの表示

カップリング容量を表示できる.そのためにはCalibe xACTで抽出したカップリング容量を読み込む必要がある.
% xactview -fs3 filename.fs3 -pdb filename.pdb -fs3out filename.fs3.out -cfcap filename.cfcap

Window -> Devices から 3 種類の表示方法を選択できる.それぞれカップリング容量も表示してくれる.

Net Coupling
ネット間のカップリング容量と,どの Shape 間にカップリングが生じているかハイライトする.Shape は Virtuoso の Rectangle と同じと思えばよいようだ.



Net Coupling の例(色変えてます)

Shape Coupling
ある Shape と別の Shape 間のカップリング.

Layer Coupling
ある Layer における Shape と別の Shape 間のカップリング.


Calibre で抽出する寄生成分を選択する

正確には,出力時のフォーマットで抽出した結果を選択できる.
% calibre -xrc -fmt {-r|-c|-rc|-rcc|-adms|-all|-simple} rule.cal

オプションはそれぞれ以下の通り.
-r:抵抗のみ抽出
-c:容量のみ抽出
-rc:RCの分布定数回路として抽出.インダクタは抽出しない.容量はグラウンドとのカップリング容量としてみなす.
-rcc:RCの分布定数回路として抽出.インダクタは抽出しない.
-adms:ADMSフローで利用する.
-all:RCの分布定数回路として抽出.
-simple:寄生成分のないシンプルなネットリストを出力する.

StarRCはルールファイルに抽出成分を指定するのだが,Calibreはコマンドラインオプションだった.なお抽出時もオプションを指定できるのだが,抽出は全部抽出してファイル書き出し時に指定した方が楽?

2020年6月4日木曜日

Finesimで回路のタイプを指定し,精度と速度のトレードオフをとる(finesim_mode)

finesim_modeオプションを使い,対象回路のタイプを指定できる.

.option finesim_mode=mode

modeは以下の7つがある.

Mode Target
spicead High precision analog circuits.
spicehd Highly sensitive analog circuits.
spicemd General SPICE mode for all circuit types.
spicexd Mixed signal design/Extracted Post Layout.
prohd Large mixed signal design/leakage/power simulations.
promd Timing simulations.
proxd Functional verifications.


対象回路のタイプを指定すると,タイプに応じてサブオプションが
以下のように変化し,精度と速度と回路規模のトレードオフをとってくれる.
hspiceでいる runlvl に相当するようだ.

model speed spred partition qlevel loadmodel tunit tsc
spicead 4.5 0.5 0 0 2 N/A 0.01p lte2
spicehd 4 0.5 0 0 1 N/A 0.01p lte1
spicemd 4 1 0 0 1 N/A 0.1p lte1
spicexd 3 1 1 0 1 N/A 1p lte1
prohd 3 1 1 1 N/A 4 1p lte1
promd 2 2 2 1 N/A 2 1p lte1
proxd 2 3 3 1 N/A 1 1p lte1

finesim_model はトランジスタモデルの選択,
finesim_speed は計算のタイムステップ,イベント信号,Newton-Raphson法での公差の制御,
finesim_spred はRC縮約の程度,
finesim_partition は回路分割の積極度,
finesim_qlevel は電流計算時の収束強度の設定,
finesim_loadmodel は回路分割時の容量モデルの設定,
finesim_tunit は基本となる時間解像度の設定,
finesim_tsc は過渡解析時の打ち切り誤差の設定,
をそれぞれ設定する

サブサーキットごと,ローカルに指定する事も可能.
.option finesim_mode="pattern:mode"[:subckt | :instance | :node | :device]

例えばインスタンス X1 以下のデバイスを spicemd 設定にできる.
.option finesim_mode="X1.*:spicemd":device
インスタンス名でなく,サブサーキット名で指定することもできる.
.option finesim_mode="INV*:spicemd":device

.opset を使うと,finesim_modeに応じて使うオプションを個別に追加することもできる.
.opset (finesim_mode=mode) option_name[=option_value] ....

spicemd の時だけ,計算法をgearにすることができる.
.opset (finesim_mode=spicemd) finesim_method=gear

2020年5月22日金曜日

GPAの定義は大学によって違う

GPA(Grade Point Average)という成績の評価値があって,日本の大学で最近よく使われている.どの大学でもGPAと呼んでいるが,実は大学ごとに基準がグチャグチャでGPAでは大学間の成績評価できない.一般には1~4で評価するけれど,1~4.3とA+の+相当に0.3あてる大学もあれば,2~5と一般より+1高く評価される大学もある.
調査結果が以下のPDFで報告されている.
https://gakkai.univcoop.or.jp/pcc/2017/papers/pdf/pcc019.pdf

これでは平等に比較できないと思いきや,一応対策があって日本では文科省の「成績評価係数」の表で吸収しているようだ (それでも,例えば京大定義は実質+5点シフトでちょっとずるいのでは).
とある私立R大学はGPの定義が2~5なので,GPA4です!と言っても実は大したことなかったりする.逆に言うと,GPが底上げされている大学に進学して,一般的な定義の大学院に出願すると,うまくばれなければワンランク上と判断される,かもしれない.

2019年12月18日水曜日

VMware クライアントのカーソルずれをなおす

Windows 10 がホストの VMware でクライアント(Cent OS)のカーソルが 100 ピクセルぐらい右にずれるようになった.VMware は 15.0.4 です.
VMware のショートカットの[互換性]タブの[高DPI設定では画面のスケーリングを無効にする]にチェックを入れたら解決した.
高 DPI ではなく普通の DPI (96dpi) なのになぜおかしくなったのかは謎.

2019年11月29日金曜日

IC Compiler で preferrd direction 以外の配線を禁止する

IC Compiler は一般に設定された preferred direction に沿った配線トラックに従って配線を行うが,配線接続性を向上させるために許容される範囲で配線トラックからずれた配線(オフトラック配線)を行う事がある.
一方で,プロセスによっては特にリソグラフィの都合もあり,オフトラック配線や,特定の配線幅以外全くを許容しない場合がある(SADPの場合など).

IC Compiler にて preferred direction 以外の配線を禁止するためには,Astro (IC Compiler)のテクノロジファイルに nonPreferredRouteMode を有効する.
また,オフトラック配線,つまり配線の一部を太らせる事を禁止するためには, hasRectangleOnly を有効にする.

Layer "M1" {
...
   hasRectangleOnly=1
   nonPreferredRouteMode=1
}

これはレイヤーごとに設定できる.

2019年11月28日木曜日

IC Compiler で Preferred Direction を設定する

IC Compiler で配線の preferred Direction を設定するためには,set_preferred_routing_direction コマンドを使う

icc_shell>  set_preferred_routing_direction -layers {M3 M5 M7} -direction vertical

現在の preferred direction を調べるには report_preferred_direction を使う

icc_shell> report_preferred_direction

Milkyway で axgDefineWireTracks コマンドを使うことで preferred direction を設定するが,どうも Unit Cell 上の配線トラックの定義をしているらしく配置配線には反映されなかった.マクロレベルの配線トラックの定義は IC Compiler で行う必要があるらしい.

2019年11月24日日曜日

SKILL関数 でレイアウトの中心座標を動かす (leMoveCellViewOrigin)

SKILL関数でレイアウトを動かしたい,leMoveCellViewOriginコマンドを使うと,
レイアウトの中心座標を変えることができる.

leMoveCellViewOrigin(
d_cellViewId
l_point
)
=> t | nil

d_cellViewId は Cell View ID,l_point は次に中心座標としたい今の座標である.
例えば右に10 um,上に5 um動かす場合は以下のようにする.

leMoveCellViewOrigin( cellViewId -10:-5)

2019年11月20日水曜日

SKILL関数でセルを開け(dbOpenCellViewByType),所望の位置にインスタンスを貼る(dbCreateInstByMasterName)

特定のセルにインスタンスを貼る SKILL 関数を紹介する.そのためには(1)セルを開く,(2)インスタンスを貼る,の2つの関数が必要.

(1) セルを開く
dbOpenCellViewByType 関数を使う.

dbOpenCellViewByType(
{ gt_lib | nil }
t_cellName
lt_viewName
[ t_viewTypeName
[ t_mode
[ d_contextCellView ] ] ]
)
=> d_cellView / nil

gt_lib はライブラリ名,t_cellName はセル名,lt_viewName はView名, t_viewTypeName は ViewType,t_mode はセルを開くモードである.d_contextCellView はバージョンによっては必要らしいが不要っぽい.
モードはいくつかある.
r : 読み込み(read)
a : 追記(append)
w : 書き込み(write),すでにファイルがある場合は Virtual Memory に捨てられる.
他にもモードがあるが違いがよくわからない.

dbOpenCellViewByType 関数を実行すると,Cell View IDが帰ってくる.このCell View IDを使って後続の処理を行う.

(2)インスタンスを貼る
dbCreateInstByMasterName 関数を使う.

dbCreateInstByMasterName(
d_cellView
t_libName
t_cellName
t_viewName
t_instName
l_origin
t_orient
[ x_numInst ]
)

d_cellView は貼り付け先のCell View ID,t_libName は貼り付け元のライブラリ,t_cellName は貼り付け元のセル名,t_viewName は貼り付け元のView,t_instName はインスタンス名(不要ならnilに),l_origin は貼り付ける座標,t_orient は回転角度, x_numInst は貼り付け個数である.

例えば,設計後のレイアウトにスクライブラインを貼る SKILL は以下のようになる.

cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout" "maskLayout" "a")
dbCreateInstByMasterName(cellview "SCRIBE2_5000x5000" "SCRIBE2_5000_5000" "layout" nil list(0 0) "R0" 1) 
cellview = dbOpenCellViewByType("CHIP_TOP" "CHIP_TOP" "layout")
dbSave(cellview)
dbClose(cellview)

よくわからないけれど,貼り付け後もう一度 dbOpenCellViewByType しないとうまくいかなかった.最後は dbSave でセーブ, dbClose でクローズ.

SKILL プログラムというよりは,API を叩いている感じである.マニュアルは Cadence Design Framework II SKILL Functions Reference です.