matlab-analyze-pcb-pdn について
matlab-analyze-pcb-pdn は、PCB の電源レールを直流解析する MATLAB スキルです。電源ネットの検出、トポロジー設定、ルール確認、単一または複数ネットの解析に対応します。
主な機能
- 01PCB 電源ネットの検出と抽出
- 02ソース・負荷・センスの設定
- 03電圧・電流分布の計算
- 04電圧・電流密度ルールの確認
- 05複数電源レールの一括解析
活用シーン
- 01電源レールの IR ドロップ確認
- 02電圧制限を外れる領域の特定
- 03ビア電流と電流密度の確認
- 04基板上の複数電源ネットの一括評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-analyze-pcb-pdnインストール後、Claude Code で/matlab-analyze-pcb-pdnを入力して読み込まれたか確認します。
同梱ファイルmanifest.yamlreferences/batch-analysis.md
詳細
電源分配ネットワーク(PDN)の解析
使用する場合
- PCB 電源レールの DC 電圧と電流の分布を解析する
- 設計ルール(最大電流密度、電圧マージン、ビアの電流制限)を確認する
- インポートした PCB レイアウト上の電源ネットを検出して一覧表示する
- PDN 解析用にソース/負荷/センスのトポロジーを割り当てる
- ボード上の複数の電源レールに対して一括解析を実行する
- 一般的な PCB ネット命名規則から公称電圧を推定する
使用しない場合
- PCB レイアウト(Gerber、ODB++、Allegro)をインポートする場合 —
matlab-read-pcb-layoutを使用してください - S パラメーター、フィールド、または EM 性能を解析する場合 —
matlab-analyze-emを使用してください - 信号配線間のクロストークを解析する場合 —
matlab-design-pcb-transmission-lineを使用してください - 誘電体または導体の材料を定義する場合 —
matlab-manage-pcb-materialを使用してください - ビア構造をモデル化する場合 —
matlab-model-viaを使用してください
一般的なワークフロー
- 事前:
matlab-read-pcb-layout— Gerber/ODB++/Allegro から PCB レイアウトをインポートします - このスキル: DC 解析を実行し、IR ドロップを確認し、設計ルールを評価して、ネットを一括解析します
- 事後: CAD で物理設計を反復するために再インポートするか、結果を参考に
matlab-manage-pcb-materialを使ってスタックアップを変更します
クイックリファレンス
| タスク | コード |
|---|---|
| PCB レイアウトをインポート | pcb = pcbFileRead('board_native') |
| すべてのネットを一覧表示 | netList = cadnetList(pcb) |
| 電源ネットを検出 | cadnetList(pcb) を regexpi でフィルタリングします(下記を参照) |
| 特定の電源レールを検出 | idx = ~cellfun(@isempty, regexpi(netList.CadnetName, "P0V8")) |
| 電源レールの電圧を推定 | 正規表現ヘルパー parseNetVoltage でネット名を解析します(下記を参照) |
| cadnet を作成 | cnet = cadnet(pcb, 'P0V8') |
| cadnet レイアウトを表示 | show(cnet) |
| ネット上のコンポーネントを検出 | comps = findComponents(cnet) |
| タイプでフィルタリング | inductors = findComponents(cnet, "ComponentType", "Inductor") |
| PDN モデルを作成 | PDN = powerDistributionNetwork(cnet) |
| トポロジーを割り当て | setNetworkParameters(PDN, Source=src, Load=load, Sense=sense) |
| トポロジーを自動割り当て | setNetworkParameters(PDN, AutoAssignDefault='True') |
| DC パラメーターを設定 | setDCParameters(PDN, "NominalVoltage", 0.8, "LoadCurrent", 1) % placeholder — ask user |
| DC ルールを設定 | setDCRules(PDN, "MaxCurrentDensity", 0.5, "MinVoltage", 0.784) |
| 電圧分布 | voltage(PDN) |
| 違反箇所を表示した電圧 | voltage(PDN, ShowViolation=true) |
| 電流分布 | current(PDN) |
| 矢印付きの電流 | current(PDN, Direction='on') |
PCB のインポートとネットの検出
PCB レイアウトのインポート
pcbFileRead は PCB ファイルをインポートし、階層的に検査するためのオブジェクトを返します。対応形式は、ネイティブディレクトリ(CSV ファイル)、ODB++(圧縮または非圧縮)、および Cadence Allegro .brd(初回のみ extractaSetup() が必要)です。
% Native format (directory containing CSV files)
pcb = pcbFileRead(fullfile(boardDir, 'pcie5_native'));
% ODB++ format
pcb = pcbFileRead(fullfile(boardDir, 'myboard.zip'));
% Allegro .brd (run extractaSetup() once first)
extractaSetup(); % one-time setup for Allegro support
pcb = pcbFileRead(fullfile(boardDir, 'myboard.brd'));
返されるオブジェクトからは、NumLayers、NumCadnets、NumPadStacks、NumComponents、NumParts、LayerHeight を参照できます。
すべてのネットの一覧表示
NetList = cadnetList(pcb);
disp(NetList);
CadnetIdx、CadnetName、NumPins、Length の各列を含むテーブルを返します。実際のボードには 3000 以上のネットが含まれる場合があります。
電源ネットの検出
組み込みの findPowerNets 関数はありません。cadnetList の出力を正規表現でフィルタリングし、名前から電源ネットとグラウンドネットを特定します。
netList = cadnetList(pcb);
% Define naming patterns (case-insensitive)
powerPatterns = ["^P\d+V", "^VDD", "^VCC", "^AVDD", "^DVDD", "^VDDO"];
groundPatterns = ["^GND", "^AGND", "^DGND", "^PGND", "^VSS", "^AVSS", "^DVSS"];
% Match power nets
isPower = false(height(netList), 1);
for p = powerPatterns
isPower = isPower | ~cellfun(@isempty, regexpi(netList.CadnetName, p));
end
powerNets = sortrows(netList(isPower, :), 'NumPins', 'descend');
% Match ground nets
isGround = false(height(netList), 1);
for g = groundPatterns
isGround = isGround | ~cellfun(@isempty, regexpi(netList.CadnetName, g));
end
groundNets = sortrows(netList(isGround, :), 'NumPins', 'descend');
% Filter by minimum pin count
minPins = 5;
powerNets = powerNets(powerNets.NumPins >= minPins, :);
% Search for a specific pattern (e.g., 0.8V rails)
idx = ~cellfun(@isempty, regexpi(powerNets.CadnetName, "P0V8"));
rails_0v8 = powerNets(idx, :);
一般的な電源ネットの命名規則(大文字と小文字を区別しません):
- 電源レール:
P<digit>V<digit>(P0V8、P3V3_AUX、P12V)、VDD*、VCC*、AVDD*、DVDD*、VDDO* - グラウンドネット:
GND*、AGND*、DGND*、PGND*、VSS*、AVSS*、DVSS*
ネット名から電源レールの電圧を推定
組み込みの inferRailVoltage 関数はありません。正規表現を使ってネット名から電圧を解析します。
function nomV = parseNetVoltage(netName)
netName = string(netName);
% Pattern: P<int>V<frac> (e.g., P0V8 → 0.8, P3V3 → 3.3, P12V → 12.0)
tok = regexp(netName, '(?i)P(\d+)V(\d*)', 'tokens');
if ~isempty(tok)
intPart = str2double(tok{1}{1});
fracStr = tok{1}{2};
if isempty(fracStr)
nomV = intPart;
else
nomV = intPart + str2double(fracStr) / 10^numel(fracStr);
end
return;
end
% Pattern: explicit decimal (e.g., 3.3V, 1.8V)
tok = regexp(netName, '(\d+\.\d+)\s*V', 'tokens');
if ~isempty(tok)
nomV = str2double(tok{1}{1});
return;
end
% Pattern: millivolt (e.g., 800MV → 0.8)
tok = regexp(netName, '(\d+)\s*MV', 'tokens', 'ignorecase');
if ~isempty(tok)
nomV = str2double(tok{1}{1}) / 1000;
return;
end
nomV = NaN;
end
ループ内での使用例:
for k = 1:height(powerNets)
netName = powerNets.CadnetName{k};
nomV = parseNetVoltage(netName);
fprintf('%s → %.2f V\n', netName, nomV);
end
cadnet オブジェクト
Cadnet の作成
cnet = cadnet(pcb, 'P0V8');
プロパティ:
| プロパティ | 説明 |
|---|---|
NumPins | ネット上のピン数 |
NumSurfaces | 銅箔面の数 |
NumVias | ビアの数 |
NumTraces | 配線の数 |
TotalLength | 配線の合計長 |
EntityList | すべてのエンティティのリスト |
Voltage | 公称電圧 |
LayerRange | ネットがまたがるレイヤー |
Cadnet の可視化
show(cnet);
接続されたコンポーネントの検索
findComponents は、Refdes、PinList、ComponentType、Part の列を持つテーブルを返します。
% All components on the net
allComps = findComponents(cnet);
% Filter by component type
inductors = findComponents(cnet, "ComponentType", "Inductor");
ics = findComponents(cnet, "ComponentType", "IC");
resistors = findComponents(cnet, "ComponentType", "Resistor");
caps = findComponents(cnet, "ComponentType", "Capacitor");
Refdes の値は文字列です。setNetworkParameters で Source/Load/Sense を割り当てる際に、そのまま使用してください。
Cadnet の詳細データの取得
data = cadnetData(cnet);
s = shapes(cnet);
powerDistributionNetwork オブジェクト
PDN モデルの作成
PDN = powerDistributionNetwork(cnet);
プロパティ:
| プロパティ | 説明 |
|---|---|
NetType | ネットの種類 |
Source | 電源コンポーネント |
Load | 負荷コンポーネント |
Sense | センスコンポーネント |
PlatingThickness | ビアバレルのめっき厚(インチ) |
NominalVoltage | 公称電圧(V) |
LoadCurrent | 負荷電流(A) |
MaxCurrentDensity | 最大電流密度(mA/mil²) |
MinVoltage | 許容最小電圧(V) |
MaxVoltage | 許容最大電圧(V) |
MaxViaCurrent | 最大ビア電流(mA) |
PDN の設定
setNetworkParameters -- Source、Load、Sense、Plating の割り当て
findComponents の出力を使用してトポロジーを割り当てます。
% Manual assignment using RefDes from findComponents
setNetworkParameters(PDN, ...
Source=sourceRefDes, ...
Load=sinkRefDes, ...
Sense=senseRefDes, ...
PlatingThickness=0.002);
% Auto-assign defaults (fallback when topology is unclear)
setNetworkParameters(PDN, AutoAssignDefault='True');
- Source — 電源の RefDes(通常はインダクター)です。多相レールでは、すべてのインダクターを使用します。
- Load — 負荷の RefDes(通常は IC)です。ネット上のすべての IC を使用します。
- Sense — センスコンポーネントの RefDes(通常は抵抗またはテストポイント)です。
- PlatingThickness — ビアバレルのめっき厚(インチ)です(例:
0.002= 2 mil ≈ 1.4 oz の銅)。
Sense コンポーネントの解決
Sense パラメーターは必須です。ネット上にテストポイントがない場合は、抵抗をセンスコンポーネントとして使用します。
tp = findComponents(cnet, 'ComponentType', 'Test Point');
if ~isempty(tp)
senseRef = tp.Refdes;
else
res = findComponents(cnet, 'ComponentType', 'Resistor');
senseRef = res.Refdes(1); % use first resistor as sense fallback
end
setNetworkParameters(PDN, Source=src, Load=load, Sense=senseRef, ...
PlatingThickness=0.002);
多相レール
多相 VRM 設計では、複数のインダクターが同じレールに給電します。最初のインダクターだけでなく、必ずすべてのインダクターを Source として使用してください。
inductors = findComponents(cnet, "ComponentType", "Inductor");
setNetworkParameters(PDN, Source=inductors.Refdes); % handles multiphase
setDCParameters -- 電気パラメーターの設定
setDCParameters(PDN, "NominalVoltage", 0.8, "LoadCurrent", 1); % placeholder — ask user for actual value
setDCRules -- DC 設計ルールの設定
setDCRules(PDN, ...
"MaxCurrentDensity", 0.5, ...
"MaxVoltage", 0.816, ...
"MinVoltage", 0.784, ...
"MaxViaCurrent", 500);
DC ルールの単位(混在 — この API 固有):
| プロパティ | 単位 | 説明 |
|---|---|---|
PlatingThickness | inches | ビアバレルのめっき厚(0.002 = 2 mil) |
NominalVoltage | V | レールの公称電圧 |
LoadCurrent | A | シンクあたりの想定負荷電流 |
MaxCurrentDensity | mA/mil² | 電流密度の熱的上限 |
MinVoltage | V | 許容される絶対最小電圧 |
MaxVoltage | V | 許容される絶対最大電圧 |
MaxViaCurrent | mA | 1 本のビアに流せる最大電流 |
電圧許容差のガイドライン:
| レール電圧 | 許容差 | MinVoltage | MaxVoltage |
|---|---|---|---|
| < 1 V | 1–2% | P0V8: 0.8 × 0.98 = 0.784 V | 0.8 × 1.02 = 0.816 V |
| 1–3.3 V | 2–3% | P1V8: 1.8 × 0.975 = 1.755 V | 1.8 × 1.025 = 1.845 V |
| 3.3–5 V | 3–5% | P3V3: 3.3 × 0.97 = 3.201 V | 3.3 × 1.03 = 3.399 V |
DC 解析
電圧分布
voltage(PDN);
% Show design rule violations
voltage(PDN, ShowViolation=true);
電流分布
current(PDN);
% Show current direction arrows
current(PDN, Direction='on');
解析前の PDN 設定の確認
設定後に PDN モデルのプロパティを確認し、割り当てを検証します。
PDN.Source
PDN.Load
PDN.Sense
PDN.NominalVoltage
PDN.LoadCurrent
ワークフロー:単一ネットの PDN 解析
1 つの電源ネットを最初から最後まで解析する対話型ワークフローです。
%% Step 1: Import the board
pcb = pcbFileRead(fullfile(boardDir, 'pcie5_native'));
%% Step 2: Identify power nets
netList = cadnetList(pcb);
powerPatterns = ["^P\d+V", "^VDD", "^VCC", "^AVDD", "^DVDD"];
isPower = false(height(netList), 1);
for p = powerPatterns
isPower = isPower | ~cellfun(@isempty, regexpi(netList.CadnetName, p));
end
powerNets = sortrows(netList(isPower, :), 'NumPins', 'descend');
disp(powerNets);
%% Step 3: Create cadnet and inspect
cnet = cadnet(pcb, 'P0V8');
show(cnet);
%% Step 4: Discover components for topology assignment
allComps = findComponents(cnet);
inductors = findComponents(cnet, "ComponentType", "Inductor");
ics = findComponents(cnet, "ComponentType", "IC");
resistors = findComponents(cnet, "ComponentType", "Resistor");
%% Step 5: Resolve voltage from net name
nomV = parseNetVoltage('P0V8'); % 0.8 V (see helper function above)
%% Step 6: Create and configure PDN
PDN = powerDistributionNetwork(cnet);
setNetworkParameters(PDN, ...
Source=inductors.Refdes, ...
Load=ics.Refdes, ...
Sense=resistors.Refdes(1), ...
PlatingThickness=0.002);
setDCParameters(PDN, "NominalVoltage", nomV, "LoadCurrent", 1); % placeholder — ask user for actual value
tolerancePct = 0.02; % 2% for <1V rails
setDCRules(PDN, ...
"MaxCurrentDensity", 0.5, ...
"MaxVoltage", nomV * (1 + tolerancePct), ...
"MinVoltage", nomV * (1 - tolerancePct), ...
"MaxViaCurrent", 500);
%% Step 7: Run analysis
voltage(PDN, ShowViolation=true);
current(PDN, Direction='on');
ワークフロー:複数ネットの一括解析
ボード上のすべての電源レールを一括解析する方法(スキップロジックを含むループ、レールごとの仕様テーブル)については、references/batch-analysis.md を参照してください。
よく使うパターン
コンポーネント Refdes の使用
findComponents は Refdes を文字列として返すため、setNetworkParameters でそのまま使用します。最初のコンポーネントだけでなく、一致するすべてのコンポーネントを使用してください。
inductors = findComponents(cnet, "ComponentType", "Inductor");
setNetworkParameters(PDN, Source=inductors.Refdes); % all inductors
AutoAssignDefault を使用する場合
AutoAssignDefault='True' は、次の場合にのみ使用してください。
- ネット上にインダクターが見つからない場合(LDO 電源レール、コネクター給電の電源レール)
- ユーザーがトポロジーの自動割り当てを明示的に希望している場合
- 精度よりも速度を優先する簡易スクリーニングモードの場合
明示的な findComponents に基づく割り当てを常に優先してください。
Z 軸の可視化
3D ビューで Z 軸の詳細を確認するには、daspect を使用します。
ax = gca;
daspect(ax, [1, 1, 0.05]);
注意点
-
認識できないネットに対して、
inferRailVoltageはNaNを返します。 計算や表示で結果を使用する前に、isnan()でチェックしてください(例:string(NaN)はmissingではなく"NaN"を生成します)。 -
setNetworkParametersではSenseパラメーターが必須です。 ネット上にテストポイントがない場合は、センス部品として抵抗器を使用してください。Senseを省略すると、解析中にエラーが発生します。 -
AutoAssignDefaultは第一選択ではなく、フォールバックです。 複雑な電源レール(LDO、コネクター給電)では、誤ったトポロジーが割り当てられる場合があります。findComponentsの出力を使った明示的な割り当てを優先してください。 -
基板データから
LoadCurrentを推定することはできません — 作業を停止して質問してください。 ネット名から解析できるNominalVoltageとは異なり、負荷電流は IC のデータシートまたはシステムの電力予算から取得する必要があります。setDCParametersを呼び出す前に、実際の負荷電流をユーザーに尋ね、実行を停止してください — ユーザーが回答するまで先に進まないでください。 ユーザーの明示的な確認なしに 1 A やその他のデフォルト値を仮定してはいけません。回答として値が分からない、または続行を希望すると伝えられた場合は、次の推定方法を提示して選択してもらってください。- ピン単位のヒューリスティック: 0.5 A × 負荷ピンの数(例:130 ピン → 65 A)
- TDP ベース: 総電力予算 ÷ 電源レール電圧(例:40 W ÷ 0.8 V = 50 A)
- 保守的な固定値: 負荷 IC 1 個あたり 10 A(簡易スクリーニング用)
- 1 A の仮値: ワークフローが最初から最後まで実行できることを確認するための最小値
ユーザーが方法を選択するか値を提示してから、
setDCParametersを実行してください。 -
LoadCurrentはスカラーの合計値ではなく、ベクトルである必要があります。 電源レール上に複数の負荷 IC がある場合、setDCParametersには負荷ごとの電流値が必要です。たとえば、負荷 U1(4.8 A)と U9(0.2 A)がある場合は、setDCParameters(PDN, LoadCurrent=[4.8, 0.2])のように指定します。スカラー(例:LoadCurrent=5)を渡すと、トポロジーに負荷が複数ある場合にエラーになります。 -
PDN の単位は混在しており、すべてが SI 単位系ではありません。
PlatingThicknessはインチ単位です(メートルではありません)。0.002は 2 mil ≈ 1.4 oz の銅に相当します。MaxCurrentDensityは mA/mil²(A/mm² ではありません)、MaxViaCurrentは mA(A ではありません)です。MinVoltage/MaxVoltageは絶対値のボルトです。めっき厚にメートル単位(例:35e-6)を使ったり、ビア電流にアンペア(例:1)を使ったりすると、結果が大きく不正確になります。 -
バッチモードでは、処理を止めるのではなくスキップしてください。 電圧、電源、または負荷の情報が不足している電源レールはスキップし、スキップした電源レールとその理由を報告してください。不完全な電源レールが 1 つあるだけで、バッチ全体を停止しないでください。
-
大規模な基板には 3000 個を超えるネットがあります。
cadnetListはすべてのネットを返します。CadnetNameに対する正規表現で電源/グラウンドのネットを絞り込み、その後NumPinsまたは特定のパターンでさらに絞り込んでください。 -
cnet.Voltageは信頼できません。 cadnet オブジェクトのVoltageプロパティは PCB ファイルからヒューリスティックに設定されるため、有効な電源レールでも'0.000'を返すことがよくあります。このプロパティに頼らず、必ず正規表現を使ってネット名から電圧を解析してください。 -
組み込みの
findPowerNetsやinferRailVoltageはありません。 これらは MATLAB 関数として存在しません。ネットを特定するにはcadnetList(pcb)とregexpiによるフィルタリングを使用し、ネット名から電圧を推定するには、このスキルで定義されているparseNetVoltageヘルパーを使用してください。 -
.brdファイルには extracta が必要です — 利用できない場合は停止してください。 ユーザーが.brdファイルしか持っておらず、extractaSetup()が[]を返すかエラーになる場合は、作業を停止してユーザーに extracta(Cadence のインストールに含まれます)が必要だと伝えてください。次の代替方法を提示してください。(a)extracta.exeのパスを指定する、(b) Allegro から ODB++ またはネイティブ CSV 形式でエクスポートする、(c) 同僚の Cadence 環境を使って変換する。回避策を試みないでください。
関連スキル
matlab-read-pcb-layout-- PDN 解析用の PCB/パッケージレイアウトのインポートmatlab-manage-pcb-material-- 基板および導体材料の設定matlab-model-via-- 電力供給経路のビアモデリングmatlab-analyze-em-- EM 解析の基礎
Copyright 2026 The MathWorks, Inc.