Example: Static Noise Margin

%%% SNM.m

%%%% Static Noise Margins

%%%% by Tsung-Chu Huang, 2010/04/06

FilePrefix = 'SNM';

gate1 = 'CMOS Inv';

gate2 = 'nMOS Inv';

Sweep = 1.8;

 

%%%%%%%%%%%%%%%%%%%

clc;

fprintf('*** Static Noise Margins ***\r\n');

sig = loadsig([FilePrefix, '.sw0']);

clf;

subplot(2,1,1);

title('TF Curves of Gate 1 & 2');

xlabel('DC Sweep (V)');

ylabel('Volts');

box on;

hold on;

TF1 = evalsig(sig, 'tf1');

TF2 = evalsig(sig, 'tf2');

X = zeros(length(TF1),1);

for i=1:length(TF1)

    X(i) = (i-1)*Sweep/(length(TF1)-1);

end

plot(X, TF1,'b-');

plot(X, TF2, 'r-');

legend(gate1, gate2, 0);

 

%%%%%%%%%%%%%%%%%%%%

for i = 1: length(TF1)

    slope = (TF1(i+1)-TF1(i))*(length(TF1)-1)/Sweep;

    if(slope < -1) break;

    end

end

 

Plot of SNM Butterfly Diagram

plot([X(i-10), X(i+10)], [TF1(i)+X(i)-X(i-10), TF1(i)+X(i)-X(i+10)], 'b-');

TF1C1 = i;

VOH = TF1(TF1C1);

plot([X(i), X(i)], [0, VOH], 'c--');

text(X(i),VOH,'VOH');

for i = TF1C1: length(TF1)

    slope = (TF1(i+1)-TF1(i))*(length(TF1)-1)/Sweep;

    if(slope > -1) break;

    end

end

 

TF1C2 = i;

VOL = TF1(TF1C2);

plot([X(i-10), X(i+10)], [TF1(i)+X(i)-X(i-10), TF1(i)+X(i)-X(i+10)], 'b-');

plot([X(i), X(i)], [0, VOL], 'c--');

text(X(i),VOL,'VOL');

 

for i = 1: length(TF2)

    slope = (TF2(i+1)-TF2(i))*(length(TF2)-1)/Sweep;

    if(slope < -1) break;

    end

end

plot([X(i-10), X(i+10)], [TF2(i)+X(i)-X(i-10), TF2(i)+X(i)-X(i+10)], 'r-');

TF2C1 = i;

VIL = X(TF2C1);

plot([0, X(i)], [TF2(i), TF2(i)], 'm--');

text(VIL, TF2(i), 'VIL');

 

for i = TF2C1: length(TF2)

    slope = (TF2(i+1)-TF2(i))*(length(TF2)-1)/Sweep;

    if(slope > -1) break;

    end

end

TF2C2 = i;

VIH = X(TF2C2);

plot([X(i-10), X(i+10)], [TF2(i)+X(i)-X(i-10), TF2(i)+X(i)-X(i+10)], 'r-');

plot([0, X(i)], [TF2(i), TF2(i)], 'm--');

text(VIH, TF2(i), 'VIH');

 

%%%%%%%%%%%%%%%%%%

subplot(2,1,2);

title('Butterfly Diagram from Gate 1 to 2');

xlabel('Output of Gate 1 as Input of Gate 2 (V)');

ylabel('Output of Gate 2 (V)');

box on;

hold on;

plot(TF1, X, 'b-');

plot(X, TF2,'r-');

legend(gate1, gate2, 0);

 

NMH=VOH-VIH;

NML=VIL-VOL;

 

plot([VIL, VIL],[TF2(TF2C1), X(TF1C2)],'g--');

plot([VOL, VOL],[TF2(TF2C1), X(TF1C2)],'g--');

plot([VIL, VOL],[TF2(TF2C1), TF2(TF2C1)],'k-');

plot([VIL, VOL],[X(TF1C2), X(TF1C2)],'k-');

set(gcf,'DefaultTextColor','black');

text(VOL, X(TF1C2), ['NML=', num2str(NML,3)]);

 

plot([VIH, VIH],[TF2(TF2C2), X(TF1C1)],'g--');

plot([VOH, VOH],[TF2(TF2C2), X(TF1C1)],'g--');

plot([VIH, VOH],[TF2(TF2C2), TF2(TF2C2)],'k-');

plot([VIH, VOH],[X(TF1C1), X(TF1C1)],'k-');

text(VIH, X(TF1C1), ['NMH=', num2str(NMH,3)]);

 

fprintf('VOH=%fV, VIH=%fV, NMH=VOH-VIH=%fV\n', VOH, VIH, VOH-VIH);

fprintf('VOL=%fV, VIL=%fV, NML=VIL-VOL=%fV\n', VOL, VIL, VIL-VOL);

fprintf('(Critical) Static Noise Margin = ');

if(NMH>NML) fprintf('%fV\n\n', NML);

else fprintf('%fV\n\n', NMH);

end

 

* SNM.sp

* Static Noise Margins from Min-Sized CMOS INV to Min-Sized Pseudo-nMOS INV

.lib 'rf018.l' tt

.GLOBAL VDD
VDD VDD 0 1.8

.SUBCKT CMOS_INV IN OUT
MP OUT IN VDD VDD PCH L=0.18u W=0.22u
MN OUT IN 0 0 NCH L=0.18u W=0.22u
.ENDS

.SUBCKT NMOS_INV IN OUT
MP OUT 0 VDD VDD PCH L=0.18u W=0.22u
MN OUT IN 0 0 NCH L=0.18u W=0.22u
.ENDS

VSW SW 0 DC 0
X1 SW TF1 CMOS_INV
X2 SW TF2 NMOS_INV

.DC VSW 0 1.8 0.01
.OPTION POST
.END