This example shows how to build and simulate an RC tree circuit using the RF Toolbox.
In "Asymptotic Waveform Evaluation for Timing Analysis" (IEEE Transactions on Computer-Aided Design, Vol., 9, No. 4, April 1990), Pillage and Rohrer present and simulate an RC tree circuit that models signal integrity and crosstalk in low- to mid-frequency MOS circuit interconnect. This example confirms their simulations using RF Toolbox software.
Their circuit, reproduced in the following figure, consists of 11 resistors and 12 capacitors. In the paper, Pillage and Rohrer:
Apply a ramp voltage input
Compute transient responses
Plot the output voltages across two different capacitors, C7
and C12
.
Figure 1: An RC tree model of MOS interconnect with crosstalk.
With RF Toolbox software, you can programmatically construct this circuit in MATLAB and perform signal integrity simulations.
This example shows:
How to use rfckt.seriesrlc
, rfckt.shuntrlc
, rfckt.series
, and rfckt.cascade
to programmatically construct the circuit as two different networks, depending on the desired output.
How to use analyze
to extract the S-parameters for each 2-port network over a wide frequency range.
How to use s2tf
with Zsource = 0
and Zload = Inf
to compute the voltage transfer function from input to each desired output.
How to use rationalfit
to produce rational-function approximations that capture the ideal RC-circuit behavior to a very high degree of accuracy.
How to use timeresp
to compute the transient response to the input voltage waveform.
To duplicate both output plots, RF Toolbox software calculates the output voltage across C7
and C12
. To that end, the circuit must be expressed as two distinct 2-port networks, each with the appropriate capacitor at the output. Figure 2 shows the 2-port configuration for computing the voltage across C7
. Figure 3 shows the configuration for C12
. Both 2-port networks retain the original circuit topology, and share much of the same structure.
Figure 2: The circuit drawn as a 2-port network with output across C7
.
Figure 3: The circuit drawn as a 2-port network with output across C12
.
All of the building blocks are formed by selecting appropriate values with the rfckt.shuntrlc
function shown in Figure 4 or the rfckt.seriesrlc
function shown in Figure 5. The 2-port building blocks are then connected using rfckt.cascade
as shown in Figure 6 or rfckt.series
as shown in Figure 7.
Figure 4: The 2-port network created by the rfckt.shuntrlc
function.
Figure 5: The 2-port network created by the rfckt.seriesrlc
function.
Figure 6: Connecting 2-port networks with the rfckt.cascade
function.
Figure 7: Connecting 2-port networks with the rfckt.series
function.
The following MATLAB code constructs the portion of the network shared between the two variants.
R1 = rfckt.seriesrlc('R',10); C1 = rfckt.shuntrlc('C',0.114e-12); R9 = rfckt.shuntrlc('R',48); C9 = rfckt.shuntrlc('C',0.007e-12); R10 = rfckt.shuntrlc('R',24); C10 = rfckt.shuntrlc('C',0.2e-12); R10C10 = rfckt.series('Ckts',{R10,C10}); C9R10C10 = rfckt.cascade('Ckts',{C9,R10C10}); R9C9R10C10 = rfckt.series('Ckts',{R9,C9R10C10}); R2 = rfckt.seriesrlc('R',72); C2 = rfckt.shuntrlc('C',1.238e-12); R3 = rfckt.seriesrlc('R',34); C3 = rfckt.shuntrlc('C',0.021e-12); R4 = rfckt.seriesrlc('R',96); C4 = rfckt.shuntrlc('C',0.028e-12); R5 = rfckt.seriesrlc('R',72); C5 = rfckt.shuntrlc('C',0.007e-12); R6 = rfckt.seriesrlc('R',10); C6 = rfckt.shuntrlc('C',1.048e-12); R7 = rfckt.seriesrlc('R',120); R8 = rfckt.shuntrlc('R',24); C8 = rfckt.shuntrlc('C',0.2e-12); R8C8 = rfckt.series('Ckts',{R8,C8}); sharedckt = rfckt.cascade('Ckts', ... {R1,C1,R9C9R10C10,R2,C2,R3,C3,R4,C4,R5,C5,R6,C6,R7,R8C8}); % Additional shared building blocks used in both 2-port networks. C7 = rfckt.shuntrlc('C',0.47e-12); R11C12 = rfckt.shuntrlc('R',1000,'C',1e-12);
Figure 2 shows that constructing a 2-port network with an output port across C7
requires creating C11
using rfckt.shuntrlc
, then combining C11
with R11
and C12
using rfckt.series
, and finally combining C11R11C12
with the rest of the network and C7
using rfckt.cascade
.
Similarly, Figure 3 shows that constructing a 2-port network with an output port across C12
requires creating another version of C11
(C11b
) using rfckt.seriesrlc
and combining all the parts together using rfckt.cascade
.
C11 = rfckt.shuntrlc('C',0.1e-12); C11R11C12 = rfckt.series('Ckts',{C11,R11C12}); cktC7 = rfckt.cascade('Ckts',{sharedckt,C11R11C12,C7}); C11b = rfckt.seriesrlc('C',0.1e-12); cktC12 = rfckt.cascade('Ckts',{sharedckt,C7,C11b,R11C12});
The input signal used by Pillage and Rohrer is a voltage ramp from 0 to 5 volts with a rise time of one nanosecond and a duration of ten nanoseconds. The following MATLAB code models this signal with 1000 timepoints with a sampleTime
of 0.01 nanoseconds.
The following MATLAB code also uses the logspace
function to generate a vector of 101 logarithmically spaced analysis frequencies between 1 Hz and 100 GHz. Specifying a wide set of frequency points improves simulation accuracy.
sampleTime = 1e-11; t = (0:1000)'*sampleTime; input = [(0:100)'*(5/100); (101:1000)'*0+5]; freq = logspace(0,11,101)';
To simulate each network:
The analyze
function extracts S-parameters over the specified frequency range.
The s2tf
function, with option = 2
, computes the gain from the source voltage to the output voltage. It allows arbitrary source and load impedances, in this case Zsource = 0
and Zload = Inf
. The resulting transfer functions tfC7
and tfC12
are frequency-dependent data vectors that can be fit with rational-function approximation.
The rationalfit
function generates high-accuracy rational-function approximations. The resulting approximations match the networks to machine accuracy.
The timeresp
function computes the analytic solution to the state-space equations defined by a rational-function approximation. This methodology is fast enough to enable one to push a million bits through a channel.
analyze(cktC7,freq); sparamsC7 = cktC7.AnalyzedResult.S_Parameters; tfC7 = s2tf(sparamsC7,50,0,Inf,2); fitC7 = rationalfit(freq,tfC7); outputC7 = timeresp(fitC7,input,sampleTime); analyze(cktC12,freq); sparamsC12 = cktC12.AnalyzedResult.S_Parameters; tfC12 = s2tf(sparamsC12,50,0,Inf,2); fitC12 = rationalfit(freq,tfC12); outputC12 = timeresp(fitC12,input,sampleTime);
The outputs match Figures 23 and 24 of the Pillage and Rohrer paper.
figure plot(t,input,t,outputC7,'LineWidth',2) axis([0 2.5e-9 0 5.5]) title('Ramp Response of Low- to Mid-frequency MOS Circuit Interconnect with Crosstalk') xlabel('Time (sec)') ylabel('Voltage (volts)') legend('Vinput','V(C7)','Location','NorthWest')
figure plot(t,input,t,outputC12,'LineWidth',2) axis([0 5e-9 0 .5]) title('Crosstalk in Low- to Mid-frequency MOS Circuit Interconnect with Ramp Input') xlabel('Time (sec)') ylabel('Voltage (volts)') legend('Vinput','V(C12)','Location','NorthEast')
Though not shown in this example, you can also use the freqresp
function to check the behavior of rationalfit
well outside the specified frequency range. The fit outside the specified range can sometimes cause surprising behavior, especially if frequency data near 0 Hz (DC) was not provided.
To perform this check for the rational-function approximation in this example, uncomment and run the following MATLAB code.
% widerFreqs = logspace(0,12,1001); % respC7 = freqresp(fitC7,widerFreqs); % figure % loglog(freqs,abs(tfC7),'+',widerFreqs,abs(respC7)) % respC12 = freqresp(fitC12,widerFreqs); % figure % loglog(freqs,abs(tfC12),'+',widerFreqs,abs(respC12))