前回はGFormatの概要を説明しました。今回からは具体的な例を示しながらGFormatの詳細について説明していきます。
クロストークは信号が変化する際に隣接する配線にその一部が漏れる現象で、 信号品質を劣化させる原因の一つです。 多くの場合、クロストークの原因となる配線と(aggressor)との被害を受ける側の線路(victim) が並走している場合に生じます。 クロストークは以下の5つが影響するいわれています。以下、電磁界解析ツールを使って上記の因子がクロストークにどの様な 影響を与えるかを検証する例を示しながら、G-Formatの文法を解説していきます。
- Agressor側の信号の立ち上がり時間
- Agressorの配線とVictimの配線が並走する線長
- Agressorの配線とVictimの配線の間隔
- AgressorやVictimの配線と、それに対向するグランドプレーンと距離
クロストーク検証用の基板構成
まずG-Formatを使ってクロストーク検証に使用する基板のレイアウトを作ります。し。下図は検証に使用するための配線パターンです。 同じ間隔で長さの異なる3組の並走配線を使用します。 層構成は2層とし、並走配線は表層に配置し、裏面はべたグランドとします。 並走配線の両端に電磁界解析時のポートとするための端子を配置してます。電磁界解析ツールを使用してこの基板のモデルを抽出し、SPICE解析で クロストークと並走距離の関係を見ます。
下図はSPICE解析に使用する回路です。並行配線のagressor側から入力した パルスがvictimに与える影響を観測します。agressorとvictimの部分が、この基板から抽出したモデルとなります。それではG-Formatを使って モデル抽出用の基板を作っていきましょう。
G-Formatの構成
G-Formatは複数のセクションから構成されています。 下にG-Formatの構成を示します。 各セクションは、ここに定義された順番に記載してください。それぞれのセクションは頭にピリオド(.)を付けたキーワードから始まります。 .version, .unit, .scale は一行で記述するのセクションです。 それ以外のセクション ( .material, .shape, など ) は、キーワードから .end までが一つのセクションとなります。 .end の後のキーワードは省略可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
.version x y z .unit [inch | mm] .scale value .material .......... .end [material] .layer .......... .end [layer] .shape .......... .end [shape] .board_geom .......... .end [board_geom] .padstack .......... .end [padstack] .part .......... .end [part] .component .......... .end [component] .netattr .......... .end [netattr] .netlist .......... .end [netlist] .via .......... .end [via] .bondwire .......... .end [bondwire] .route .......... .end [route] |
ヘッダー要素
G-Formatの最初に .version 、 .unit 、 .scale の3つのセクションを定義します。
.version
必須項目です。G-Formatのバージョンを指定します。現在のバージョンは 1.1 なので、以下のように記述します。
.version 1 1
注意 : 最新のLPB-Format(IEEE 2401-2019)でのG-Formatのバージョン定義は .version 1 1 2020 となります。しかし、残念ながら現時点で最新のG-Formatの定義をサポートしているEDAツールは少数です。 互換性のため、ここでは前バージョン(IEEE 2401-2015)の定義方法 .version 1 1 を採用します。
.unit
必須項目です。G-Formatファイル内で使用されている長さに関係する数値の単位を 定義します。 mm もしくは inch を記載します。 一般的にはmm(ミリメートル)を使用します。
.unit mm
.scale
必須項目です。G-Formatファイル内で使用されている長さに関係する数値のスケールを定義します。 例えば .unit に mm 、 .scale に1000を定義した場合、1は 1/1000ミリメートル = 1ミクロンメートル を意味します。
今回はヘッダー要素を以下のように定義します。1 は 1ミリメートルとなります。
1 2 3 4 |
# Header Section .version 1 1 .unit mm .scale 1 |
.material セクション
.material セクションで、素材の物性値を定義します。 図 6.1 (b) に使用されている3種類の素材を定義します。 それぞれの物性値は以下とします。
素材名 | 導電率 | 誘電率 | 透磁率 | 誘電正接 | |
---|---|---|---|---|---|
導電体 | COPPER | 58000 | |||
誘電体 | FR4 | 0 | 4.2 | 1 | 0.02 |
誘電体 | Air | 0 | 1 | 1 | 0 |
G-Formatの記載は以下のようになります。
1 2 3 4 5 6 |
# Material Section .material C "COPPER" 58000 D "AIR" 1 1 0 D "FR4" 4.2 1 0.02 .end material |
C で始まる行で導電体、 D で始まる行で誘電体を定義します。
誘電体
誘電体は以下の形式で定義します。
C materialName conductivity
- materialName : 誘電体名。ダブルクォート(")で名前を囲みます
- conductivity : 導電率。単位は 1/Ω mm です。
導電体
導電体は以下の形式で定義します。
D materialName permittivity permeability lossTangent
- materialName : 導電体名。ダブルクォート(")で名前を囲みます。
- permeability : 誘電率
- permeability : 透磁率
- lossTangent : 誘電正接
G-Formatには誘電体名や導電体名のように名称をダブルクォートで囲むものと、 囲まないもの(後術するコンポーネント名)があります。 ダブルクォートで囲った場合は、それを参照する際もダブルクォートで囲ってください。 囲まないものは、それを参照する際もダブルクォートでは囲みません。
なんで??と思われるかもしれませんが、それは「G-Format裏話」で書きましたが、 「そうなっていたから」としか答えられません。 EDAツールによっては全ての名称をダブルクォートで囲まなくても問題ない ものもありますが、安全を見こす場合はルールに従ってください。
.layer セクション
.layer セクションで基板の層構造を定義します。 図 6.1 (b)の層構造では、 表層の層名をL1、裏層の層名をL2、絶縁層の名称はD1とします。 また銅箔の厚みを0.05mm、絶縁層の厚みを0.12mmとします。 この層構造の定義は以下の記述になります。
1 2 3 4 5 6 |
# Layer Section .layer "L1" 0.05 S "Copper" "AIR" "D1" 0.12 D "Copper" "FR4" "L2" 0.05 P "Copper" "FR4" .end layer |
層を定義する順番は、実際の層構造と同じ順番で定義してください。 図 6.1 (b) の例ではL1、D1、L2の順番で定義します。
層は以下の書式で定義します。
layerName thickness layerType conductingMaterialName dielectricMaterialName
layerName
層名です。ユニークな名称を与えてください。 層名はダブルクォート(")で囲みます。
thickness
層の厚みです。単位は .unit セクションと .scale セクションに依存します。 本稿の例での単位は mm となります。
layerType
層のタイプを定義します。 D, S, P の何れかを記載します。それぞれの意味は以下となります
- D : 絶縁層
- S : 信号配線層(導体層)
- P : 電源もしくはグランド層(導体層)
conductingMaterialName
導電体名。ダブルクォート(")で名前を囲みます。
dielectricMaterialName
誘電体名。ダブルクォート(")で名前を囲みます。
層番号
G-Formatでは導体層にユニークな層番号を割り振り、GFormat内で導体層を参照する際に使用されます。 (絶縁層には層番号は与えられません)。 layer セクションでの定義準に1番から順番に番号を割り振ります。 上にあげたLayerセクションの例ではL1の層番号は1, L2の層番号は2となります。
.shape セクション
.shape セクションではG-Format内で使用する図形を定義します。 ここで定義した形状はVIAや端子の定義に使用されます。 G-Formatでは9種類の形状が定義できますが、ここでは基本的な 円、矩形(長方形)、ポリゴンに絞って説明します。
本稿の基板の例では並走配線の両端に直径0.16mmの端子を配置していますが、 直径0.16mmの円は以下のように定義します。
1 2 3 4 |
Shape Section .shape 1 circle 0.16 .end shape |
図形は以下の形式で定義します。
shapeID keyword parameters
- shapeID
- 図形を参照するための識別番号です。1以上のユニークな番号を定義して下さい。
- keyword
- 図形の種類を示すキーワードです。 種類によってキーワードは異なります。円の場合のキーワードは circle です。
- parameters
- 図形の種類によって記述方法が異なります。 以下、円、矩形、ポリゴンの定義方法を示します。 なお長さの単位は .unit と .scale セクションの定義に依存しますが、 本稿の例では mm となります。
円
shapeID circle diameter
-
- diameter : 円の直径
矩形
shapeID rectangle width height
- width : 矩形の幅
- height : 矩形の高さ
ポリゴン
shapeID polygon {x1 y1 x2 y2 x3 y3 x4 y4 ...}
- x1 y1 x2 y2 ... : 多角形の頂点座標を反時計回りに記述します。
.board_geom セクション
.board_geom セクションでは、基板外形を定義します。 図 6.1 の基板は200mm × 200mmの正方形です。 ここでは以下のようなポリゴン図形で定義します。 ポリゴンの頂点座標は反時計回りに記述します。
1 2 3 4 5 6 7 8 9 |
# BoardGeom Section .board_geom polygon { -100 -100 100 -100 100 100 -100 100 } .end board_geom |
上記の例では基板中央が原点座標(0, 0)となります。 以後、この基板上に配置するパターンは全て基板中央が原点となります。
基板外形
.padstack セクション
.padstack セクションでは層構造を伴う形状(パッドスタック)を定義します。 具体的には端子やVIAの形状がpadstackに該当します。 本稿の例では並行配線の両端に配置する端子を padstack を使って定義します。配線の両端に配置した部品の形状を下図にしめします。
上図のような表層(L1)に配置する端子は以下のように定義します。
1 2 3 4 5 6 |
# Padstack Section .padstack 1 { 1 1 0 } .end padstack |
パッドスタックは以下の形式で定義します。
pad
pad
...........
}
padstackID
パッドスタックを参照するための識別番号です。必ず1以上のユニークな番号を定義して下さい。
pad
パッドスタックを構成するPADを以下の形式で定義します。
signalLayerNum *shapeID shapeROT
- signalLayerNum
- PADを配置するレイヤの層番号を記載します。 本稿の例ではL1層の層番号は1、L2層の層番号は2となっています。 L1層にPADを配置する場合は 1 と記載ます。
- shapeID
- PADの形状のshapeIDです。 .shape から .end shape の間に定義された形状の shapeID を記載します。
- shapeROT
- shapeの反時計回りの回転角度です。回転していない場合は 0 と記載します。
ここで改めて端子のパッドスタックの定義を見てみましょう。
1 1 0
}
この例での shapeID は 1 となります。 pad の定義は、 1 1 0 となっていますが、最初の 1 は、PADを配置するレイヤの層番号です。すなわち、このPADはL1層に置くことを意味します。
2番目の 1 は、このPADの形状を定義している図形の shapeID です。 図形は .shape セクションで定義されています。 例示した.shapeの定義では、 shapeID が 1 の図形は直径が0.16mmの円となります。
最後の 0 は、SHAPEの回転角度です。 0 なので、回転していないことを意味しています。
.shape や .padstack の識別番号(Id)は整数にするように仕様では定めています。 EDAツールによっては文字(string)でもOKなケースもありますが互換性は ありません。ご注意ください。
. part セクション
.part セクションは、G-Format内で使用する部品を定義します。 下図に本稿で使用する部品の形状を示します。
この部品の定義は以下のようになります。
1 2 3 4 5 6 7 |
# Part Section .part U1 R -0.09 -0.28 0.09 0.28 0.1 { P1 0 0.18 B 1 P2 0 -0.18 B 1 } .end part |
部品は以下の形式で定義します。 shape llx lly urx ury height で部品の外郭形状を、 ブレイス({})内で部品の端子を定義します。
partName
部品名。この部品を参照するための識別名です。必ずユニークな部品名を定義して下さい。
shape llx lly urx ury
上部から見た部品の外形を定義します。
shape
部品の形を定義します。以下の3つの値を取ります。
-
-
- R : 矩形 (Rectangle)
- C : 円形 (Circle)
- D : ひし形 (Diamond)
-
llx lly
部品外郭の左下点の座標です。
urx ury
部品外郭の右上点の座標です。
height
部品の高さを定義します。
本稿で例示した部品は、
U1 R -0.09 -0.28 0.09 0.28 0.1
と定義してます。 U1 は部品名、 R -0.09 -0.28 0.09 0.28 は0.18mm×0.56mm の矩形を表します。 (-0.09, -0.28)は矩形中央を原点としたときの左下点の座標、 (0.09, 0.28)は右上点の座標です。 最後の0.1は部品の高さ(0.1mm)を表します。
ブレイス({})内で部品の端子を定義します。 端子は以下の形式で定義します。
pinName x y ioType padstackID
pinName
端子名です。この端子を参照するための識別名です。 同一部品内でユニークな端子名を設定してください。 部品が異なれば、同一の端子名を使用することができます。
x y
端子座標。部品原点(0,0)からの相対座標となります。
ioType
端子のタイプです。以下のいずれかを設定します。
- D : 出力端子 (Driver pin)
- R : 入力端子 (Receiver pin)
- B : 双方向端子 (Bidirectional pin)
padstackID
この端子の形状を定義した .padstack のpadstackIDです。
ここで、本稿で例示している部品の端子定義を見てみましょう。
先ず端子P1から見ていきます。 0 0.18 は端子のxy座標です。x座標は0mm, y座標は0.18mmとなります。 B は端子タイプです。 B は双方向端子を意味します。 最後の 1 は、この端子の形状を定義しているパッドスタック の padstackID です。
端子P2も同様に、 padstackID が 1 の双方向端子を、座標(0mm, -0.18mm) に配置しています。
端子形状の padstackID が 0 になっているケースがあります。 これは「この端子は座標は決まっているが、形は定義されていません」 という意味になります。 端子に形(大きさ)無い場合の挙動はEDAツールによって異なります。 すべてのケースで当てはまるとは限りませんが、筆者の経験では以下のような 感じです。
レイアウト系のEDAの場合は、端子に形がないとエラーになるケースが多いです。 解析系のツールではエラーになる場合と、ならない場合があります。 解析系のツールでは端子は「解析時のポート」に利用されるケースが多いです。 解析ポートが点(大きさの無いポート)でもOKなEDAの場合はエラーになりません。 ポートに物理的な大きさを必要とするツールではエラーとなります。
端子の形は「 .padstack のpadstackID」を参照すると説明しました。 正式な仕様でもそのようになっています。 しかしこれを、「 .shape のshapeID」と解釈しているEDAツールがあります (詳細は、別の機会に説明します)。 ちょっとこれは厄介な問題です。 筆者は、shapeIDと解釈するツールとpadstackIDと解釈するツール の双方を使う必要があり padstackIDとshapeIDが同じになる様にG-Formatを作って、この問題を 回避しています。
.component セクション
.component セクションでは .part で定義した部品の配置座標を定義します。 下図に部品配置図を示します。 この基板には並走する3組の配線の両端にXA1からXC2の6個の部品を配置しています。
これらの部品の配置は以下のように記述します。 以後、基板上に配置された部品をコンポーネントと呼ぶことにします。
1 2 3 4 5 6 7 8 9 |
# Component Section .component XA1 U1 25.08 50 1 0 XA2 U1 74.92 50 1 0 XB1 U1 -24.92 0 1 0 XB2 U1 74.92 0 1 0 XC1 U1 -74.92 -50 1 0 XC2 U1 74.92 -50 1 0 .end component |
コンポーネントは以下の形式で定義します。
compName partName x y signalLayerNumber rotation
compName
部品のインスタンス名です。コンポーネント名とも呼びます。 GFormat内でユニークな個ぽーねんと名を定義してください。
partName
配置するコンポーネントが参照する部品の部品名です。.part セクションで定義した部品を参照します。
x y
コンポーネントの配置座標です。基板原点からの相対座標となります。部品の原点を指定した座標に配置します。
rotation
部品原点を中心とした反時計回りの回転角度です。
signalLayerNumber
コンポーネントを配置する層の層番号です。 図 6.1 の基板例ではL1層の層番号は 1 、 L2層の層番号は 2 となります。
表層(L1)にコンポーネントを配置する場合は 1 と記載します。 裏層(L2)にコンポーネントを配置する場合は -2 と記載します(誤記では有りません。 マイナス2 と記載します)。 層番号の記述方法にはクセがありますので注意してください。層に対し上面に配置するには正数で、 層に対し下面に配置する場合は負数で層番号を記述します。
部品内蔵基盤の場合の層番号は下図のようになります。
それでは改めてコンポーネント XA1 の定義を見てみます。
XA1 U1 25.08 50 1 0
U1 は配置するコンポーネントが参照する部品の部品名です。 .part セクション(リスト 6.12)で定義されています。 続く 25.08 50 は配置座標です。 1 はXA1を配置する層の層番号です。 1 はL1層を意味しています。
G-Formatの層番号は、層番号が負値だとコンポネントの天地を逆転して層の裏側に部品を張り付けるという仕様でした。実際に基板の裏面に部品を置く場合は天地を逆転して張り付けるので、割と直感的な仕様だと思うのですが、EDAによってはこの仕様通りの動作しないケースがあります。「天地を逆転」という動作をしてくれないケースがあるので、この場合は裏面配置用の部品を別に定義して配置します。(詳細は、別の機会に説明します)。
今回はここまでとします。以上で基板上に部品が配置できるようになりました。次回は配線を定義します。