cosim_eda软件使用技巧 - minichao9901/technology GitHub Wiki

cosim

  • osc48m可以不用注释, por_dly需要改小(直接到备份库中修改)
  • 实践证明:不要采用修改网表的方式,太麻烦。因为需要经常产生网表,每次生成网表都要去修改,太麻烦了。直接创建库的备份,作为仿真电路。在备份库中修改电路为所期望的即可,快速方便,而且不用注释和修改网表,更容易。
  • 最佳的方式是:第一步先把afe/source注释了,仿真电源部分(包括power_top, vref_tp, vcom等等),这样速度快,快速把各个电源/buf电压弄对,把afe/source的时序配对。第二步,就是把afe/source带进去,再仿真。这样子,基本上一步就搞定。
  • 关于afe的cosim,是最复杂的,它要仿真一个incell流程。可以按照如下流程做,从简化到完整:
  1. 先注释afe/source/gip/ga/dsh等,只仿真电源部分(power_top, vref_tp, vcom)。这样快速把各个电源/buf弄对,把afe/source时序弄对。
  2. 接着把afe/source加进去,其中source的运放部分只保留输出开关,把ls/mux/op注释掉。目的是保持source的全驱。这样把afe的功能仿真出来。
  3. 再接着把gip带上,仿真。这样可以把gip的全驱功能仿真出来。
  4. 最后,把source带上去,由于source规模太大,只需要带一个完整的group就可以了,其余的保持仍然只有输出开关和全驱功能。(可以只在longH模式中验证,不用在longV模式验证)
  5. 这样跑通后,可以仿真longV和longH模式
  6. 注意:tp/drv incell的仿真,必须设置RLINE_VAR=5k, CLINE_VAR=80pF,就是比较真实的Panel电容。否则source op会振荡。
  7. 注意:如果注释掉gip,那么vreftp可能会振荡,要用外挂电容模式。如果加上gip,可以改为零电容模式。这2种模式,配置不同。
  • case总结如下:

case1: 带power_top/gip/vcom/vreftp,注释掉source/afe/vgh/vgl/dsh/gamma等。目标:电源ok,时序ok
case2: 在case1基础上,加afe/source,其中source运放部分只保留输出开关,把ls/mux/op注释掉,目的是保持source的全驱。去掉gip,vreftp用外挂电容模式。afe模式为long_V,目标:afe功能ok
case3: 在case2基础上,带上gip,vreftp用零电容模式(也可以用外挂电容模式)。目标:gip全驱功能ok。到此为止,long_V模式验证ok。
case4:在case3基础上,带上一个group的source op。注意要修改RLINE=5k/CLINE=80pF,不让op振荡。afe模式为long_H,其中source为灰阶渐变。目标:drv/tp切换功能ok。

  • testcase可以自己修改寄存器,如下所示。可以自己定义一个task。 image
  • 需要注意的点:
    1. 去掉$finish
    2. 需要把afe开启的时间往后推一下,让hvsw充分充电
    3. 如果外灌vreftp,需要网表注释vreftp模块,同时force电压
    4. 非常重要的一点:gpio精度要设置为>=4,如果低了spi传输不正常。panel_loading的cap精度要设置为6,如果低了电流不守恒。
    5. 通常情况下, vref_en的使能没有开,要注意检查
    6. 华力55nm工艺的cosim, 需要用xa/vcs都是用2018版本,2017不行
  • 仿真tp/drv切换, xa.ini的配置
set_waveform_option -format fsdb -flush 20u
set_logic_threshold -loth 0.22 -hith 0.88 *
set_sim_case -case lower
set_message_option -limit 1000

set_sim_level 3
set_sim_level 4 -subckt gip_out_top2   #nexchip 90nm,这个不设置高精度,会不收敛。如果收敛没有问题,这个不用设置高。
set_sim_level 4 -subckt gpio_esd_top   #精度设为3, spi写寄存器异常
set_sim_level 5 -subckt tp_top         #afe仿真,精度要提高

# probe_waveform_voltage
# probe_waveform_logic
# probe_waveform_current

set_dc_option -skip_dc 1
set_ccap_level 6 -subckt sd_loading_top   # panel电容是耦合电容阵列,cap精度为5,电荷不守恒,导致结果异常

# force_node_voltage tb_axs15214.u0_0p1_21bc_cosim.vref_tp -voltage 4.0 -time 300u
  • testcase可以自己产生cb值,不用表达式。用表达式太麻烦了。直接用excel表一拖就可以,可以产生需要的576个表达式。简单粗暴。充分用好excel产生表达式,可以节省大量时间。

wv

  • wv -x wave.sx
  • wv可以用dump all_sceens,这个功能非常好用。但是注意,软件有bug,只能dump一次,第二次会fail。除非把波形改变一下,在此dump才会出正常结果。怀疑是cache的问题。

gvim

  • gvim 2个已经打开的file,进行diff:分别在2个文件子窗口中执行diffthis命令,然后就diff出来了。
  • gvim中正则表达式可以使用\v,可以开启非常规正则表达式,这样可以大幅简化vi的正则表达式。例如:可以这样用,/\v\d+, /\v\bOUTP\b,这里\b是单词边界。
  • .vimrc设置
set tabstop=4
set shiftwidth=4
set nowrap
"set autoindent
set backspace=indent,eol,start
syntax on
set nu
set hlsearch       "启用高亮搜索功能,使得在搜索时匹配的文本高亮显示。
set incsearch      "启用递增搜索,随着你输入搜索模式,动态高亮匹配项。

syntax on
colorscheme murphy
set ignorecase
set smartcase
set gdefault

"自动括号补全,推荐
inoremap ( ()<Left>
inoremap { {}<Left>
inoremap [ []<Left>

"显示状态栏,推荐
set laststatus=2

"智能缩进,推荐
filetype plugin indent on

版图操作

  1. 版图有些层次看不到,用快捷键L让它显示出来。例如text层影响看版图,层次默认是隐藏的。用快捷键L让其显示出来,然后让它不显示。
  2. 如何快速的只显示几个金属层?需要灵活使用LSW界面的Used/Routine。例如可以这样操作:选择Used->NV All->选择Route->勾选DM/TM/M4/M3,以及TV/3T/2T等,则可以快速的把金属层显示出来。
  3. 版图mark net的技巧:点9,然后按F3,可以选择某些通孔不连接,这样可以让mark net有选择性的高亮某些层,避免所有的层次都点亮(太复杂,甚至会死机)。
  4. 画path用p键,旋转用鼠标中键,打孔用o键,打pin的label用L键,shift+c切割,shift+m合并
  5. 按shift+左键,点击LSW,可以弹出Display Resource Editor
  6. mark一些nets,然后选择Connectivity->Nets->Save All MarkNets。这个可以用于将指定的线,指定的层数,另存为独立的layout文件(powerline)。例如我们只希望保存power net的M5/TM层,就可以使用。
    存在的问题:默认不会保存孔,导致连接丢失。解决方案:按9点击markNet之前,先按F3弹出markNet option,勾选enable retain via information for saving。
  7. 用drc提取powerline,对于飞线连接的PIN,需要设置DRC setup->options->connect all nets by name
  8. 用drc提取powerline,发现对小模块layout没有问题。对于大模块(包括top)layout,提取出来的powerline丢失了孔(只有少量的孔)。解决方案是:打开DRC setup->options,选择Max Error=All, Max vertices=All
  9. 如何查找label? shift+s打开find界面,选择:

search for=label or text display
text="VSSD"
search hierachy range=current cellview
勾选zoom to figure

电路与仿真

  1. schematic上多根相同的线的写法:<*7>net1 例如<*7>VSSD,VDD表示0x01
  2. 仿真mismatch,电路需要替换为_mis器件:选择find cellview=mos, replace view=mos_mis
  3. spectre也可以用wv产生的pwl文件仿真:simulation files->Pspice files,填入路径即可。
  4. 当corners数比较多时,do_pre_meas产生的结果排版是乱的,并不是perl的问题。原因是gvim的设置问题,需要设置为不换行的模式:set nowrap
  5. virtuoso仿真,小数点特别多,影响观看。如何解决? aelPushSignifDigits(8)
  6. 每次启动,都要手动加载自定义的display.drf文件。如何设置自动加载?需要修改.cdsinit文件,添加如下2句话: ddGetObj("NSC90EP40V") drLoadDrf("display_new.drf")
  7. 仿真目录与激励文件的格式约定: 不同的仿真,用文件目录区分,不用文件名来区分。 引入派生的概念:从一个母类开始,一个新的仿真,从母类下面派生一个(新建一个文件夹)。新建的文件夹名字要有意义,前缀为双下划线__(作为派生的关键词)。例如:
sim_100kHz
  => __with_gck
        => __with_vreftp
              => __debug

每个leaf目录下的基本仿真文件,名字都是最简单的:tran.sp, xa.ini, local.sx等。而且都是一样,不再用比较长的文件名来区分。

仿真testbench搭建与方法的优化思考

  1. 还是要用spectre搭建好testbench,激励加在schematic上
  2. spectre与hspice/xa结合的方法
  3. 用do_sim_gen产生指定模块的全部net名,并print到屏幕上。
  4. ibias+一排Vdc另存为一个schematic,名字为sim_SRC
  5. 将sim_SRC拷贝到testbench电路,并将net名字复制后,一排贴过去,这样一把产生所有的激励。(Create Wire Name->将所有Names贴在Name栏,勾选Attach to multiple Wires,给第一个wire打label,然后鼠标往右拖动,自动会贴第2,3,4,....,直到最后一个。ic61这个功能确实很强大)
  6. 修改激励源为所期望的值
  7. 先进行spectre仿真,优点是直观/图形化。用spectre调好电路的初稿。
  8. 再产生spice网表,用hspice/xa进行仿真,优点是遍历corner方便。目前的do_sim_gen脚本,功能非常强大,支持从spectre抽取激励,并update hspice的仿真激励。

目前的linux系统

图片:eog pdf:evince excel:oocalc

Innovus

1)如何启动Innovus
在terminal中输入:Innovus,即可启动,进入交互式命令。在这个交互式命令行中,也可以使用普通的shell命令,例如ls, pwd, cd, gvim等等。
如果希望指定log和cmd的位置,可以这样输入:
innovus -cmd log/1.cmd -log log/1.log
2)如何跑APR?
假设有一个apr_run的脚本,那么执行
innovus 14> source apr_run
即可开始跑APR
3)已经跑出结果了,如何读入design?
DB目录下存放了很多***.enc文件,分别对应各个阶段的enc文件。用source命令读入design。
innovus 14> source DB/xxx_digital_00_init_v1.enc
4)如何调出Innovus图形界面?
innovus 14 > win
5) Innovus图形界面的基本操作:
打开Design Browser,可以看到各个模块。各个模块的LeafCells也显示出来了。点击一个模块,就会在APR窗口中显示这个模块的LeafCells的分布,用红色的显示。
为了更方便看,我们会在Physical View窗口中,把所有的Metal层隐藏掉。
如果不想看PIN,那就把Miscellaneous隐藏掉。
在Physical View中,有Congestion的框,可以勾选,看到Congestion的分布情况。
6)时序
Hold mode all reg2reg reg2cgate default
WNS(ns) -60 -0.252 -60 -5.9
TNS(ns) -846 -411 -376 -58
Violating Paths 7132 7068 54 10
All Paths 1.98e+05 1.43e+05 3940 1.01e+05
Hold mode:

  • all:对所有路径进行hold检查
  • reg2reg:仅对寄存器到寄存器路径检查hold
  • reg2cgate:对寄存器到时钟门路径检查hold
  • default:使用默认hold模式

主要时序指标:

  • WNS(Worst Negative Slack):最差违规时序间隙
  • TNS(Total Negative Slack):全部违规时序间隙之和
  • Violating Paths:违规路径数量
  • All Paths:全部时序路径数量

从中可以看出:

  1. default模式下时序最好,没有hold违规。
  2. all模式下违规最严重,需要优化所有hold。
  3. reg2reg模式仅检查寄存器间时序,hold效果次之。
  4. reg2cgate模式仅验证了部分关键路径,hold效果最差。

在时序分析报告中,WNS(Worst Negative Slack)表示最差的负时序间隙,它反映了设计中时序约束满足程度的最坏情况。WNS的具体物理含义是: 它表示设计中所有时序路径中,负时序间隙最大的那一条路径的间隙值。 时序间隙(Slack)定义为数据路径延迟和时序约束之间的时间差。 当Slack<0时,表示延迟超出了时序约束要求,出现了时序违规。 WNS是所有负Slack中最小的那个值,即最严重的时序违规情况。 WNS越小,表示时序越难以满足,设计越有可能无法达到时序要求。 如果WNS是负值,说明存在无法满足时序约束的路径,需要优化。 如果WNS>=0,说明时序约束可以满足,时序闭环。 所以WNS直接反映了设计中“最紧凑”的时序情况,它必须优化到正值,才能保证时序正确。它是评估整体时序质量的一个非常重要的指标。

⚠️ **GitHub.com Fallback** ⚠️