JeromeCool的模拟人生Word文件下载.docx
《JeromeCool的模拟人生Word文件下载.docx》由会员分享,可在线阅读,更多相关《JeromeCool的模拟人生Word文件下载.docx(45页珍藏版)》请在冰点文库上搜索。
假定P支路数目与N支路数目之比为k,每个PMOS与NMOS面积分别为Ap和An,
根据上面的(3)式,(ΔId/Id)=2*Avt/Vov/Area,可以得到
mis_tot^2=(Kc_p/Ap)^2+(Kc_n/An)^2,
其中Kc_p=2*Avt_p/Vov_p,Kc_n类似。
且满足k*Ap+An=Area_tot
通过简单的数学推导,实现最小的mis_tot的条件是:
单个支路PMOS与NMOS的面积之比
Ap/An=
[
(Kc_p/Kc_n)^2
/
k
]^(1/3)
PMOS与NMOS的总面积之比
(k*Ap)/An=
(k*Kc_p/Kc_n)^(2/3)
二、noise、PSR,kickback:
从热噪声及闪烁噪声的产生角度看,我们应该尽可能使用大的Vdsat,Id,以及WL;
然而从PSR角度看,我们通常期望更大的本征增益,即小的Vdsat,以及Id。
不过,对待noise、PSR,还有kickback,一致的是,我们都可以通过filtering来降低其影响。
对于多次镜像结构,总的原则是应该将LPF电容加到靠近输出级的gate节点以及impedance较大的gate节点。
三、cacsode结构
在headroom足够的情况下,增加一层cascode管可以有效的提高PSR。
需要注意的是,cascode管的偏置电压需要trade-off:
低温下,Vth_c较大,A点电压较低,迫使Ms趋向于线性区;
高温下,Vdsat_c增大而Vds_c通常会变小,从而使Mc趋向于线性区。
3、
matlab的代码效率调试工具profiler
matlab提供了一个非常有用的工具profiler,用来对matlab代码的运行效率进行分析,通过profiler,我们可以了解每行代码的运行情况,包括运行时间和调用次数等,找出程序运行时间瓶颈从而有针对性的进行改进。
1.打开profiler.
打开方式有以下几种:
a,在matlabdesktop下,Desktop->
Profiler.
b,在M文件编辑器下,Tools->
OpenProfiler.
c,在命令行直接输入,frofileviewer
2.运行profiler.
在Runthiscode后面的输入框里输入要运行的代码或者M文件名,点击StartProfiling或者按回车。
3.查看ProfileDetailReport。
程序运行完成后,profilesummary会以网页的形式显示,通过网页中的超链接可以查看到代码所调用的所有方法中的任何一行代码的运行情况,并且能够标示耗用时间最多的代码行。
报告通过对这些代码行按照占用时间的比例使用不同的色温图的颜色作背景,可以非常清晰的分析代码效率。
4、一个INV的jitterPSR
所谓反相器(inverter)的jitterPSR,楼主指的是DVDD上的noise对反相器输出信号的jitter的影响。
在低频段,DVDD噪声会调制INV的in-outdelay;
而在高频段,DVDD噪声可能直接在INV的输出造成glitch,或者,在输入端造成glitch,再由INV传递至输出。
影响INVjitter对DVDD敏感性的因素主要有:
1,Inputswing&
risingedge
一般来讲,INV的输入信号摆幅越小,则INV的in-outdelay越大;
而且,与此同时,INV的∂(delay)/∂(dvdd)也会越大。
而当输入摆幅确定后,输入信号的risingedge同样会影响∂(delay)/∂(dvdd)……
不多废话,下图为根据某工艺的单个INV的∂(delay)/∂(dvdd),包含了TT,55c,DVDD、SS,-40c,-10%DVDD、FF,125,+10%DVDD,0.1~1V的输入摆幅,以及6种不同的risingedge的情况,一图胜千言。
2,Devicemismatch
这一点似乎不是那么的显而易见。
直观上笔者是这么理解的:
在下图所示的offset情况下,PMOS的Vgs会增大,从而让PMOS在更多的时间内处于非饱和状态,这样会使DVDD的噪声更多的couple到INV输出,导致较差的jitter。
根据仿真,INV的thresholdoffset大约会额外贡献5~10%的∂(delay)/∂(dvdd)。
3,InputsignalPSR
这一条主要从瞬态的角度来理解,如果输入信号的PSR较差,当DVDD上施加一个step时,inputsignal上也会同时产生一个step;
类似的,如果INV的输出对DVDD有较大电容时,DVDD上的step也可能造成INV输出的glitch。
总结如下:
1,在实际应用中,某些场合下需要特别关注INV的jitterPSR:
A)AClevelshift中,由于INV通常工作在非满摆幅状态,因此更容易受到DVDDnoise的影响。
当jitterperformance非常关键时,takecareaboutthesignalswing!
B)BUFERchain中,多级INV的∂(dly)/∂(dvdd)相叠加,有可能会在输出端产生相当可观的jitter。
2,进行仿真时,worstcase的设定应该同时考虑inputsignal以及devicemismatch。
5、Matlab辅助简单模拟电路的EDA优化程序
(1)到(8)
Matlab辅助简单模拟电路的EDA优化程序
(1)
这套程序是在研究生阶段和一位很有才的师弟zhaow一起搞的,但工作以后就一直荒废在那儿了。
现在看来,当年的想法还是简单了一点,只考虑了everythingistypical的情况,现在知道了要covercorner。
看来,EDA的最终目标还任重道远~~
整套程序分为两部分,目录结构如下:
公共部分,位于/EDA/OptPlatform/
下,包含
器件模型库建立、加载函数:
loadLib.m,CreatTable.m
器件模型库查询、解析函数:
P_getSize,N_getSize,P_parse,N_parse
优化算法函数(均为带约束条件的多变量优化函数),目前有:
质子群算法pso_min.m,
萤火虫算法ffa_min.m,
人工鱼算法afsa_min.m,
退火算法sa_min.m。
应用部分,位于/EDA/Apps/
下,每一个优化应用都包含两个文件:
优化程序文件XXX_min.m,包含优化目标,优化变量取值范围,优化算法设置
电路描述文件XXX_Description.m,包含待优化电路的数学模型。
用户可以自己编写新的优化应用。
Matlab辅助简单模拟电路的EDA优化程序
(2)
模型库建立程序CreatTable.m。
关于这个方法的说明请移步《应用于matlab辅助EDA的器件模型的查表法实现》
所谓的模型库其实就是若干张巨大的3维表格。
这次还需要说明的是,该方法在第一次建立某工艺的模型库时,需要从sw0文件中读取数据,速度较慢。
程序会将模型数据另存一份mat格式的数据,提高以后的加载速度。
=================================
globallibSelectlibSelFLAG;
tic;
FLAG=0;
ifnargin<
1
FLAG=0;
libSelect='
null'
;
return;
end
libPath='
.'
switchlibSel
case'
tsmc055lp'
libPath='
..\tsmc_055lp'
case'
tsmc18'
..\tsmc18'
%------------------------------------
chrt18'
..\CHRT018IC'
smic18'
..\smic18mmrf'
%------------------------------------
smic13'
..\smic13_1233'
smic65'
..\smic65'
iflibPath=='
%----------------------------------------
libSelect=libSel;
clearplenpgspdspgm_idpgds_idpcgg_idpcgd_idpcdd_idpid_w;
clearnlenngsndsngm_idngds_idncgg_idncgd_idncdd_idnid_w;
globalplenpgspdspgm_idpgds_idpcgg_idpcgd_idpcdd_idpid_w;
globalnlenngsndsngm_idngds_idncgg_idncgd_idncdd_idnid_w;
%checkforquickLoading
Lib_File_name=strcat('
..\LibData\'
libSelect,'
.mat'
);
Mat_Lib_exist=exist(Lib_File_name,'
file'
ifMat_Lib_exist~=0
disp('
MATfileLibexists,usingstoredMATLib...'
pause
(1);
load(Lib_File_name,'
FLAG'
'
libSelect'
...
'
plen'
pgs'
pds'
pgm_id'
pgds_id'
pcgg_id'
pcgd_id'
pcdd_id'
pid_w'
nlen'
ngs'
nds'
ngm_id'
ngds_id'
ncgg_id'
ncgd_id'
ncdd_id'
nid_w'
else
LoadingPMOSParameters...'
FOM_MOS=loadsig(strcat(libPath,'
\pmos.sw0'
));
plen=evalsig(FOM_MOS,'
sw_ll'
)'
pgs=evalsig(FOM_MOS,'
gs'
pgs=pgs(:
1);
clearFOM_MOS;
%3-Dlookuptable:
[LenVgsVds]
len_step=max(size(plen));
gs_step=max(size(pgs));
ds_step=gs_step;
pgm_id=zeros(len_step,gs_step,ds_step);
pgds_id=zeros(len_step,gs_step,ds_step);
pcgg_id=zeros(len_step,gs_step,ds_step);
pcgd_id=zeros(len_step,gs_step,ds_step);
pcdd_id=zeros(len_step,gs_step,ds_step);
pid_w=zeros(len_step,gs_step,ds_step);
pds=zeros(ds_step,1);
%Fillinthetable
fords=1:
ds_step
disp([num2str(ds/ds_step*100,'
%1.4f'
)'
%...'
]);
\pmos.sw'
num2str(ds-1)));
pgm_id(:
:
ds)=evalsig(FOM_MOS,'
gm_id'
pgds_id(:
gds_id'
pcgg_id(:
cgg_id'
pcgd_id(:
cgd_id'
pcdd_id(:
cdd_id'
pid_w(:
id_w'
pds(ds)=max(max(evalsig(FOM_MOS,'
d'
)));
end
%----------------------------------------
LoadingNMOSParameters...'
\nmos.sw0'
nlen=evalsig(FOM_MOS,'
ngs=evalsig(FOM_MOS,'
ngs=ngs(:
len_step=max(size(nlen));
gs_step=max(size(ngs));
ngm_id=zeros(len_step,gs_step,ds_step);
ngds_id=zeros(len_step,gs_step,ds_step);
ncgg_id=zeros(len_step,gs_step,ds_step);
ncgd_id=zeros(len_step,gs_step,ds_step);
ncdd_id=zeros(len_step,gs_step,ds_step);
nid_w=zeros(len_step,gs_step,ds_step);
nds=zeros(ds_step,1);
\nmos.sw'
ngm_id(:
ngds_id(:
ncgg_id(:
ncgd_id(:
ncdd_id(:
nid_w(:
nds(ds)=max(max(evalsig(FOM_MOS,'
clearlibPath;
disp(strcat(libSelect,'
Libraryloaded.'
clearansds
cleards_stepgs_steplen_steplibSel;
FLAG=1;
toc;
Matlab辅助简单模拟电路的EDA优化程序(3)
模型库加载函数loadLib.m
使用方法:
loadLib('
loadLib('
'
f'
1、当workspace中已经存要加载的库时,什么都不做;
2、当workspace中不存在要加载的库时,
2.1、如果存在MAT格式的模型库,则从mat文件加载
2.2、如果不存在MAT格式的模型库,则从sw0文件加载,并在加载完成后令存一份mat格式模型库。
第二参数‘F‘会强制从文件重新加载模型库到workspace
========================
functionloadLib(libName,force)
globallibSellibSelectFLAG
disp(['
UsingLib"
'
libName'
"
...'
ifnargin==2&
&
force=='
ForceReloadingLib...'
clearFLAGlibSelect;
libSel=libName;
CreatTable;
elseif~strcmp(libSelect,libName)
LoadingNewLib...'
LibAlreadyLoaded...'
ifFLAG==0
LoadingERROR!
Dir_name='
Dir_exist=exist(Dir_name,'
dir'
ifDir_exist==0
mkdir('
..\'
LibData'
Lib_File_name=strcat('
Mat_Lib_exist=exist(Lib_File_name,'
ifMat_Lib_exist==0
SavingLibdatato"
..\LibData\"
forquickloadinginthefuture...'
save(Lib_File_name,'
Matlab辅助简单模拟电路的EDA优化程序(4)
模型库解析函数(实现将器件的工作点参数L,Vgs,Vds转换为小信号参数gm/id,gds/id,cgg/id,cgd/id,cdd/id。
因为程序的优化变量为器件的工作点参数,而器件模型中使用的是小信号参数):
===============================