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

资讯详情

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

Cadence Virtuoso .cdsinit配置实战:环境初始化脚本让设计效率翻倍

Cadence Virtuoso .cdsinit配置实战:环境初始化脚本让设计效率翻倍 说实话用了好几年Cadence Virtuoso我之前一直是个“裸奔党”每次启动ICFB老老实实打开Library Manager手动加载display.drf一遍遍敲快捷键设置网格、保存视图切到ADE又得重新选模型库、设工艺角。直到有次项目赶进度我隔壁工位的同事敲了几下键盘启动完直接带着所有自定义设置进了版图界面我才意识到——原来我一直没认真对待.cdsinit这个文件。后来花了两个晚上把各种奇奇怪怪的设置折腾进去才真正体会到什么叫“环境初始化文件玩明白了效率直接翻倍”。我之前总觉得.cdsinit是系统管理员或者CAD工程师才有必要去碰的东西自己作为设计师会跑仿真、会画版图就够了。这个想法真的错得离谱。实际上.cdsinit就是Virtuoso启动时的“灵魂脚本”它能决定你的ICFB长什么样、按什么键触发什么命令、启动时自动加载哪些文件、甚至能帮你在打开ADE之前就把仿真环境搭好。这篇文章我就把自己的经验整理出来包含我实际在用的配置片段、为什么这么写、以及踩过的坑希望能帮你少走点弯路。1. 先搞清楚.cdsinit是什么它到底在什么时候被加载1.1 Virtuoso启动时的一系列文件按什么顺序加载先建立一个整体认知。Virtuoso包括ICFB、ADE、Layout Editor等工具启动时不是只读一个配置文件而是会按顺序读一串东西。以我常用的IC6.1.8版本为例大概的加载顺序是这样系统级配置$CDS_INST_DIR/tools/dfII/etc/下的一些site配置一般不用动。用户级配置$HOME/.cdsinit注意有个点是隐藏文件。当前工作目录配置如果启动目录下存在cdsinit没有点或者.cdsinitICFB启动时也会读取具体行为和你设置的CDS_LOAD_ENV环境变量有关默认情况下优先加载$HOME/.cdsinit再加载当前目录下的同名文件。环境定义文件.cdsenv它通常用来保存GUI选项、工具状态、一些环境变量的默认值。显示文件display.drf管的是各个层次的颜色、线型、填充图案。库定义文件cds.lib和lib.defs管的是库路径和库定义。在实际启动日志里你会看到类似这样的输出Loading geView from /home/eda/tools/dfII/local Loading LVS include file ... Loading display resource file ... Loading cdsinit file ...重点就是这个Loading cdsinit file ...。后面的所有配置、快捷键、加载动作都会在这个阶段被执行。换句话说如果你想改Virtuoso的默认行为.cdsinit是优先级最高、最灵活的切入点。有一个很容易混淆的点.cdsinit是启动时加载.cdsenv是保存环境选项用的。如果你想改某个GUI选项的默认值比如默认视图尺寸可以用.cdsenv但如果你想写一段逻辑、循环、条件判断或者调用自定义函数那必须上.cdsinit。我自己一般把.cdsinit当成“总入口”里面除了基础设置还会调用其他Skill脚本文件。1.2 SKILL语言你不用成为专家但得懂一点语法.cdsinit文件本质上就是用SKILL语言写的脚本。SKILL是Cadence自带的Lisp方言语法上和C、Python差别挺大但你要做的不是成为SKILL高手而是能看懂、能改、能照猫画虎写一些常用片段。看一段最简单的; 打印一句欢迎语 printf(Welcome to Virtuoso! Enjoy your design.\n)再比如定义一个自己的函数procedure( myHelloWorld hi printf(Hello from my cdsinit!\n) )procedure是定义函数的关键字后面括号里是函数名和参数列表然后是函数体。在.cdsinit里最常用的几个函数分别是hiSetBindKey绑定快捷键。hiRegMenu注册菜单。load/loadi加载其他Skill文件。envSetVal设置环境变量值。printf/error输出信息或报错。hiDisplayMsg在CIW窗口显示消息。这些函数配合起来能做的事情非常多。我建议你不要把.cdsinit当成一个“配置文本”而是当成一个“启动程序”来理解——它能在启动瞬间完成一串你以前手动重复几百遍的操作。2. 最实用的一组设置把快捷键绑成肌肉记忆2.1 hiSetBindKey到底怎么用在.cdsinit里加快捷键核心就一个函数hiSetBindKey。它的语法是hiSetBindKey( 类型 按键 命令 )第一个参数是绑定类型常用的有Layout版图编辑器。Schematic原理图编辑器。General通用适用于所有编辑器。ADE模拟设计环境ADEL/ADEXL。CiWCIW窗口。第二个参数是按键组合比如CtrlShiftS、ShiftZ、F2、CtrlAltL等。注意大小写和加号。第三个参数是命令可以直接写一个Skill表达式也可以调函数。我举一个最典型的例子。默认情况下在原理图或者版图里保存一般用快捷键CtrlS实际上不同版本默认不一样有的版本是ShiftS。但很多人习惯左手放在键盘左侧用CtrlS总觉得别扭。我习惯绑成F2保存hiSetBindKey( Schematics F2 hiSave() ) hiSetBindKey( Layout F2 hiSave() ) hiSetBindKey( Schematics CtrlS hiSave() ) hiSetBindKey( Layout CtrlS hiSave() )这里有个细节hiSave()是保存当前窗口它同时保存原理图或版图但如果你当前焦点在CIW窗口上按F2可能不会触发。所以我会额外绑一个在CIW下的保存其实CIW不需要保存绑定反而容易误触这点大家自己体会。2.2 我的个人快捷键清单直接可抄下面这组快捷键是我目前一直在用的覆盖了我最高频的操作; 通用显示控制 hiSetBindKey( Layout CtrlZ zoomOut() ) hiSetBindKey( Layout ShiftZ zoomOut() ) hiSetBindKey( Layout CtrlShiftZ zoomIn() ) hiSetBindKey( Layout ShiftX zoomIn() ) hiSetBindKey( Schematic CtrlZ zoomOut() ) hiSetBindKey( Schematic ShiftZ zoomOut() ) hiSetBindKey( Schematic CtrlShiftZ zoomIn() ) ; 回到全图范围 hiSetBindKey( Layout CtrlHome zoomToFit() ) hiSetBindKey( Schematic CtrlHome zoomToFit() ) ; 保存和撤销 hiSetBindKey( Layout CtrlS hiSave() ) hiSetBindKey( Schematic CtrlS hiSave() ) hiSetBindKey( Layout CtrlZ hiUndo() ) ; 注意和放大器冲突我后续会讲很多人问我为什么要绑两套缩放CtrlZ和ShiftZ这么容易冲突的键位也敢用。说实话我刚开始也冲突过。Virtuoso里默认的撤销键是ShiftZ或CtrlZ这个Z是个重灾区。在原理图里画线时按ShiftZ有时是结束布线有时是撤销。所以我有段时间干脆把撤销改到CtrlY再额外加一个CtrlAltZhiSetBindKey( Schematic CtrlY hiUndo() ) hiSetBindKey( Layout CtrlY hiUndo() ) hiSetBindKey( Schematic CtrlAltZ hiUndo() ) hiSetBindKey( Layout CtrlAltZ hiUndo() )这里要强调一个原则不要盲目照抄别人的快捷键。因为不同版本的Virtuoso、不同PDK、甚至不同项目里加载的其他脚本可能已经占用了某些按键。我见过有同事把CtrlW绑成删除器件结果每次想关窗口时器件被删了。绑快捷键前先在默认环境下试一下这个键位原来是什么功能。2.3 一键重绘解决“电阻不显示阻值”这类显示刷新问题搜索引擎里“virtuoso电阻不显示阻值怎么办”是个高频问题。其实这个问题有很多种原因比如CDFComponent Description Format参数没填对、symbol没有调用CDF参数、或者显示缓存出问题了。在.cdsinit里能帮上忙的是最后一种情况——显示刷新。有时候你给电阻加上阻值、改了宽长比画面上就是不刷新。我遇到过的原因之一是hiRedraw()没有被正确触发。在版图或原理图里可以强制重绘hiSetBindKey( Schematic CtrlShiftR hiRedraw() ) hiSetBindKey( Layout CtrlShiftR hiRedraw() )如果你经常遇到显示异常还可以在.cdsinit里加一段在打开原理图时自动重绘。不过说实话自动重绘没太大必要因为正常操作下软件会自己刷新。手动绑一个键就够应急了。真正的“电阻不显示阻值”我排查下来最常见的是两个原因。第一个是CDF里display字段没勾选这个得去Tools - CDF Edit里改不是.cdsinit能解决的第二个是symbol的某些label字体问题渲染不出来。这种情况在启动时加载一个自定义显示设置会有帮助这个放在下一节讲。3. 启动时自动加载显示文件、环境变量和默认视图3.1 display.drf为什么层次颜色老是变来变去很多人启动Virtuoso后第一件事是手动加载显示文件。如果你在项目里用别人的PDKdisplay.drf经常会被覆盖或者加载成默认版本。结果就是你看到N阱的颜色、金属层的填充、通孔的线型都跟之前不一样画版图时特别别扭。在.cdsinit里可以用envSetVal或hiLoadDisplay之类的方式自动加载显示文件。我自己比较习惯用下面这种方式; 自动加载显示文件 let( (displayFile) displayFile /home/eda/display.drf when( isFile( displayFile ) hiLoadDisplay( displayFile ) ) )这里有个关键函数isFile它会先判断文件是否存在避免启动时因为路径不对直接报错中断。我之前刚开始写.cdsinit时直接把路径写死结果换了一台机器路径不存在Virtuoso启动后CIW刷了一屏错误后面的配置全没执行。用isFile判断是防御式编程的基本习惯。显示文件加载之后如果你还是遇到“层次颜色不对”的情况可以在.cdsinit里加一段覆盖某些层的属性。但注意这种方式不推荐在PDK环境下用因为PDK自带的display.drf往往已经定义了工艺层的颜色你再覆盖反而会冲突。我的建议是hiLoadDisplay加载一个自定义的基础显示文件然后PDK的显示文件会再自动加载一次后者优先级更高这样两边不打架。3.2 打开Virtuoso就自动铺好工作台默认启动ICFB后只有一个CIW窗口Library Manager得自己开想看的库得自己展开。这些操作完全可以自动化。我用的配置是; 启动后自动打开Library Manager并定位到指定库 when( isCallable( ddOpenLibManager ) ddOpenLibManager() ) ; 延迟一个时间片后展开指定库 when( isCallable( ddShowLibs ) ddShowLibs( list( mylib analogLib basic ) ) )ddOpenLibManager是打开Library Manager的APIddShowLibs可以指定展开哪些库。这里有一个小坑启动早期一些库可能还没完全初始化你调用ddShowLibs时传的库名如果不存在会报错。所以我一般会在.cdsinit里加个延时再执行或者直接不展开库只打开Library Manager。展开库这个动作我后来改成了点击左侧树形列表反而更快。如果你希望启动自动进入某个库的cellview可以用; 打开指定cellview dbOpenCellViewByType( mylib top schematic )但一般情况下我建议不要自动打开cellview因为启动本身要加载PDK、初始化各种环境已经够慢了再打开一个大的schematic可能会卡半天。除非你是专门在调试某个cell不然一条ddOpenLibManager就够了。3.3 envSetVal环境变量的正确打开方式.cdsinit里设置环境变量主要用envSetVal。这个函数的作用就是设置各种工具选项的默认值类似在GUI界面里改设置后保存到.cdsenv。比如我想让版图编辑器的默认网格间距是0.005μmenvSetVal( layout gridSpacing list( 0.005 0.005 ) )再比如让原理图编辑器默认显示instance的“CDF参数”那一列envSetVal( schematic instanceDisplayMode string full )这些设置的键值路径很多可以通过GUI界面改完后用CIW窗口的envSaveVals或查看.cdsenv文件来知道。我自己的方法是先在GUI里手动设置一遍想要的效果然后在Options - Environment或者Options - Display里把设置保存到.cdsenv再打开.cdsenv文件查看对应的变量名。这样比翻文档快得多。有一个最常见的需求是启动时设置原理图背景为白色或者黑色。这个在布局里经常跟个人习惯相关可以这样写envSetVal( viva editGraphicBackground string white )不同版本这个变量名可能不一样在IC6.1.8里我可以确认editGraphicBackground是生效的IC5也就是老的DFWII不一定支持需要大家自己试。3.4 启动时自动记录日志别等崩了才后悔Virtuoso偶尔会崩崩了以后CIW里的log全没了想查为什么崩、之前做了什么操作根本无从下手。在.cdsinit里加一段自动记录日志的代码能帮你省很多事; 把CIW输出保存到log目录 let( (logDir logFile) logDir /home/eda/logs when( !isDir( logDir ) makeDir( logDir ) ) logFile strcat( logDir /virtuoso_ getCurrentTime() .log ) hiSetLogFile( logFile ) )这里用到了makeDir、getCurrentTime、hiSetLogFile这些函数。每次启动生成的日志文件名带上时间戳后续排查问题就很方便。有同事问我这个日志是不是会很大实测下来只要你正常操作一天也就几MB不会撑爆磁盘。但这个习惯真的救过我一次——有一次我的脚本在循环里陷入了死循环CIW刷了上万行报错最后靠日志定位到了那个函数。4. 自己做菜单给Virtuoso加一个自己的专属工具按钮4.1 hiRegMenu把常用操作做成菜单项除了快捷键.cdsinit还能干一件很酷的事往CIW或者编辑器菜单栏里加自定义菜单。最常见的函数是hiRegMenu。比如我想在CIW上加一个“Tools”菜单组里面加一个“Export Screenshot”功能点击后自动截取当前schematic窗口为图片。可以这样写procedure( exportSchematicScreenshot hi let( (win cv) win hiGetCurrentWindow() when( win cv hiGetCurrentCellView( win ) when( cv dbSave( cv ) axiExportPdf( cv schematic.pdf ?replace t ) ) ) ) ) hiRegMenu( CiW myTools (My Tools my tools menu) ) hiAddMenuItem( CiW myTools Export Schematic Screenshot exportSchematicScreenshot() )先定义了一个exportSchematicScreenshot函数然后在CIW菜单栏注册了一个叫myTools的菜单往里加了一个菜单项。点击这个菜单项时会调用exportSchematicScreenshot()这个函数。这里有个经验hiRegMenu的第一个参数是菜单栏ID不同窗口的ID不一样。CIW一般是CiW原理图和版图分别是Schematic和Layout。如果你想在原理图和版图里都加同一个菜单需要给两个窗口都注册一次。还有一个坑是如果你在.cdsinit里每次都注册同一个菜单ID多次启动会重复注册需要先用hiUnregMenu清理一下。我的做法是注册前先判断菜单是否已经存在when( !hiIsMenuRegistered( CiW myTools ) hiRegMenu( CiW myTools (My Tools my tools menu) ) )4.2 自动化套件启动时自动加载PDK和CDF修正很多PDK安装完成后需要在.cdsinit里手动添加一行load()或者loadi()来加载PDK的Skill脚本。比如某些工艺库会提供 $$PDK_ROOT/auto_skill 或类似的初始化脚本。这时候.cdsinit的一个重要作用就是把这些PDK脚本自动load进来。我自己在用的PDK加载配置类似这样let( (pdkInitFile) pdkInitFile /home/eda/pdk/tsmc_180/init/skill/init.il when( isFile( pdkInitFile ) load( pdkInitFile ) ) )这个PDK的init.il会把CDF参数、device模型、Pcell回调函数全部加载好。加载完成后你再打开原理图添加电阻电容时就能看到PDK定义的参数symbol也不会乱套。有一点必须提醒如果在.cdsinit里PDK脚本加载顺序不对后加载的脚本可能会覆盖前一个PDK的配置。尤其是在多个PDK共存的项目里你要对齐加载顺序先加载基础库的显示文件再加载PDK的Skill脚本最后执行你自己的环境设置。否则辛辛苦苦设置的快捷键可能被PDK脚本里的旧设置覆盖掉。4.3 自动修正CDF参数让我少点几百次“电阻显示阻值”回到那个“电阻不显示阻值”的问题。其实电阻的symbol上是否显示阻值很大程度上取决于CDF里的display字段。如果你想批量修复某个库里的器件的CDF显示属性可以在.cdsinit里写一段遍历脚本。这里我给出一个思路procedure( fixCdfDisplay( libName cellName ) let( (cv cdfObj prop) cv dbOpenCellViewByType( libName cellName symbol nil r ) when( cv cdfObj cdfGetCell( list( libName cellName ) ) when( cdfObj prop cdfGetCDFProp( cdfObj resistor ) when( prop prop-display restore cdfUpdateCDF( cdfObj ) ) ) dbClose( cv ) ) ) ) ; 对具体库的电阻symbol执行修复 fixCdfDisplay( myLib rpoly )这段代码写得有点“毛坯”但思路是对的打开symbol cellview获取CDF对象找到resistor这个property把display字段改为restore表示显示然后更新CDF。真正的生产级写法还要处理更多细节比如多个property、多个cell名以及CDF版本兼容问题。但这个例子说明了很多界面操作上的痛点是可以通过.cdsinit里的SKILL脚本批量解决的。5. 仿真环境的自动化从工艺角到PWL波形5.1 用.cdsinit联动ADE设置默认工艺角网上有个热词是“virtuoso中adel仿真如何设置工艺角”。这确实是个非常实际的需求。在ADE包括老款的ADE L和新的ADE Explorer/ADE Assembler里设置工艺角可以在GUI里手动操作但也可以在.cdsinit里写脚本在启动时把需要的工艺角变量准备好或者在打开仿真环境后自动加载一组仿真设置。先说模型库工艺角本质上对应一组模型文件比如TT、SS、FF、SF、FS。在netlist中这些模型由section或者include语句控制。很多PDK在安装后会在.cdsinit里或者在.cdsenv里预设好模型路径。如果你想在启动时自动把工艺角设为TT可以在.cdsinit里写envSetVal( analog-sch modelFiles list( /home/eda/pdk/tsmc_180/models/section.cfg ) ) envSetVal( analog-sch analysisOrder list( dc ac tran ) )envSetVal的第一个参数是工具名可能因为版本不同而不同。实测中在IC6.1.8的ADE L里analog-sch通常是老ADE的环境名在ADE Explorer里可能是adexl。设置modelFiles时路径一定要正确否则仿真一跑就报“Cannot open model file”。还有一种更可靠的方式用OCNOcean脚本。在.cdsinit里可以通过load一个.ocn文件来配置仿真也可以直接用SKILL的ael函数来设置。但我个人不太建议在.cdsinit里写太多仿真配置因为仿真工具初始化比较慢而且不同仿真器的API差异很大。我更推荐的做法是在.cdsinit里只是绑定快捷键或菜单去调用一个预设好的仿真脚本。比如我绑了一个CtrlAltA用来打开我的模板OCN脚本procedure( openMyOcnTemplate hi let( (ocnFile) ocnFile /home/eda/sim_templates/run_tt.ocn when( isFile( ocnFile ) load( ocnFile ) ) ) ) hiSetBindKey( ADE CtrlAltA openMyOcnTemplate() )这样每次需要跑仿真时按一下快捷键工艺角、分析类型、输出表达式全部到位比手动去ADI里翻菜单快得多。5.2 PWL波形文件导入一个常被忽视的小技巧“virtuoso中如何导入pwl波形文件”也是一个高频问题。PWLpiecewise linear波形文件通常用于定义一些不规则的激励信号比如从测试仪器采回的时序数据。在Virtuoso的源里面可以直接用vpwl源然后在它的PWL file里指定文件路径但有些人不知道.cdsinit里也可以预置一些路径变量方便调用。我一般会在.cdsinit里定义一个全局变量指向项目波形文件的根目录; 定义PWL文件根目录 myProjectDataPath /home/eda/data/waveforms然后在设置仿真源时直接引用这个变量比如inst~pwlFile strcat( myProjectDataPath /daq_measure.csv )这个技巧看似简单但能避免你在不同项目之间切换时一遍遍地改路径。另外如果你经常导入PWL建议提前把PWL文件格式整理清楚Virtuoso通常接受两种格式一种是两列时间、幅值一种是带文件头的复杂格式。如果是CSV注意分隔符是逗号还是空格最好统一。实测中如果波形文件第一列是时间但单位不是秒那么源里的Time Scale要做相应设置否则波形时间轴全错。5.3 写一个启动自检函数检查模型文件和库路径在流片项目里最让人崩溃的莫过于启动Virtuoso后因为某个库路径没设对所有cellview都打不开PDK也加载失败。其实这个可以在.cdsinit里做一个自检函数。我写了一个简单的自检检查必需的库和模型文件是否存在如果缺失就弹窗提醒procedure( checkMyEnv hi let( (missingList) missingList () unless( isFile( /home/eda/pdk/tsmc_180/models/section.cfg ) missingList cons( PDK section.cfg missingList ) ) unless( isFile( /home/eda/display.drf ) missingList cons( display.drf missingList ) ) unless( isDir( /home/eda/lib ) missingList cons( lib directory missingList ) ) when( missingList hiDisplayMsg( list( Init warning: missing missingList ) ) ) ) ) ; 启动后延迟执行自检 when( isCallable( checkMyEnv ) checkMyEnv() )这个脚本非常简单但非常实用。它不能修复问题但能在你刚启动时就提示你环境有问题而不是等你打开库、跑仿真时才发现省下的时间是很可观的。启动时CIW会弹出一段“Init warning...”如果你能看到说明环境正常如果看到缺失文件提示赶紧处理别等到仿真失败再来查。6. 常见问题与排查技巧实录6.1 CIW报错“Error”和加载失败如果你在.cdsinit里写错了语法或者调用了不存在的函数启动时CIW会刷出一堆错误。最常见的错误是少括号、函数名拼错、变量类型不对。比如你把hiSetBindKey写成了hiSetBindkey大小写不对CIW会报“undefined function”错误。另一个高频错误是when后面少了一层括号。SKILL的括号规则跟Lisp很像你写的时候一定要数清楚。排查方法很简单启动时CIW窗口会显示Loading cdsinit那一行紧接着如果有错误信息它会用*Error*开头。你就顺着错误信息定位到.cdsinit的哪一行。如果错误信息不够明确可以在.cdsinit里临时加一两行printf打一些调试标记看执行到哪一行挂了。6.2 快捷键不生效大概率是被后面加载的脚本覆盖了我自己遇到过一种典型情况在.cdsinit里绑了F2保存结果PDK脚本加载完后按F2仍然是默认功能或者完全没反应。原因通常是PDK脚本或.cdsenv里的配置加载顺序比你晚把绑定覆盖掉了。解决方法是把自定义快捷键的代码尽量往后放尤其是放在所有load语句之后。另外可以用hiGetBindKey来查一下当前按键到底绑了什么命令hiGetBindKey( Schematic F2 )你可以在CIW窗口手动执行这句看看返回结果。如果返回的不是hiSave()说明确实被覆盖了。这时候要么把绑定优先级提高到PDK之后要么修改PDK脚本里对应的绑定不推荐改PDK升级后会被覆盖。6.3 改了.cdsinit不生效或者“越改越乱”有同事问我为什么改了.cdsinit重启Virtuoso后还是老样子。这个问题九成是因为他改错了文件——他改的是启动目录下的cdsinit而Virtuoso实际读的是$HOME/.cdsinit或者正好相反。前面说过系统加载顺序比较复杂最简单的方法是在CIW里执行getShellEnvVar(HOME)或者直接用findFile(.cdsinit 0)看系统认为的.cdsinit在哪。还有一点Virtuoso的配置有缓存是很正常的。某些环境变量、GUI状态会保存在.cdsenv里即使你删掉.cdsinit里的配置上次保存的状态还会生效。这时候需要清理.cdsenv里的相关项或者在CIW里执行envResetAll()来重置。我踩过一个大坑为了调显示文件我同时在.cdsinit和.cdsenv里都写了display.drf路径结果两个设置互相冲突导致启动时一会儿加载这个一会儿加载那个。后来我把显示文件加载统一放在.cdsinit里.cdsenv里不保存显示路径问题就消失了。6.4 关于电阻不显示阻值的最终排查清单既然这个关键词这么热门我在这里一次性总结一个排查清单方便大家照着查可能原因检查方法解决方式CDF参数中“display”未开启Tools - CDF Edit查看对应property的display列改为restore或displaysymbol引脚名和CDF name不匹配用cdfGetCell查CDF对象修复symbol或CDF显示缓存问题按CtrlShiftR强制重绘绑定重绘快捷键display.drf未正确加载查看层次颜色是否异常在.cdsinit里hiLoadDisplay字体/渲染问题查看label是否显示为乱码调整字体设置或重启如果你所有检查都做了阻值还是不显示那大概率是PDK的symbol本身设计有问题需要在symbol上手动加一个label或者property这个就不是.cdsinit能救的了得改库。6.5 PWL导入常见格式错误和解决方法PWL导入不成功的常见情况如下文件路径带中文或空格Cadence解析不了。时序文件的采样间隔不均匀或时间戳不是单调递增仿真器会报错。文件头有多余的说明文字需要先删掉或者用#注释掉。时间单位与仿真设置不一致比如文件是ns但source的Time Scale没设。这些大多数不是.cdsinit能解决的但你可以提前在.cdsinit里写一个辅助函数检查PWL文件格式。比如读取文件前几行判断是否有非数据行有就报错提示procedure( checkPwlFile( fname ) let( (port line) port infile( fname ) when( port line gets( port ) when( line line car( parseString( line ) ) when( isNumber( line ) ; 判断首行第一个词是不是数字 printf(First line numeric, looks OK.\n) ) ) close( port ) ) ) )这是个玩具级的示例它只能判断首行是不是数字不能完整校验格式但思路是可借鉴的利用.cdsinit启动时加载的工具函数帮你把工程里反复出现的“格式问题”提前挡在门外。7. 一些杂七杂八但很有用的东西7.1 年轻时候踩过的坑路径统一用绝对路径写.cdsinit时很多人习惯用相对路径觉得换个机器也能用。但实际项目中每个工程师的工作目录可能都不一样相对路径经常导致加载失败。我的经验是除非你确定所有机器的工作目录结构一模一样否则一律用绝对路径。如果你担心换机器后路径变更可以在.cdsinit里定义一个路径变量集中修改myRoot /home/eda pdkPath strcat( myRoot /pdk ) scriptPath strcat( myRoot /scripts )这样只改一行其他引用自动生效。7.2 用Git管理你的.cdsinit还有一点我强烈建议把.cdsinit纳入版本管理。每当改了配置导致Virtuoso不正常时可以直接回滚到上一个能用的版本。我自己把所有配置文件.cdsinit、display.drf、.cdsenv模板、自定义Skill脚本都放在一个~/dotcadence/目录下用Git版本管理然后用软链接把它们链到对应位置。这样换新机器时一条命令就能恢复全部环境ln -sf ~/dotcadence/cdsinit ~/.cdsinit ln -sf ~/dotcadence/display.drf ~/display.drf这个思路跟管理dotfiles是一个道理。虽然Cadence的配置体系比Linux shell要复杂不少但基本思想是一样的配置文件也是代码需要用版本管理来保护。最后再分享一个小技巧。每次启动Virtuoso时CIW窗口会显示一堆日志如果你懒得看但又想确认.cdsinit是不是生效了可以在文件最后加一行printf( My cdsinit loaded successfully. Have a nice day!\n)这样CIW里会有一行“ My cdsinit loaded successfully. Have a nice day!”看到这行就说明配置生效了没看到就说明.cdsinit可能没被加载或者中途崩了。这个排查效率非常高比翻错误日志快得多。.cdsinit这个文件说白了就是把你在Virtuoso里重复过无数遍的手工操作固化成一个自动执行的启动脚本。刚开始写可能觉得麻烦但写完之后你会明显感觉到打开Virtuoso的那一刻所有东西都已经按你的习惯准备好了而不是你再花十分钟去一个个设置。工具是死的人是活的磨刀不误砍柴工这功夫值得花。
返回列表