mcpField
M
matlab-analyze-pcb-pdn

matlab-analyze-pcb-pdn

github.com/matlabその他1.2k81 回インストール1 日前に更新
リポジトリ

matlab-analyze-pcb-pdn について

matlab-analyze-pcb-pdn は、PCB の電源レールを直流解析する MATLAB スキルです。電源ネットの検出、トポロジー設定、ルール確認、単一または複数ネットの解析に対応します。

主な機能

  1. 01PCB 電源ネットの検出と抽出
  2. 02ソース・負荷・センスの設定
  3. 03電圧・電流分布の計算
  4. 04電圧・電流密度ルールの確認
  5. 05複数電源レールの一括解析

活用シーン

  1. 01電源レールの IR ドロップ確認
  2. 02電圧制限を外れる領域の特定
  3. 03ビア電流と電流密度の確認
  4. 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 を使用してください

一般的なワークフロー

  1. 事前: matlab-read-pcb-layout — Gerber/ODB++/Allegro から PCB レイアウトをインポートします
  2. このスキル: DC 解析を実行し、IR ドロップを確認し、設計ルールを評価して、ネットを一括解析します
  3. 事後: 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 固有):

プロパティ単位説明
PlatingThicknessinchesビアバレルのめっき厚(0.002 = 2 mil)
NominalVoltageVレールの公称電圧
LoadCurrentAシンクあたりの想定負荷電流
MaxCurrentDensitymA/mil²電流密度の熱的上限
MinVoltageV許容される絶対最小電圧
MaxVoltageV許容される絶対最大電圧
MaxViaCurrentmA1 本のビアに流せる最大電流

電圧許容差のガイドライン:

レール電圧許容差MinVoltageMaxVoltage
< 1 V1–2%P0V8: 0.8 × 0.98 = 0.784 V0.8 × 1.02 = 0.816 V
1–3.3 V2–3%P1V8: 1.8 × 0.975 = 1.755 V1.8 × 1.025 = 1.845 V
3.3–5 V3–5%P3V3: 3.3 × 0.97 = 3.201 V3.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]);

注意点

  1. 認識できないネットに対して、inferRailVoltage は NaN を返します。 計算や表示で結果を使用する前に、isnan() でチェックしてください(例:string(NaN) は missing ではなく "NaN" を生成します)。

  2. setNetworkParameters では Sense パラメーターが必須です。 ネット上にテストポイントがない場合は、センス部品として抵抗器を使用してください。Sense を省略すると、解析中にエラーが発生します。

  3. AutoAssignDefault は第一選択ではなく、フォールバックです。 複雑な電源レール(LDO、コネクター給電)では、誤ったトポロジーが割り当てられる場合があります。findComponents の出力を使った明示的な割り当てを優先してください。

  4. 基板データから 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 を実行してください。

  5. LoadCurrent はスカラーの合計値ではなく、ベクトルである必要があります。 電源レール上に複数の負荷 IC がある場合、setDCParameters には負荷ごとの電流値が必要です。たとえば、負荷 U1(4.8 A)と U9(0.2 A)がある場合は、setDCParameters(PDN, LoadCurrent=[4.8, 0.2]) のように指定します。スカラー(例:LoadCurrent=5)を渡すと、トポロジーに負荷が複数ある場合にエラーになります。

  6. PDN の単位は混在しており、すべてが SI 単位系ではありません。 PlatingThickness はインチ単位です(メートルではありません)。0.002 は 2 mil ≈ 1.4 oz の銅に相当します。MaxCurrentDensity は mA/mil²(A/mm² ではありません)、MaxViaCurrent は mA(A ではありません)です。MinVoltage/MaxVoltage は絶対値のボルトです。めっき厚にメートル単位(例:35e-6)を使ったり、ビア電流にアンペア(例:1)を使ったりすると、結果が大きく不正確になります。

  7. バッチモードでは、処理を止めるのではなくスキップしてください。 電圧、電源、または負荷の情報が不足している電源レールはスキップし、スキップした電源レールとその理由を報告してください。不完全な電源レールが 1 つあるだけで、バッチ全体を停止しないでください。

  8. 大規模な基板には 3000 個を超えるネットがあります。 cadnetList はすべてのネットを返します。CadnetName に対する正規表現で電源/グラウンドのネットを絞り込み、その後 NumPins または特定のパターンでさらに絞り込んでください。

  9. cnet.Voltage は信頼できません。 cadnet オブジェクトの Voltage プロパティは PCB ファイルからヒューリスティックに設定されるため、有効な電源レールでも '0.000' を返すことがよくあります。このプロパティに頼らず、必ず正規表現を使ってネット名から電圧を解析してください。

  10. 組み込みの findPowerNets や inferRailVoltage はありません。 これらは MATLAB 関数として存在しません。ネットを特定するには cadnetList(pcb) と regexpi によるフィルタリングを使用し、ネット名から電圧を推定するには、このスキルで定義されている parseNetVoltage ヘルパーを使用してください。

  11. .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.

コメント