DFT gatesim 心得

最近在忙dft 后仿真的事情。这里就简单写一写。工具vcs tessent

dft前仿真完成后会release给后端dft netlist以及 scan chain def。 pr过程中会吃入scan chain def 然后在pr place 阶段会做scan chain reorder 针对pr place 摆放的位置和scan chain def 的信息重新连接scan chain的一些线。 (并不是scan chain 上的所有cell都可以reorder 只有某些可以,具体可以打开scan chain def 根据语法说明研究)。
经过pr 和timing eco 后 pr&timing eco engineer 会提供反标的sdf 给 dft 做后仿真。
其中sdf 是根据corner 来的。
比如我的sdc mode scan_shift , scan_ac, scan_sa, mbist 四种mode
然后为了仿真的corner减少。针对pvt 只选取极端的情况比如。
ss_m40_rc_worst ff_125c_rc_best 。 (ss,差process, m40, f125 两种极端温度, rc best worst)
这样就有了4x2 =8种 corner 每一种都有对应的sdf 。都要做仿真。
举例
比如你有一个scan_sa case前仿真只有一个,后仿真就变成了对应 scan_sa_ss_m40_rc_worst.sdf
scan_sa_ff_125c_rc_best.sdf 要做两次仿真
比如你有 mbist case ,后仿真就是 mbist_ss_m40_rc_worst.sdf mbist_ff_125c_rc_best.sdf

然后sdf 里面会有6个值 xxx (x:x:x) (x:x:x) 前一个括号代表上升,后一个括号代表下降 (x,x,x )
代表 min,typ, max 。 一般只有min ,max值这和pr的 view/scenario 设置有关系。

然后在gate_sim 仿真的时候vcs option +mindelays +maxdelays 分别吃sdf里面的min max value。 所以要在ss_m40_rc_worst +maxdelays ff_125c_rc_best +mindelays 来取极值仿真。
除此之外一定要确定$sdf_annotate 函数吃对了sdf

另外就是比较有用的选项我经常用的

+sdfverbose >> 能查看sdf映射情况。 在debug情况下会用到。
+no_tchk_msg >> 打开后就不会看到仿真中timing violation 的详细信息。这样会减小log。提高run速度。 正常跑时候打开。debug去掉
+nospecify >> 忽略互联和cell内部延时, 我不经常用
+notimingcheck >> 忽略cell check value,我不经常用

+no_notifier >> 打开后当产生violation 时不会出现X 态。 当后仿不过我经常开着这个去掉 +no_tchk_msg 跑。如果跑过是后仿延时的问题。 跑不过就不是延时问题,就麻烦了。
然后可以看到log很多timing violation信息可以用来详细debug

有时候在功能后仿的时候+no_notifier 根据log 的violation信息就能debug出来一些timing问题,在仿真没有跑完的情况下。

+optconfigfile+ xxx/.cfg >> 经常用去遮掉一些不需要修timing的部分。 某些地方timing是不需要修的。但是不修后仿会出现violation导致x 导致仿真错。 所以需要加这个遮掉不需要修timing的部分。

cfg 文件里是这样
instace {xxx.xxx.xx.xx} {noTiming};

====================
下来我们回到之前。

拿到后仿的网表和sdf可不可以直接开始后仿呢? 答案是不行的。 因为前面说了pr过程中会做scan chain
reorder
所以后防前要重新用网表做 atpg (重新产生scan_sa scan_sa scan_shift pattern)
mbist pattern不需要重新做。

同样当后仿阶段,如果设计工程师发现了后仿功能问题,做了ECO (同样需要重新跑atpg 产生pattern)

atpg 用到的tsdb就是你前仿时候tessent dft 产生的tsdb

然后如果是mbist 需要关掉occ里面的一些ntc的ff。这是tessent产生的告诉你某些ff不需要修timing。所以你要no timing掉。除此之外还有Mbist的相关逻辑的ntc ff。
关键字是用tessent打开网表然后用下面的可以打印到一个文件里
foreach_in_collection i [get_instance * -hierarchical -filter "name =~ occ_control && name =~ *tessent_persistent_cell_ltest_ntc_syn_cell * && name =~ ntc_retiming && cell_type == dff " ] {
set a [get_attribute_value_list $i -name name]
echo “instance {$a} {noTiming};” >> mbist.ntc.cfg}

foreach_in_collection i [get_instance * -hierarchical -filter “name =~ ntc_ret && (name =~ mbist || name =~ MBIST)” ] {
set a [get_attribute_value_list $i -name name]
echo “instance {$a} {noTiming};” >> mbist.ntc.cfg}

然后用sed处理 sed -i 's///./g/ mbist.ntc.cfg 替换/为.
把这个tmp.ntc.cfg 在mbist 仿真+optconfigfile+ 后面加上

当scan 相关的仿真 scan_ac scan_sa scan_shift 时候 需要关掉occ里面的一些ntc的ff。这是tessent产生的告诉你某些ff不需要修timing。所以你要no timing掉。 (注意不能关 mbist相关的ff。这些很可能穿到了链上在scan时候不要关)

foreach_in_collection i [get_instance * -hierarchical -filter "name =~ occ_control && name =~ *tessent_persistent_cell_ltest_ntc_syn_cell * && name =~ ntc_retiming && cell_type == dff " ] {
set a [get_attribute_value_list $i -name name]
echo “instance {$a} {noTiming};” >> tmp.ntc.cfg}

然后开始仿真吧。
当出现Mismatch Error等关键字在log你就需要debug下到底哪里出问题了。
然后scan时候先跑parrallel 再跑serial , serial 跑的慢。也没法debug 所已先清掉parallel.

最后祝仿真成功。

1 个赞