jake的个人空间 https://blog.eetop.cn/1592 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

后仿 SDF 反标

热度 25已有 13651 次阅读| 2021-2-26 08:57 |系统分类:芯片设计

如果激励 (stimulus) 正确,SDF 反标后仿 (SDF back annotated gate level simulation) 大概是最接近实际的仿真了。即使跑得慢,还是应该尽可能在各个 corner 下把所有的 test case 都跑一遍。

SDF 反标可以通过 verilog task $sdf_annotate 实现。$sdf_annotate Verilog 标准的一部分,具体细节可以在 Verilog LRM (language reference manual) 里找到。$sdf_annotate可以直接在 test bench 里加上。下面是我自己常用的代码。

`ifdef GLS_SDF

   initial begin

`ifdef SDF_MAX

      $display("Performing SDF_MAX back annotation for adc_dig ...");

      $sdf_annotate("/home/project/digital/adc_dig/pd/EXPORT/SDF/adc_dig_func_max.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_max.log", "MAXIMUM");

`elsif SDF_MIN

      $display("Performing SDF_MIN back annotation for adc_counter, adc_dig ...");

      $sdf_annotate("/home/project/digital/adc_dig/pd_1p2v/EXPORT/SDF/adc_dig_func_min.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_min.log", "MINIMUM");

`elsif SDF_TYP

      $display("Performing SDF_TYP back annotation for adc_counter, adc_dig ...");

      $sdf_annotate("/home/project/digital/adc_dig/pd/EXPORT/SDF/adc_dig_func_typ.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_typ.log", "TYPICAL");

`else

      $display("\nINFO: No SDF back annotation for adc_counter, adc_dig ...");

`endif  

   end

`endif

 

Cadence 仿真工具为例,跑后仿的时候,在 irun/xrun 命令行加上 -DEFINE GLS_SDF -DEFINE SDF_MAX, 仿真工具就可以编译上面这段代码并进行反标。 这里 -DEFINE SDF_MAX 选择的是 worst case corner

这里需要注意两点。

-        SDF 文件的路径。如有疑问,用完整路径。

-        待反标模块在 test bench 中的 hierarchy。上面这个例子里 u_adc_dig 模块直接在 test bench 里例化 (instantiate)。很多时候会在下面几层,路径会长一些。

 

仿真启动后应该查一下 log,找到类似下面这段。这里的 % 很重要,代表了 SDF 反标的成功率。通常都应该在 95% 以上。如果低了,就应该查一下是哪里出错。通常是 hierarchy 没对上,或是电路中其他模块是网表,test bench却没有加上 SDF 反标文件。

          Annotation completed successfully...

          SDF statistics:

                     No. of Pathdelays = 10133     No. of Disabled Pathdelays = 0        Annotated = 97.88% (9918/10133)

                     No. of Tchecks    = 5292      No. of Disabled Tchecks    = 1524     Annotated = 92.36% (3480/3768)

                                                Total(T)       Disabled(D)          Annotated(A)      Percentage(A/(T-D))

                     Path Delays                 10133                   0                    9918                   97.88

                          $width                  2531                 762                    1737                   98.19

                         $recrem                   831                 254                     577                  100.00

                      $setuphold                  1930                 508                    1166                   82.00

 

上面这个例子里 $setuphold 反标成功率比较低,原因是设计中同步电路第一级的被禁止做 timing check 了,是有意这样做的。同步器第一级不做 timing check,避免了同步器输出 X

 

Cadence irun/xrun 有个命令行开关,可以很方便地报告哪些部分反标不成功。在 irun/xrun 命令行加上 -sdf_stats sdfstats.log,在文本编辑器中看一下 sdfstats.log,一目了然。

 

7

点赞

刚表态过的朋友 (7 人)

发表评论 评论 (22 个评论)

回复 anpengfei 2021-3-11 15:47
请问,ss、ff、tt的coner各自都反标min|max|typ哪个delay?
回复 jake 2021-3-11 21:44
anpengfei: 请问,ss、ff、tt的coner各自都反标min|max|typ哪个delay?
ss -- max
tt -- typ
ff -- min
回复 anpengfei 2021-3-12 09:27
嗯晓得啦谢谢
回复 Anubis_lsljj 2021-3-15 15:15
谢谢作者分享。我原来只知道用好像是 -SDF_VERBOSE去看详细的log。以后可以试试 -sdf_stats。
回复 Lover_Momo 2021-3-21 19:31
请教两个问题:
1. 数字后端在做的时候,特别是先进工艺制成,无法做到所有的Corner都setup/hold clean(一(一般Sign-off只要求某些Corner setup clean, 某些corner hold clean),那么在后仿的时候是如何处理的?SDF一般只能一次分析一个吧,如果看的Corner是setup clean但是hold 未clean的,在Sign-Off是合理的,但是后仿如何处理不清楚了。
2. PrimeTime在出SDF的时候,不会出三个值(x:x:x),好像只会出两个值(X::X),并且这两个值都是相等的,这个时候在后仿真的时候如何来用?
回复 jake 2021-3-22 11:03
Lover_Momo: 请教两个问题:
1. 数字后端在做的时候,特别是先进工艺制成,无法做到所有的Corner都setup/hold clean(一(一般Sign-off只要求某些Corner setup clean, 某些co ...
1. 通常是 P&R 的时候只看 2, 3 个 corner, 但是加 margin。 在 STA 的时候减小 margin, 每一个 corner 都查。 如果有 violation,再回到 P&R 里修补。 通常先保证 setup 都过,且有足够 margin。 STA 只有少许 hold violation, 这样修起来就比较有把握了。 我前一家公司 STA 通常要查 9, 10 个 corner,与 wafer test/ATPG 相关的 corner 允许降频。 每个 corner 都要 pass, 否则不 tape out。 我的观察是设计里时钟处理不好,会造成 functional setup 和 scan hold 无法同时修复, 或是反之。 修改 RTL,或是 scan segment 上做些特殊处理,通常可以最后 clean。 也有 RTL 做得不好,最后始终无法修复的。换人推倒重来。
2. 如您所说,STA 是 single corner 一个个跑的,生成的 SDF 也是 (X::X),两个值相同。 后仿的时候也是一个一个 corner 跑,每次读入不同的 SDF 文件,$sdf_annotate 都取 maximum 就可以了。 后仿通常不会有问题,因为仿真不需要 margin, 没有 pessimism, 完全按照实际的 timing 来,应该都是过的。
我在前一家公司用过的最好的工艺是 45nm, 跟14nm, 22nm signoff 可能还是有差距的。
回复 李九阳 2021-7-13 16:29
请教下,“同步器第一级不做 timing check”,这个要怎么做呢?sdf反标语法中支持哪些cell不做检查么?
回复 jake 2021-7-13 21:05
李九阳: 请教下,“同步器第一级不做 timing check”,这个要怎么做呢?sdf反标语法中支持哪些cell不做检查么?
方法一: 写个脚本,把同步器第一级的SETUPHOLD(或SETUP,HOLD)全部改成(0:0:0)。

方法二:使用仿真器提供的选项,如Cadence Xcelium xrun, irun有-tfile选项,用户可以提供一个文件,告诉xrun/irun哪些instance不做timing check。
回复 lazioprocn 2022-1-22 19:29
学习了
回复 martin21 2023-8-19 16:55
学习了,不错
回复 涟漪~ 2024-1-3 16:49
请教一下这样标出来,Pathdelays 反标率100%,Tchecks反标率38%,width和removal完全没反标成功,这大概是什么问题啊
回复 jake 2024-1-4 00:30
涟漪~: 请教一下这样标出来,Pathdelays 反标率100%,Tchecks反标率38%,width和removal完全没反标成功,这大概是什么问题啊
Tchecks, width, recrem太低了。我会先打开标准元.v文件,仔细看一下DFF的模型,看看是不是模型里有什么define之类的在仿真器命令行没有定义
回复 涟漪~ 2024-1-5 17:38
jake: Tchecks, width, recrem太低了。我会先打开标准元.v文件,仔细看一下DFF的模型,看看是不是模型里有什么define之类的在仿真器命令行没有定义 ...
破案了,是icc版本太低,导不出width这些东西,感谢回复
回复 jake 2024-1-5 23:00
涟漪~: 破案了,是icc版本太低,导不出width这些东西,感谢回复
好,谢谢反馈!
回复 njupt_nzt 2024-6-19 10:06
请问一下我在vcs的dve运行命令行输入-DEFINE GLS_SDF -DEFINE SDF_MAX,但是它提示我unknown option '-DEFINE GLS_SDF -DEFINE SDF_MAX',这是什么问题
回复 jake 2024-6-19 20:51
njupt_nzt: 请问一下我在vcs的dve运行命令行输入-DEFINE GLS_SDF -DEFINE SDF_MAX,但是它提示我unknown option '-DEFINE GLS_SDF -DEFINE SDF_MAX',这是什么问题 ...
Please try +define+GLS_SDF +define+SDF_MAX.  I don't use VCS, cannot be 100% sure
回复 ldjiang 2024-6-24 17:22
您好,我刚刚开始学习数字电路后端仿真,使用nclaunch进行仿真模拟尝试观察延迟时,我发现加入了sdf文件后Tchecks始终为0,原始sdf文件是用write_sdf -edges noedge -version 2.1 xx.sdf在encounter软件里生成的。nclaunch提供的ncelab.log文件并没有详细说明具体的sdf反标信息,我无法排查问题出在了哪里,但实际sdf文件里是存在延时信息的。想请教一下博主应该怎么做。好像irun/xrun也找不到博主所说的-sdf_stats命令
以及Tchecks=0这个问题不消除会对最后的流片结果有影响嘛
回复 ldjiang 2024-6-24 17:25
在生成sdf文件是有类似的提示信息**DIAG[/icd/cm_t1nb_003/EDI142/Rel/14.21/main/lnx86_64_opt/14.21-s062_1/include/dbDRArray.h:158:addNewPage]: The master object on page 3 does not exist. So dense annotaton can not be added yet.
但好像并不是报错。反标不上会和这个有关系嘛。
回复 jake 2024-6-25 10:26
ldjiang: 您好,我刚刚开始学习数字电路后端仿真,使用nclaunch进行仿真模拟尝试观察延迟时,我发现加入了sdf文件后Tchecks始终为0,原始sdf文件是用write_sdf -edges noe ...
write_sdf -target_application verilog -view bc_or_wc_view my.sdf
encounter太老了,可能不支持-view,今早换Innovus吧。
直接用irun或xrun -sdf_verbose -sdfstats sdfstats.txt 。。。跑起来后查一下irun.log或xrun.log,sdf_max.log或sdf_min.log,sdfstats.txt,也许你的版本比较老,不支持-sdfstats
回复 ldjiang 2024-6-25 12:22
jake: write_sdf -target_application verilog -view bc_or_wc_view my.sdf
encounter太老了,可能不支持-view,今早换Innovus吧。
直接用irun或xrun -sdf_verbose -sd ...
十分感谢贴主的回复!我还想请问一下就是Path of dealys=100%,但是Tchecks始终为0,观察到sdf文件里也有延时标注,这种情况导致波形无法观察到延迟会导致最后流片的测试结果出问题嘛。我不是太清楚这一点
12下一页

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 10

    月排名
  • 0

    总排名
  • 1

    关注
  • 273

    粉丝
  • 96

    好友
  • 348

    获赞
  • 294

    评论
  • 2551

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 18:50 , Processed in 0.013626 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部