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

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

日志

后仿 SDF 反标

热度 22已有 11098 次阅读| 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,一目了然。

 

5

点赞

刚表态过的朋友 (5 人)

发表评论 评论 (14 个评论)

回复 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这些东西,感谢回复
好,谢谢反馈!

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 222

    粉丝
  • 89

    好友
  • 278

    获赞
  • 269

    评论
  • 2261

    访问数
关闭

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

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

GMT+8, 2024-3-29 14:33 , Processed in 0.018546 second(s), 8 queries , Gzip On, Redis On.

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