name: matlab-design-pcb-txline description: "Microstrip, stripline, CPW, differential pairs, and crosstalk analysis for impedance-controlled PCB interconnects. TRIGGER: user asks to design or analyze a transmission line (microstrip, stripline, CPW, coplanar, differential pair), extract RLGC or per-unit-length parameters, compute trace impedance, analyze a PCB trace cross-section, or perform crosstalk/coupling analysis. Invoke BEFORE writing code — preferred over RF Toolbox analytical functions (txlineMicrostrip, txlineStripline, txlineCPW). SKIP: EM simulation/S-parameter extraction of an existing component (use matlab-analyze-em), material/stackup definition only (use matlab-manage-pcb-material), building custom non-catalog geometry (use matlab-assemble-pcb-layout), optimization sweeps (use matlab-optimize-pcb-design)." license: MathWorks BSD-3-Clause metadata: author: MathWorks version: "1.0"
Designing Transmission Lines
When to Use
- Designing microstrip, stripline, or CPW transmission lines for impedance control
- Modeling differential pairs with or without aggressor traces for NEXT/FEXT crosstalk
- Analyzing 2D cross-sections for fast per-unit-length RLGC extraction
- Creating SIW (substrate integrated waveguide) lines
- Using
design()to auto-size lines for target impedance at a given frequency
When NOT to Use
- Building custom PCB structures from shapes — use
matlab-assemble-pcb-layout - Setting up substrate or conductor materials — use
matlab-manage-pcb-material - Running S-parameter or field analysis after design — use
matlab-analyze-em - Cascading transmission lines with other components — use
matlab-integrate-pcb-circuit
Tool Selection Priority
RF PCB Toolbox (default):
microstripLine,pcb2D,stripLine,coplanarWaveguide, etc.- 2D field solver — accurate for loss, coupling, and arbitrary stackups
- Use for any RLGC, impedance, cross-section, or transmission line design task
RF Toolbox (fallback only):
txlineMicrostrip,txlineStripline,txlineCPW- Analytical closed-form approximations, less accurate
- Use ONLY when: the user explicitly names these functions, or states RF PCB Toolbox is unavailable
Typical Workflow
- Before:
matlab-manage-pcb-material— set up substrate and conductor - This skill: Design and analyze the transmission line
- Check mesh/memory:
memoryEstimate(obj, fc, 'RetainMesh', true)— inspect auto-mesh before solving - After:
matlab-analyze-em— validate S-parameters →matlab-optimize-pcb-design— tune →matlab-integrate-pcb-circuit— cascade
Quick Reference
| Object | Topology | Key Properties |
|---|---|---|
microstripLine |
Single microstrip on ground | Length, Width, Height, GroundPlaneWidth |
stripLine |
Signal embedded in dielectric | Length, Width, Height, GroundPlaneWidth |
coplanarWaveguide |
CPW on substrate | Length, Width, Height, SlotWidth, GroundPlaneWidth |
coupledMicrostripLine |
Edge-coupled microstrip pair | Length, Width, Spacing, Height |
coupledStripLine |
Edge-coupled stripline pair | Length, Width, Spacing, Height |
microstripLineCustom |
Custom coupled/differential microstrip | TraceType, TraceWidth, TraceSpacing, aggressor traces |
stripLineCustom |
Custom coupled/differential stripline | TraceType, TraceWidth, TraceSpacing |
pcbBendCustom |
Custom bend discontinuity (R2025a) | BendShape, Height, GroundPlaneWidth |
pcb2D |
2D cross-section analysis | BoardWidth, BoardCenter, Layers |
SIWLine |
Substrate integrated waveguide | Length, Width, ViaSpacing, ViaDiameter |
Microstrip Line
Basic Creation and Design
ms = microstripLine;
show(ms);
% Design for target impedance at frequency
ms = design(microstripLine, 3e9);
Z0 = getZ0(ms);
Properties
ms = microstripLine;
ms.Length = 20e-3;
ms.Width = 5e-3;
ms.Height = 1.6e-3; % Substrate height
ms.GroundPlaneWidth = 30e-3;
ms.Substrate = dielectric("FR4");
ms.Conductor = metal("Copper");
Analysis
ms.Conductor = metal("Copper"); % Required for rlgc (finite conductivity)
Z0 = getZ0(ms); % Characteristic impedance (no frequency argument)
td = propagationDelay(ms, 3e9); % Propagation delay (scalar frequency)
params = rlgc(ms, 3e9); % RLGC per unit length (scalar frequency)
freq = linspace(1e9, 6e9, 51);
sp = sparameters(ms, freq, 'SweepOption', 'interp'); % S-parameters (frequency vector OK)
rfplot(sp);
Inverted / Suspended Microstrip
Model inverted or suspended configurations with multi-layer substrates (air gaps):
% Inverted: air below trace, substrate above ground
ms = microstripLine;
ms.Substrate = dielectric(Name={"Air","FR4"}, EpsilonR=[1 4.4], ...
LossTangent=[0 0.02], Thickness=[0.5e-3 1.6e-3]);
ms.Height = 0.5e-3 + 1.6e-3;
% Suspended: air / substrate / air
ms.Substrate = dielectric(Name={"Air","FR4","Air"}, EpsilonR=[1 4.4 1], ...
LossTangent=[0 0.02 0], Thickness=[0.3e-3 0.8e-3 0.3e-3]);
ms.Height = sum([0.3e-3 0.8e-3 0.3e-3]);
Stripline
Stripline has the signal trace embedded between two ground planes.
Symmetric Stripline
sl = stripLine;
sl.Length = 20e-3;
sl.Width = 3e-3;
sl.Height = 3.2e-3; % Total dielectric height (top + bottom)
sl.GroundPlaneWidth = 30e-3;
sl.Substrate = dielectric("Teflon");
sl.Conductor = metal("Copper");
show(sl);
Asymmetric Stripline
Use multi-layer dielectric with different thicknesses above and below. Height = cumulative thickness of layers below the signal (a layer boundary, not the total):
sl = stripLine;
sl.Substrate = dielectric(Name={"FR4","FR4"}, EpsilonR=[4.4 4.4], ...
LossTangent=[0.02 0.02], Thickness=[0.8e-3 1.6e-3]);
sl.Height = 0.8e-3; % Signal at the boundary between the two layers
Suspended Stripline
sl = stripLine;
sl.Substrate = dielectric(Name={"Air","FR4","Air"}, ...
EpsilonR=[1 4.4 1], LossTangent=[0 0.02 0], ...
Thickness=[0.5e-3 0.8e-3 0.5e-3]);
sl.Height = 0.5e-3; % Signal at Air/FR4 boundary (0.5mm from ground)
sl = design(stripLine, 3e9); % Or design for 50-ohm at target freq
Coplanar Waveguide
Basic CPW
cpw = coplanarWaveguide;
cpw.Length = 20e-3;
cpw.Width = 2e-3; % Center conductor width
cpw.SlotWidth = 0.5e-3; % Gap between center and ground
cpw.Height = 1.6e-3;
cpw.GroundPlaneWidth = 10e-3;
show(cpw);
Design and Analyze
cpw = design(coplanarWaveguide, 5e9);
Z0 = getZ0(cpw);
sp = sparameters(cpw, linspace(1e9, 10e9, 51), 'SweepOption', 'interp');
rfplot(sp);
Coupled Transmission Lines
Edge-Coupled Microstrip
cms = coupledMicrostripLine;
cms.Length = 20e-3;
cms.Width = 2e-3;
cms.Spacing = 0.5e-3; % Gap between traces
cms.Height = 1.6e-3;
cms.Substrate = dielectric("FR4");
show(cms);
Even/Odd Mode Impedance
freq = 3e9;
Zeven = getZEven(cms, freq); % Even-mode impedance
Zodd = getZOdd(cms, freq); % Odd-mode impedance
Zdiff = 2 * Zodd; % Differential impedance
Edge-Coupled Stripline
csl = coupledStripLine;
csl.Length = 20e-3;
csl.Width = 2e-3;
csl.Spacing = 0.3e-3;
csl.Height = 3.2e-3;
csl.Substrate = dielectric("Teflon");
Multi-Layer Coupled Lines
cms = coupledMicrostripLine;
sub = dielectric("FR4", "Teflon");
sub.Thickness = [1.0e-3 0.5e-3]; % Set Thickness BEFORE assigning to component
cms.Substrate = sub;
cms.Height = 1.5e-3;
Custom Transmission Lines and Crosstalk Analysis
microstripLineCustom and stripLineCustom model differential pairs with optional aggressor traces for NEXT/FEXT crosstalk analysis.
Properties (microstripLineCustom; stripLineCustom has same interface, Teflon default, embedded between ground planes)
| Property | Default | Description |
|---|---|---|
TraceType |
'Single' |
'Single' or 'Differential' (NOT 'Single-ended') |
TraceLength |
0.05 |
Trace length (m) |
TraceWidth |
0.002 |
Signal trace width (m) |
TraceSpacing |
0.002 |
Spacing between differential pair traces (m) |
Height |
0.0016 |
Substrate height (m) |
GroundPlaneWidth |
(read-only) | Ground plane width — auto-computed, cannot be set |
LeftCoupledTraceGap |
0 |
Gap to left aggressor trace (m); 0 = no left aggressor |
RightCoupledTraceGap |
0 |
Gap to right aggressor trace (m); 0 = no right aggressor |
Substrate |
FR4 | Dielectric object |
Conductor |
PEC | Metal object |
Differential Microstrip
ms_diff = microstripLineCustom(TraceType='Differential', ...
TraceWidth=0.002, TraceSpacing=0.0005);
show(ms_diff);
Differential with Aggressor Traces
ms_diff = microstripLineCustom(TraceType='Differential', ...
TraceWidth=0.002, TraceSpacing=0.0005, ...
RightCoupledTraceGap=[0.003, 0.003], ...
LeftCoupledTraceGap=0);
show(ms_diff);
NEXT/FEXT Extraction
With aggressor traces, the S-parameter matrix is 6-port. Port mapping:
| Port | Trace |
|---|---|
| 1, 2 | Differential pair (near end, far end) |
| 3, 4 | Left aggressor (near end = NEXT, far end = FEXT) |
| 5, 6 | Right aggressor (near end = NEXT, far end = FEXT) |
ms = microstripLineCustom(TraceType='Differential', ...
TraceWidth=0.002, TraceSpacing=0.0005, ...
LeftCoupledTraceGap=0.003, RightCoupledTraceGap=0.003);
ms.Conductor = metal("Copper");
freq = linspace(0.1e9, 10e9, 101);
sp = sparameters(ms, freq, 'SweepOption', 'interp');
% Extract crosstalk from S-parameters
S31_dB = 20*log10(abs(squeeze(sp.Parameters(3,1,:)))); % Left NEXT
S41_dB = 20*log10(abs(squeeze(sp.Parameters(4,1,:)))); % Left FEXT
S51_dB = 20*log10(abs(squeeze(sp.Parameters(5,1,:)))); % Right NEXT
S61_dB = 20*log10(abs(squeeze(sp.Parameters(6,1,:)))); % Right FEXT
RLGC Coupling Matrices
For coupled/differential lines, rlgc returns N×N matrices (off-diagonal = mutual L/C):
ms = microstripLineCustom(TraceType='Differential', ...
TraceWidth=0.002, TraceSpacing=0.0005, RightCoupledTraceGap=0.003);
ms.Conductor = metal("Copper");
params = rlgc(ms, 5e9);
Custom Bends and Traces (R2025a)
pcbBendCustom and pcbTraceCustom model bend discontinuities and step-impedance transitions. See references/custom-bends-and-traces.md for properties and examples.
SIW Transmission Line
Substrate Integrated Waveguide uses via fences to create a waveguide in PCB.
siw = SIWLine;
siw.Length = 15.3e-3;
siw.Width = 7.4e-3;
siw.ViaSpacing = [1.2e-3 5e-3]; % [along-length, across-width]
siw.ViaDiameter = 0.51e-3;
siw.Height = 0.254e-3;
siw.Substrate = dielectric(Name="RO4003C", EpsilonR=3.38, LossTangent=0.0027, Thickness=0.254e-3);
siw.Conductor = metal("Copper");
show(siw);
sp = sparameters(siw, linspace(20e9, 40e9, 51), 'SweepOption', 'interp');
rfplot(sp);
The SIW has a FeedLine property (a traceTapered object) for the microstrip-to-SIW transition.
2D Cross-Section Analysis
pcb2D
Creates a 2D cross-section model for fast per-unit-length analysis. Much faster than full 3D sparameters for uniform transmission line characterization.
p = pcb2D;
p = pcb2D(Name=Value);
Key Properties:
Name— Descriptive name for the cross-sectionBoardWidth— Total board width (m)BoardCenter— Center position of the board cross-sectionLayers— Cell array oftrace2Danddielectricobjects defining the stackup
Methods: show(p), sparameters(p, freq), rlgc(p, scalarFreq), propagationDelay(p, scalarFreq)
trace2D
Represents a trace cross-section for use inside a pcb2D object's Layers cell array.
t = trace2D;
t.Type = 'Signal'; % 'Signal' (default) or 'Ground'
t.Shape = shape.Rectangle(Length=0.3e-3, Width=35e-6); % Length=trace width, Width=trace thickness
t.Conductor = metal("Copper");
Key Properties: Type ('Signal'/'Ground'), Shape (shape.Rectangle — Length = trace width, Width = metal thickness), Conductor, TrapezoidalEtchAngle
Building a 2D Model — Single Trace
sub = dielectric("FR4");
sub.Thickness = 0.2e-3;
sig = trace2D;
sig.Type = 'Signal';
sig.Shape = shape.Rectangle(Length=0.3e-3, Width=35e-6);
sig.Conductor = metal("Copper");
gnd = trace2D;
gnd.Type = 'Ground';
gnd.Shape = shape.Rectangle(Length=5e-3, Width=35e-6);
p = pcb2D(BoardWidth=5e-3, Layers={sig, sub, gnd});
show(p);
params = rlgc(p, 10e9);
fprintf('L = %.2f nH/m, C = %.2f pF/m\n', params.L*1e9, params.C*1e12);
Building a 2D Model — Differential Pair (Coupled Traces)
Multiple traces on the same metal layer must be passed as a trace2D array [sig1, sig2], not separate cells:
sub = dielectric("FR4");
sub.Thickness = 0.2e-3;
sig1 = trace2D;
sig1.Type = 'Signal';
sig1.Shape = shape.Rectangle(Length=0.15e-3, Width=35e-6);
sig1.Shape.Center = [-0.2e-3 0];
sig1.Conductor = metal("Copper");
sig2 = trace2D;
sig2.Type = 'Signal';
sig2.Shape = shape.Rectangle(Length=0.15e-3, Width=35e-6);
sig2.Shape.Center = [0.2e-3 0];
sig2.Conductor = metal("Copper");
gnd = trace2D;
gnd.Type = 'Ground';
gnd.Shape = shape.Rectangle(Length=5e-3, Width=35e-6);
p = pcb2D(BoardWidth=5e-3, Layers={[sig1, sig2], sub, gnd});
show(p);
params = rlgc(p, 10e9); % Returns 2x2 L and C matrices for coupled pair
When to Use pcb2D vs 3D
| Scenario | Approach |
|---|---|
| Impedance/RLGC of uniform cross-section | pcb2D — milliseconds |
| Discontinuities (bends, steps, stubs) | 3D sparameters — minutes |
| Differential pair coupling | pcb2D with [sig1, sig2] array |
Slicing a 3-D Component to 2-D
slice extracts a 2-D cross section from a pcbComponent (convert catalog objects first):
cms = design(coupledMicrostripLine, 3e9);
cms.Conductor = metal("Copper");
pcb2d = slice(pcbComponent(cms));
params = rlgc(pcb2d, 3e9);
design() for Impedance Targeting
The design function sizes a transmission line for a target frequency (and optionally impedance):
ms = design(microstripLine, 3e9); % Default 50-ohm at 3 GHz
sl = design(stripLine, 5e9); % Default 50-ohm at 5 GHz
cpw = design(coplanarWaveguide, 10e9); % Default 50-ohm at 10 GHz
After design, verify with getZ0:
Z0 = getZ0(ms); % Should be ~50 ohm
transmissionLineDesigner App
Interactive app for designing and analyzing transmission lines:
transmissionLineDesigner
Select line type, set dimensions/materials interactively, analyze impedance/S-parameters/RLGC, and export designs to workspace.
Design Adjustments
| Problem | Adjust | Direction |
|---|---|---|
| Z0 too high | Width | Increase |
| Z0 too low | Width | Decrease |
| Too lossy | Conductor thickness | Increase |
| Wrong electrical length | Length | Adjust |
Pitfalls
Use interpolating sweep for S-parameters: Always use
sparameters(obj, freq, 'SweepOption', 'interp')— direct sweeps are significantly slower.Check mesh density before solving: Run
memoryEstimate(obj, fc, 'RetainMesh', true)beforesparameters(). If too dense, coarsen:mesh(obj, 'MaxEdgeLength', lambda/6). Seematlab-analyze-em.Height meaning differs by topology: For microstrip,
Height= dielectric thickness. For stripline with multi-layer substrate,Heightmust equal a cumulative layer boundary — it defines where the signal sits in the stack.Width controls impedance: Wider trace → lower impedance. Use
design()to auto-size, then adjust manually if needed.Conductor defaults to PEC: Without assigning
metal("Copper"), loss will be zero. Always setConductorfor realistic insertion loss.Inverted/suspended microstrip Height rule: For inverted microstrip, create multi-layer dielectric with
Name={"Substrate","Air"}and setHeightto air layer thickness. For suspended microstrip,Height= sum of air + substrate thickness.Multi-layer stripline Height is a layer boundary, not total:
Heightmust equal a cumulative layer boundary fromThicknessvector. Setting Height to total causes "Expected Height must be among the substrate layers."SIW cutoff: SIW has a cutoff frequency below which signals do not propagate. Size the width for operation well above cutoff.
getZ0 takes no frequency:
getZ0(obj)returns characteristic impedance directly. Do not pass a frequency argument.rlgc requires finite conductivity: Assign
metal("Copper")before callingrlgc. Default PEC causes "Conductivity value must be finite with 2D field solver."Multi-layer Name must use cell array: Use
Name={"Air","FR4"}(cell array), notName=["Air","FR4"](string array).trace2D uses Shape, not Width/Thickness: Set
t.Shape = shape.Rectangle(Length=traceWidth, Width=metalThickness). Note:shape.Rectangle.Length= trace width,.Width= metal thickness. Apcb2Drequires at least one'Ground'type trace.pcb2D rlgc takes scalar frequency:
rlgc(p, freq)requires a scalar, not a vector. Loop or call once at the frequency of interest.pcb2D trace2D Center is x-position only:
trace2D.Shape.Centercontrols horizontal position. Vertical is from layer stacking order. SetCenter = [x_offset 0].Same-layer traces need array, not separate cells: For coupled/differential traces on the same metal layer, use
Layers={[sig1, sig2], sub, gnd}. Separate cells{sig1, sig2, sub, gnd}treats them as different metal layers and errors: "dielectric layer must be between metal layers."Crosstalk port count depends on aggressor configuration: Both aggressors → 6-port; one → 4-port; none → 2-port.
RightCoupledTraceGap=Infremoves that aggressor.TraceGap is edge-to-edge, not center-to-center: Measures gap between nearest edges, not trace centers.
Use
TraceWidth, notWidth:microstripLineCustomandstripLineCustomuseTraceWidth. SettingWidthsilently has no effect.
Related Skills
matlab-manage-pcb-material— Substrate and conductor setupmatlab-analyze-em— S-parameter extraction and field analysismatlab-integrate-pcb-circuit— Touchstone export, circuit cascadingmatlab-assemble-pcb-layout— Custom trace geometries
Copyright 2026 The MathWorks, Inc.