亲测Cadence IC618以及ICADVM20.1, 遭遇过Spectre仿真运行无法进行、手动对PDK参数进行设置极为繁杂的状况, 新手依照步骤逐一去操作, 便能够轻松躲开此类常见问题。 如何……
亲测Cadence IC618以及ICADVM20.1, 遭遇过Spectre仿真运行无法进行、手动对PDK参数进行设置极为繁杂的状况, 新手依照步骤逐一去操作, 便能够轻松躲开此类常见问题。
如何用Ocean脚本提速仿真流程
手动去点开ADE L或者ADE Explorer来对于仿真参数进行设置, 一整个晚上要去调整几十个case, 手都能够被点得麻木了。实际上Cadence自己所带的Ocean脚本语言, 完全是可以将重复的劳动通过一键的方式进行打包的。
操作步骤一:创建并运行基础Ocean脚本
于CIW窗口之中, 于终端范围以内, 借助文本编辑器, 去创建一个run_sim.ocn, 来写下第一段核心命令。
simulator( 'spectre )
design( "./netlist" )
resultsDir( "./sim_results" )
modelFile( '("/mos_tt.scs") )
analysis( 'tran ?stop "1u" )
run()
写完并保存之后, 于终端执行 ocean -restore run_sim.ocn , Cadence 会自行加载网表, 调用 Spectre 跑完瞬态仿真 , 同时把对应的结果存放到指定的文件夹之中。
【新手避坑】
许多新手在这一步出现报错, 报错内容为Error can’t open file, 出现该报错的缘由是, design()里所填写的网表路径被写成了相对路径, 然而, 当前的工作目录并非放置网表的那个文件夹。解决之道为: 于运行脚本之前, 借由cd(“你的工作目录”)强制性地进行切换, 或者径直于脚本起始之处写定绝对路径。
操作步骤二:参数扫描与结果自动提取
将电阻值手动进行修改去跑为期100次的仿真, 把它改用foreach循环并借助printf来打印结果, 使整个过程实现全程自动化。
desVar( "rload" 1k )
foreach( rVal '(1k 2k 5k 10k)
desVar( "rload" rVal )
run()
selectResult( 'tran )
plot( v("/vout") )
printf("R=%d Ohm, Vout_last=%f Vn" rVal value(v("/vout") 1e-6) )
)
这段让rload自动从1k变到10k的脚本, 每当跑完一次, 都是去提取1us时的输出电压, 然后直接打印到终端。既不需要手动改参数, 也不需要手动点波形计算器。
【新手避坑】
出现报错 Error value: argument must be waveform object,这是由于你运用 value() 命令提取的数据点时间, 并未处于仿真时间范围之内, 举例来说, 当 tran 仅运行至 0.5us 时, 你却提取了 1us 时刻的数据。先去跑一回仿真, 借助getData()来查看仿真结束之时的时间, 要确保提取得来的时间是小于或者等于stop这个值的。
操作步骤三:集成参数扫描与Corner批量跑
对于配合analysis以及modelFile来实施切换不同Corner , 存在着一条脚本能够达成全工艺角仿真的情况。
foreach( corner '( "tt" "ss" "ff" )
modelFile( list( sprintf(nil "./models/mos_%s.scs" corner) ) )
desVar( "rload" 5k )
run()
printf("Corner: %s 完成n" corner)
)
每条Corner, 一键完成跑完, 各自的结果, 独立存储, 分别存入SIM_RESULTS_TT、SIM_RESULTS_SS、SIM_RESULTS_FF。
【新手避坑】
切换Corner时没清空前一次结果,导致新结果覆盖旧数据。在run()之前, 添加deleteAllResults() , 或者, 针对每个Corner, 指定不同的resultsDir, 例如, resultsDir(sprintf(nil”./results_’Corner'”))。
如何用参数扫描优化电路性能
要动手去修改参数, 然后重新运行, 看一看波形情况, 接着再去更改参数, 如此这般效率是极低的。Cadence具备的Parametric Analysis功能能够将这件事情转变为只需一键就可以完成!
操作步骤四:配置Parametric Analysis扫描
于ADE L仿真界面当中, 点击菜单Tools, 接着选择Parametric Analysis, 于弹窗之内点击Setup之处, 然后选取Add, 填入变量名rload, 将扫描类型选定为Linear Step, 范围是从1k至10k, 步长为1k。
按压绿色的运行按钮, 四个核心同时进行运作, 原本十次扫描需要耗费十分钟的时间, 而现在用时二分半就能够完成句号。
【新手避坑】
并行跑步的时候偶尔会出现报错提示 Error segmentation fault, 较为常见的缘由是 Spectre 多线程的模式跟系统虚拟内存产生了冲突。其解决办法有: 将 Run in parallel 去除掉, 更改回单线程排他性运行;或者是把扫描的点数降低到 5 个以下, 接着再配合手动分作两批来运行。
参数最优推荐值
在低功耗运放设计当中, Miller补偿电容所推荐的取值是1.5pF , 原因在于, 倘若电容过小比如5pF , 那么便会极为严重地压低单位增益带宽,进而牺牲掉动态性能 , 而1.5pF在0.18um工艺条件下能够平衡稳定性以及带宽, 使得相位裕度稳定处于60至70度之间。
两种实操方案对比
| 方案 | 操作路径 | 适用场景 |
|---|---|---|
| Ocean脚本全自动 | 终端执行ocean -restore run.ocn |
批量跑100+次仿真、需要版本控制、自动化回归 |
| 图形化Parametric Analysis | ADE L → Tools → Parametric Analysis | 临时调几个参数、新手快速看趋势、不需要记录历史 |
要是你的项目存在需要持续不断地进行迭代以及团队之间相互协作的这种情况, 那么就选择Ocean脚本;要是仅仅只是一个人去调试两三个起到关键作用的电阻, 那么点击Parametric Analysis会更快捷一些。
一个高频完整报错
报错的情况呈现为 , 在运行Parametric Analysis这个操作期间 , Spectre忽然出现卡死的状况 , 而终端那里输出的是“FATAL: Too many open files”这样的内容。
核心缘由在于, 存在一种状况, 是这样子的, 系统针对单个进程能够打开的文件数量存有一定的限制, 而Cadence在利用并行来运行多个Corner的时候, 会同时去打开大量的模型文件以及输出文件, 紧接着如此一来, 就超越了系统预设 默认的那个一千零二十四的上限范围了。
一站式解决流程:
1. 把终端开启, 键入ulimit -n, 对当下的上限予以查看。
2. 倘若出现1024这样的显示情况, 那就使用ulimit -n 4096来临时性地提升至4096, 此操作只是在仅仅当前的终端才会发挥效力, 是这样的。
3. 要是期望达成永久生效的情况, 就要对~/.bashrc进行编辑, 往其中添加上一行ulimit -n 4096,接着再执行source~/.bashrc。
4. 要是依旧出现报错情况, 那就去查看模型文件路径之中是不是存在中文或者空格现象, Cadence对于路径字符是很敏感的, 必须将其全都转变为英文字母再加上下划线。
Cadence IC617以及比它更早旧的版本, 并不适配这个方法, 缘由在于旧版本的Spectre不支持并行参数扫描, 要是强行开启的话, 反倒会致使内核崩溃。要是你仍旧在使IC617, 建议手动分批次去运行, 每次仅仅运行两个Corner, 又或者升级到IC618以上的版本。替代的方案是运用Cadence的ahdl库自身携带的param元件, 在网表里撰写循环进行运行, 然而配置更为繁杂, 对于新手而言优先升级工具版本会更妥当。
微信扫一扫
还没有评论呢,快来抢沙发~