尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cadence Virtuoso中DFF设计全流程:原理图、仿真到版图后仿

Cadence Virtuoso中DFF设计全流程:原理图、仿真到版图后仿 先交代一下背景最近一个全定制分频器项目里需要在Cadence Virtuoso中把DFF从原理图一路做到版图后仿。这个DFF别看是个基础数字cell放到混合信号环境里设计起来比想象中琐碎得多。从新建库、搭原理图、跑ADE L工艺角仿真到用PWL文件做激励、导入EMX寄生模型每一步都有值得记录的经验。这篇东西不讲空理论就围绕“Virtuoso里的DFF设计”这条主线把我实际动手的过程、踩过的坑、最后沉淀下来的做法一次说清楚。适合刚接触Cadence Virtuoso的模拟/混合信号工程师也适合想把数字标准单元定制得再细一点的版图设计者。1. 项目整体设计思路与电路选型1.1 DFF到底要做什么D触发器全称Data Flip-Flop最简单的理解是在时钟上升沿到来时把输入D上的电平“锁存”到输出Q上时钟其他时间里Q保持之前的值不动。它在分频器、移位寄存器、流水线、状态机里都是核心单元。做PLL的时候DFF和压控振荡器输出直接相连是第一级分频的关键路径做SerDes的时候采样器后头往往跟着一级DFF用来把异步数据重新定时。所以DFF的时序性能直接决定系统最高能跑多快。DFF的基本行为可以归纳成三条时钟上升沿到来时Q复制D的值时钟处于低电平或高电平期间Q保持不变化如果带异步复位或置位则复位信号有效时Q直接清零或置1。在Virtuoso里搭DFF通常不会写代码而是画晶体管级电路。因为DFF在全定制流程里不是孤立器件它要和VCO、LDO、PLL这类模拟模块放到同一个schematic里做联合仿真细到每个管的W/L都要能改、每个节点的寄生都要能看。用数字综合流程很难做到这种粒度。1.2 为什么不直接调用标准单元库而要自己画有人说DFF又不是什么新鲜东西PDK里大概率有现成的标准单元调一个不就行了。这话对一半。标准单元库里的DFF确实能用但如果你做的是高速定制电路标准单元的尺寸、版图、功耗模型不一定符合你的约束。比如分频器的第一级DFF需要和前级VCO的摆幅匹配标准单元往往是“一视同仁”的通用尺寸驱动能力和阈值点可能并不匹配模拟接口要求。这时候手工设计一个晶体管级DFF反而更容易做优化。另外Virtuoso本质上是全定制IC设计环境模拟工程师习惯了直接看到管级连接、版图层次也更愿意自己控制时钟走线、电源地位置、器件匹配。自己画DFF还有一个好处可以随时插入额外的测试点、dummy管或去耦电容这些在数字标准单元里是碰不到的。1.3 动手前的设计规格要列清楚我习惯在打开Schematic Editor之前先把DFF的指标列明白。以这次设计为例电源电压0.8V目标时钟频率2GHz负载电容10fF那么DFF的建立时间、保持时间、CLK到Q延迟这三个参数的大致期望值必须先定下来。如果不先定指标后面几百种尺寸组合根本无从判断好坏。设计规格不需要特别复杂但必须写清楚电源电压0.8V变化范围按正负10%考虑时钟频率2GHz也就是500ps周期负载条件Q端挂10fF电容模拟下一级输入目标时序建立时间小于50ps保持时间小于30psCLK到Q延迟小于80ps工作温度范围-40℃到85℃需要覆盖的工艺角tt、ss、ff。有了这些数字后续的尺寸迭代就有据可依。否则仿真出来一个波形自己也说不清到底算过还是没过。2. 从零搭建DFF原理图2.1 新建库与cell打开Cadence Virtuoso的Library Manager在菜单栏点File → New → Library弹窗里输入库名比如DFF_Lib。如果你已经有PDK的tech file直接选择Attach to existing technology library选正在用的工艺PDK如果选Dont attach后续很多Layer定义和LVS支持都会很麻烦所以强烈建议挂PDK。库建好后在Library Manager里选择新库右键New Cell ViewCell Name填dff_tgType选择schematic工具会自动打开Schematic Editor。这里有个经验库名和cell名尽量用英文小写加下划线别用中文和空格。我见过有人给cell起名叫“DFF_最终版”结果导出网表的时候各种报错改名字改到崩溃。2.2 画传输门主从DFF这次用的是传输门主从结构由4个传输门和4个反相器搭成。主级由传输门TG1、反相器INV1、传输门TG2、反相器INV2组成从级由TG3、INV3、TG4、INV4组成。CLK引脚进来后先接一个反相器INV_CLK产生CLKB作为所有传输门的互补控制信号。工作过程是这样的D信号经过TG1进入主级锁存点INV1和INV2组成一个正反馈环路。CLK为低时TG1导通、TG2关断主级跟踪DCLK上升沿到来后TG1关断、TG2导通主级保持住D的值同时TG3导通把主级锁存的值传送到从级INV3/INV4构成的锁存器上Q端输出。这就是上升沿触发DFF的标准工作方式。在Virtuoso Schematic Editor里没有现成的“传输门”符号需要用一个nmos管和一个pmos管并联实现。把两个管的源漏相连nmos栅接CLKpmos栅接CLKB就得到标准的CMOS transmission gate。反相器则是一对n管p管对拖。尺寸方面我一开始不会按标准单元库的尺寸去抄而是从负载反推。CLK反相器需要驱动4个传输门和1个反相器静态负载比较大所以它的p管W给到600nm、n管到300nm比较合理内部反相器先按最小尺寸基准p管200nm、n管100nm。沟道长度统一用工艺允许的最小值40nm减少面积和寄生。这个尺寸是初值后续仿真会继续调整。2.3 制作符号搭建测试平台连接完所有器件后用Create → Cellview → From Cellview可以自动生成symbol只需要指定引脚顺序和方向。把D、CLK、Q、QN、VDD、VSS这些引脚定义清楚保存symbol。然后新建一个测试台schematic比如命名dff_tb调用DFF这个symbol接上电源和激励源。测试台里的激励源我习惯这样设置CLK源用analogLib里的vpulseV10V20.8Delay1nRise0.05nFall0.05nWidth0.45nPeriod1nD源用vpwl周期2ns让D在时钟上升沿附近来回变化用来验证DFF是否能正确锁存电源vdd固定0.8V地接gnd!。刚搭完别急着做corner先直接跑一次tran仿真时间20ns。如果结果里CLK上升沿后Q电平跟D一致且下一拍之前保持不变说明DFF功能正常。这步主要用于排除连线错误。如果Q一直高阻基本是某个传输门没有正确选通检查CLK和CLKB是否接反这是最常犯的低级错误。3. ADE L仿真配置与工艺角设置3.1 ADE L初始设置测试台没问题后进入仿真环境。在Virtuoso里打开testbench选择Launch → ADE L。第一件事是确认模型库选择Setup → Model Libraries找到PDK提供的模型文件通常需要手动添加.scs或.lib文件。如果PDK支持右侧会有一个Section下拉框默认是tt用来选择工艺角。先选tt跑一遍基线后面再动别的。然后在Analyses里勾选tran设置Stop Time为20n精度保持Moderate。Outputs用Create Outputs → On Schematic点选D、CLK、Q、QN这四根线直接跑仿真。第一次仿真结束后在Waveform窗口里看波形确认变化规律符合预期。有个细节ADE L的Outputs如果在选点前先清一次可以避免误选。另外要确保系统变量vdd设置正确很多PDK会在netlist里自动把vdd!和gnd!连接好不需要额外加电源但也有部分PDK需要你在schematic里显式接VDD symbol。看你的PDK文档别想当然。3.2 ADE L中工艺角设置的操作细节这也是很多人经常问的点Virtuoso里ADE L仿真如何设置工艺角第一步打开Setup → Model Libraries。如果你的PDK把所有工艺角写在一个文件里通常有一个下拉框叫Section或者Corner直接选ss、ff、tt即可。选完之后建议再点一次Load Model Libraries确保模型文件被重新加载。如果PDK把tt、ss、ff拆成不同文件就没有下拉框可选。这时先在Model Libraries窗口把tt对应的文件加载好跑完tt然后再打开窗口把当前文件停用换成ss文件重新加载再跑。有的PDK支持用环境变量或Variables来切换比如往Variables里加一个cornerss并在模型文件里写成condition语句。具体写法要看PDK手册但大方向是一样的。我踩过最大的坑是改了Section仿真结果却完全没有变化。排查了很久发现模型库里还有个“global variable”覆盖了section选择导致切角不生效。所以切完工艺角以后最好先跑一个最简单的反相器测试确认MOS管阈值电压确实变了再回来跑DFF。3.3 用ADE XL批量跑工艺角省下大量时间只跑一轮ADE L当然可以但高速时序验证不可能只看tt一种情况。我后来把DFF的工艺角验证切到了ADE XL效率完全不一样。在Library Manager里选中测试台所在的库右键New Cell ViewType选择adexl打开ADE XL后将testbench设置到dff_tb。在Corners选项卡里新建corner把模型库Section分别设置成tt、ss、ff再添加温度-40、25、85度组合下来就是9个仿真点。点击Run之后批量跑完所有角Results里可以一次性看到每个corner下的Q波形也可以添加measurement用表格形式汇总CLK到Q延迟、上升时间等关键指标。这里提醒一句温度和工艺角组合是高速DFF必须看的。尤其ss角下器件变慢建立时间会明显变差。如果tt角满足指标ss角却临界就要考虑加大关键路径上的反相器驱动尺寸或者重新审视版图寄生。4. 波形导入与高级仿真技巧4.1 用PWL文件导入真实激励波形vpulse虽好但不够“真实”。比如你想给D端输入一串长随机比特流或者要模拟前级电路输出带有过冲、非单调跳变的波形这时候把数据写到PWL文件里再让Virtuoso读进来是最省事的方式。PWL文件格式很简单两列分别是时间和电压值时间单位可以写n、u、m等也可以写纯秒。每行一个转折点工具会自动按线性插值生成波形。示例0 0 1n 0 1.05n 0.8 2n 0.8 2.05n 0 3n 0 3.05n 0.8保存为txt文件路径用绝对路径文件名不要带中文。在testbench中放置vpwl源双击打开属性找到PWL file一栏点Browse选文件。如果你的Virtuoso版本没有这个栏位也可以用命令行方式直接写成pwl 0 0 1n 0 1.05n 0.8 ...不过文件方式更适合长序列。导入后跑tran之前一定要确认PWL文件最后一行的时间大于仿真停止时间否则到文件末尾之后源电压会保持最后一个值不动。你会看到一条平的尾巴容易被当成功能失效。另外文件格式一定保存成UTF-8无BOM或者ANSI别用记事本默认的UTF-8-BOM我遇到过好多次仿真器把BOM字符当成非法数据直接报错读不进去。4.2 EMX嵌入Virtuoso做互连电磁验证再往上一层如果这个DFF要被放在2GHz以上的高频链路里纯寄生提取可能不够。EMX是专门做电磁场仿真的工具现在可以嵌入Virtuoso直接在Layout XL中选中要考察的互连结构设置端口和参考地运行EMX后返回模型再替换原理图中的理想连线做联合仿真。Virtuoso的EMX流程对电感、传输线特别有用DFF本身不是典型受益者但它和高速时钟网络放在一起时哪根走线绕路了、哪个交叉耦合了都会在时序上体现。实际项目中我在分频器里用EMX提取过时钟树的一段长互连。结果发现单纯用PEX提取出的寄生电阻和电容和EMX算出的高频耦合效应有差异。这份差异小则几个飞法大则直接让时钟偏斜多出10ps左右。对2GHz的设计来说10ps已经是很危险的余量了。所以做高频DFF/分频器时别只停留在一阶RC提取有条件就上一把EMX。4.3 波形测量与关键延迟的计算方法波形出来了不能光看功能还要算指标。在Virtuoso的Waveform窗口里打开Calculator用cross和delay函数测量50%VDD处的阈值点。比如测CLK到Q延迟先计算CLK上升沿到达50%VDD的时间点再计算Q上升沿到达50%VDD的时间点两者相减就是CLK到Q的延迟。我跑出来的结果tt角下CLK到Q约68psss角下约95ps。和最初定的80ps对比ss角显然不合格。这个时候就要回头调整输出级反相器尺寸或者把DFF内部正反馈环路的驱动能力再抬一抬。注意要多取几个上升沿求平均因为仿真初始状态的毛刺会影响读数。还有一个经常被忽略的指标边沿速率。后仿真时寄生电容会把Q的边沿变缓原本10-90%上升时间只有15ps后仿可能变成28ps。别只看延迟边沿速率同样影响下一级电路。如果后仿边沿过缓可以在版图里增加驱动管宽度或者把内部反相器逐级放大形成buffer链。5. 版图设计与常见问题排查5.1 用Virtuoso Layout XL快速生成DFF版图原理图验证通过后进入版图。在Virtuoso中新建Layout cellview我习惯先用Layout XL打开选择Design → Generate Layout from Source让工具自动把原理图中的MOS管和连接关系导入到版图界面。自动生成之后需要手工整理别指望工具一次到位。DFF版图布局有几个原则可以照抄同一主从锁存器的反相器尽量靠近减少内部节点寄生CLK和CLKB作为全局信号走线要短且等长避免时钟偏斜电源地走线放在单元顶部和底部用M1横向贯穿方便单元拼接传输门的PMOS和NMOS尽量共用扩散区能省不少面积。还有一个容易漏掉的细节NMOS要加衬底接触PMOS要加N阱接触。自动布局会把器件放得很紧凑但well/substrate tap太少LVS会报floating well后仿也可能因为衬底电阻增大出现闩锁风险。DFF这么小的单元至少加4个tap左右各一对别省。5.2 DRC/LVS常见错误和排查跑完版图用Calibre或Assura做物理验证。DFF这种小单元最常见问题有三个一是传输门的源漏合并时没有把层次边对好DRC报警OD spacing。这种通常在版图编辑器里看着很顺眼但DRC会认为两块diffusion间距不够解决方法是把共享的源漏区画成同一个OD矩形或者补一个OD extension。二是符号和原理图pin顺序不一致LVS报property mismatch。这个在自动生成symbol时偶尔会出现尤其是Q和QN这种相邻输出。解决方法是回到symbol里核对pin order再重新生成网表。三是CLK和CLKB接反。这种错误是视觉上最不容易发现的因为版图里两根线离得很近金属层级一样。看LVS的netlist比对界面如果报出来内部节点GM1对应关系混乱基本就是反接问题。在版图里把CLK和CLKB的金属线用不同颜色层区分一下能有效避免这个坑。5.3 常见问题速查表为了方便现场排查整理一个快速参照表现象可能原因排查与解决仿真波形Q全为0CLK或D未正确连接传输门全关检查CLK/CLKB是否接反确认电源vdd/vss存在Q输出高阻悬空传输门没有互补导通看CLK和CLKB波形确认反相器INV_CLK工作工艺角设置无效Model Library Section未重新加载改完后重新Load Model Libraries检查全局变量覆盖PWL文件读取失败路径含中文编码带BOM时间单位不规范使用英文绝对路径另存为UTF-8无BOM确认每行两个值后仿Q边沿过缓寄生电容过大或驱动不足加大输出反相器尺寸缩短关键走线还有一类问题不在DFF本身。我有一次后仿发现DFF在ss角下Q偶尔少翻一拍查了半天发现是hold time违例D信号变化太快CLK上升沿之后没多久又变了从级锁存器没锁住。这其实是上游时序设计的问题需要通过调整D path延时或者链路时序来解不是DFF单元本身的bug。遇到这种问题不要急着改管子尺寸先确认是setup还是hold违例再去动电路。6. 实操心得与可复用建议6.1 先跑通功能再谈性能第一次做DFF别一上来就追求最低延迟或者最小面积。先把功能跑通用理想源、理想连线确认每个工作状态都正确再慢慢加corner、加寄生、加EMX。这个顺序能帮你隔离问题功能错了大概率是电路结构时序差一点大概率是尺寸和寄生。直接做PEX然后面对一堆报错排查起来非常崩溃。我见过不少新手一开始就把工艺角、温度、PEX全设好结果波形不对根本分不清是电路错误还是工具设置错误。与其这样不如老实分阶段验证。每加一个变量只改变一件事情出问题才好在心里缩小范围。6.2 命名规范和状态保存要做对做DFF这种全定制cell命名规范和工程管理特别重要。每个cell的view hierarchy要清晰testbench和symbol分开ADE L的仿真状态用Save State存下来文件名带日期和cornerLib库里不要堆垃圾数据。修改电路前先复制一份cell出来当作备份别在原图上动刀。Virtuoso的Undo并不总能救你。另外一个DFF项目往往会反反复复出几十个symbol版本建议在cell name里加rev编号比如dff_tg_v2比单纯改尺寸更直观。版图同样如此dff_tg_layout_v1、v2分开方便回溯。6.3 扩展思路从DFF到分频器模块做完单个DFF自然可以扩展成二分频、四分频链路。把两个DFF级联Q端接下一级CLK就能构成2分频器。高频分频器应用里DFF只是基础还需要考虑输入级灵敏度和输出buffer。这个阶段前面学的工艺角、PWL激励、EMX嵌入仿真全都能派上用场。建议建一个分频器testbench把多个corner下的jitter和上升时间都跑出来再对着系统指标调整。整个流程走一遍你对混合信号设计的理解会上一个台阶后面再做LDO、ADC的定制时序逻辑都轻松很多。最后再分享一个小技巧Virtuoso里导入PWL文件时如果遇到文件死活读不进去先看看文件是不是Windows下用记事本保存成了UTF-8 BOM格式。很多版本的仿真器会把BOM字符当成非法数据导致第一行解析失败。用Notepad或者VS Code另存为ANSI或UTF-8无BOM问题马上就解决了。这个毛病我当年折腾了两小时现在写出来给各位避坑。
返回列表