■Antenna error 対策
●Antenna error とは
教科書読まんとわからんよ????
メタルの積層構造は、基本的に下層から作ってきます。
このとき、一定以上のメタルがゲートにつながるとマズーなのです。
どうも製造行程でメタルに電荷が溜まったりするらしく、一定以上の電荷が
蓄積し、それがゲートに一気に流れるとゲートが破壊される場合があるため
だそうです。



紫のメタルまでを作ったときまでは大丈夫だが、水色のメタルを作った段階で
許容以上のメタルがゲートにつながり Antenna error になった例。
では、以下の例ではどうだろうか?

黄色のメタルが長く、ここに溜まった電荷がゲートへ流れると Antenna error
になるとする。
下層からメタルを作っていくと、



紫のメタルを作った段階で、黄色のメタルのはゲートではなく出力側につながる。
そのため、ゲートの Antenna error チェックにはこの黄色のメタルは使われず、
この例は Antenna error ではない。
配線長が長くなるほど Antenna error は発生しやすいと言えるが、どのような
配線層を使っているかが大きく関係する。
●解決策 1: 配線層の変更
昔行っていた手法。
- 手動で配線をカスタマイズ
- ルートガイド(axgAddRouteGuide)を駆使して頑張る
どちらかの手法で上の OK な例になるように配線を変更する作戦である。
なるべくゲートの近くで高い配線層を経由するように配線すれば良い訳である。
しかし時間がかかりすぎたり(特にルートガイドを利用した場合)、
出力側の近くでも高い配線層を使ってたりするとカスタマイズが困難になるので
お勧めしない。
●解決策 2: ダイオードの挿入
ダイオードを以下のように挿入する。

すると、緑以上のメタルからくる電荷はダイオードの方を流れることになるため、
ゲートが破壊されるかどうかに関係するメタルは点線部分だけになり、Antenna error
ではなくなる。
●マクロ内での Antenna error への対処
Astro であれば axgInsertDiode というコマンドで自動的に Antenna error が
消えるようにダイオードを挿入してくれる。
そもそも、ある程度は Antenna error がでないように、 Astro は最適化の段階で
配線層を変えたりしている。
(ここで Anttena 関係の設定をした場合)
●マクロをまたぐ Antenna error への対処
マクロ内だけでみれば Antenna error ではないけども、入力につながる
マクロ外の配線によって Antenna error が起きるケース。
Astro では自動で上手く直す手段はないのではないかと思う。
以下、いくつか試した対処法を書く。
- 手作業で 1 つ 1 つ diode を入れる
- ネットリストの段階で diode を入れる
- マクロの入力ポートに細工する
手作業で 1 つ 1 つ diode を入れる
マクロを跨いだ Antenna error は Astro 上では検知できない。
calibre で検証を行うと発見される error に対し、以下の要領で diode
を挿入する
(なお、他にも色々挿入する手法は考えられる)。
-
error を起こしているゲートを突き止める
INS_0 への入力ネット INPUT_A で error だとする
- ネットリストを出力する(auVerilogOut とか astDumpHierVerilog)
-
diode をネットリストに足す
DIODE_INS_0(.A(INPUT_A));
-
ECO
現在のマクロと、diode を加えたネットリストを比較する(auECOByNetCmp)
加えられた diode が、マクロの右下辺りに出現する
-
diode を適切な位置に挿入する
必要なら、filler を消す
-
挿入した diode、けした filler などはメモって置く
diode の入力ポートは、ネットリストを出力したときに上手く認識されない
場合があるので、その場合は手で修正するためにメモしておく
diode を適切な位置に挿入するとしたが、上図のような位置関係に diode を
入れれば良い。
下図のように diode を配置しても意味はないので注意
(むしろまずくなってる)。

ネットリストの段階で diode を入れる
手作業で 1 つ 1 つ diode を入れる、は Antenna error の数が少ない場合に適している。
しかし、例えば SMA のように入力ポート数が非常に多く、かつ入力配線も非常に長くて
Antenna error が多発するような場合には全部を手修正するのは時間がかかりすぎる。
そこで、最初に読み込ませるネットリストの段階で、マクロの入力信号に diode を入れる。
(ただし、余分な diode は入ることになる)
module HOGE(INPUTS, OUTPUTS);
input [1023:0] INPUTS;
output [7:0] OUTPUTS;
wire ……
SC23DS01 (.A(INPUTS[0])) ;
SC23DS01 (.A(INPUTS[1])) ;
......
endmodule
問題点
このネットリストをそのまま auto place すると、上にあるだめな diode の挿入例
な事態が多発する。
そこで、blockage/route guide を駆使する、diode を挿入する位置を指定するなど
マクロ毎に diode 挿入をカスタマイズする必要がある。

入力ポート近くに、横一列に diode を配置、また diode を含む入力近くには
blockage も作り、スタセルは侵入しないようにした例。
すると、入力ポート -> diode -> スタセルという順番になるので、Antenna error
は出にくくなる。
dbSetCellInstPlacement で diode を配置し、aprCmdFixCell で diode で FIX
属性をつける(auto place 時に diode を最移動させないために FIX)。
池淵分に関しては、
- /home/hlab/ikebuchi/wasmii3/sma/astro/scripts/floorplan
- /home/hlab/ikebuchi/wasmii3/sma/astro/scripts/
に色々置いてある。
この手法を上手くカスタマイズすれば、ほぼ Antenna error は消えるが、
error が残ることはあるので、その場合は手で diode を挿入する。
マクロの入力ポートに細工する
そもそもスタセルで Antenne error が起きるかは、
- ./scripts/antenna_rule.sc
- /home/vdec/lib/fujitsu65/milky/data/CS202SZ/clf/defineAntennaArea.clf
を基に計算される。
後者は、Milkyway ライブラリに設定するものだが、中身を少し覗くと
defineGateSize "SC23ECINVXC1" "A" 0.057
defineAntennaArea "SC23ECINVXC1" "A" '(
("MET1" #f 0.055)
("CUT12" #f 0.0300)
)
defineDiodeProtection "SC23ECINVXC1" "YB" '(0.2109 )
defineAntennaArea "SC23ECINVXC1" "YB" '(
("MET1" #f 0.246)
("CUT12" #f 0.0900)
)
のように、各スタセルのゲートの大きさなどが定義されている。
ゲートの大きさの X 倍以上のメタルが配線されると、Antenna error のように計算される。
そこで、スタセルだけでなくマクロの入力ポートに対しても、上記 clf ファイルを用意し、
適切にゲートサイズなどを設定する(実際にはマクロの入力にゲートなんかない)。
すると、マクロの入力ポートに対してもスタセルと同様に Antenna error を計算できるように
なる。
実際に試して error 自体は減ったが、適切なゲートサイズをどうするべきかが難しいため
(そもそも単位をどれくらいにするべきか、内部のレイアウト構造によって変えるべきでもあるし)、
上で述べた 2 つを使用することを勧める。