门仿真及基于 VCS 的门仿流程、Debug 方法介绍

本文详细介绍了门级仿真在芯片设计验证中的作用,包括前仿真和后仿真的区别,门仿的目的,以及门仿的内容和步骤。门仿用于检查网表正确性、时序信息的反标和时序验证,对于复杂芯片设计至关重要,可以发现潜在错误并进行调试。文章还讨论了如何选择门仿级别和案例,以及门仿的调试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



🔥点击查看精选 IC 技能树系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥


📢 声明

  • 🥭 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/129427769】。
  • ⚠️ 本文目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • 📧 邮箱:mangopapa@yeah.net
  • 💬 直达博主:loveic_lovelife(搜索或点击扫码)




1. 门仿是什么?


  依据进行仿真的时间先后,芯片仿真分为前仿真和后仿真,而门仿是采用门级网表进行的仿真。三者简介如下:

  • 前仿真是功能仿真,仿真时采用 RTL 且不添加时序信息,默认采用不含时延的理想器件,仅对代码的功能进行验证。
  • 后仿真是时序仿真,仿真时采用 DC 综合及布局布线(P&R)之后的门级网表(Netlist)且添加时序信息,是一种有延时情况下的仿真,主要对物理电路实现的时序进行验证,检查建立时间和保持时间(Setup/Hold Time)是否满足工艺需求、是否有时序违例(Timing Violation),是一种带时序反标的门级仿真(Gate Level Simulation, GLS, 门仿)。
  • 门仿真可以分为不带 SDF 的零延时仿真(Zero-Delay Simulation)和带 SDF反标(Back Annotates)的时序仿真(Timing Simulation)。采用 DC 综合后的网表不作 SDF 反标的零延时仿真是一种前仿真,网表反标 SDF (Standard Delay Format) 的仿真是后仿真。

  网表:RTL 进行 DC 综合和布局布线之后都能得到门级网表,DC 综合之后的网表不带时钟树,P&R 之后的网表带有时钟树。两者之和才算是真正的网表文件。之所以叫门级网表,是因为网表里只有与或非门,没有 RTL 中的 if/case 等判断分支逻辑。

  时序信息:真实情况下采用的器件本身、传输线上都会存在时延,不同工艺、场景下时延也不同。时序信息保存在 SDF 文件中,不同 Corner 对应不同的 SDF,仿真时将其反标到网表文件中。



2. 为何需要门仿?


  鉴于有等效性检查 (Logic Equivalence Check, LEC) 及 静态时序分析 (Static Timing Analysis, STA) 工具来保证 RTL 和网表的一致性及 Timing 收敛,且门仿极其耗费资源、Case 运行时间长、很少在门仿时发现问题,很多小公司在 Schedule 紧张的情况下不做后仿。然而,门仿还是极其重要的,尤其对于较大规模的复杂芯片设计,不做门仿会使芯片面临较大风险。

  关于门仿的重要性,以下两篇文章翻译挺好:


  门仿的优势大概体现在以下几点:

  • 能够检查网表的完备性,防止 P&R 过程中的意外,比如 Macro 使用不正确导致 RTL 与 Netlist 逻辑不一致(尤其是对第三方 IP 而言)。
  • 能够发现被 BFM (Bus Function Model) 或 Behavior Model 掩盖掉的错误。
  • 能够实现大型复杂设计的 100% 等效验证,且能验证 Aborted Points (Formal 验证难以达到 100% 等效验证,且无法验证 Aborted Points)。
  • 能够对系统初始化及复位时序进行较为准确的验证,发现可能存在的 removal 或 recovery 错误。
  • 具备 Scan Chain,能够对 ATPT Pattern 进行仿真,进行 BIST、BISR、DFT 验证。
  • 能够检查 SDC 的完备性,防止遗漏相关约束。
  • 能够检查异步电路时序,这是 STA 无法做到的。
  • 能够进行精确的低功耗验证,为后续 Power 分析提供更准确的波形,生成 IR Drop 所需的 VCD 文件。


3. 门仿要验什么?


  简而言之,门仿真要确认 Netlist 正确、SDF 能够反标到 Netlist 上且反标率达标、没有预期之外的 Timing Violation。其中 Zero-Delay 仿真只需确认 netlist 正确。

  由于 MOS 性能受 PVT 影响,后端往往会给出多个 Corner 下的 SDF。理论上,五种 Corner (SS, FF, SF, FS, TT)的 SDF 都要时序仿真测一遍,至少 TT 应该测一遍


3.1 怎么选门仿 Level?

  对于 IP、Subsys、SoC 这三个 Level,大部分是进行 Subsys Level 的门仿。SoC GLS 极其耗时,IP GLS 意义有限。当然,对于 CPU 等较大的 IP,若需要分析其功耗,也常常需要进行 IP Level 的门仿。


3.2 怎么选门仿 Case?

  一般不会针对门仿新造 Case,而是采用原有的 Case 进行门仿。相较于 RTL 仿真,门仿跑的很慢,重点关注的是 Timing,且门仿离 TO 时间很近,需要综合考量 Schedule 及 Server 等资源来挑选需要门仿的 Case。

  门仿 Case 挑选的大原则为 Case 尽量短,能够覆盖关键 Datapath 及高风险区域,且 RTL 仿真能够 Pass。在以上原则的基础上,门仿 Case 需要覆盖以下几点:

  • 完整的 Clock、Reset 初始化配置流程,Bootrom 最好也测一测
  • 各个 Clock 频点、Power ON/OFF
  • 寄存器访问
  • 主要工作模式、典型功能
  • 关键路径、异步路径、外部接口、数据流
  • Mbist 等等
  • ……


4. 门仿怎么仿?


  大的 GLS Flow 为先做 Zero-Delay Simulation,再做 Timing Simulation

  如前文所述,门仿包括带 SDF 反标和不带 SDF 反标两种。不带 SDF 反标的是一种采用 Netlist 进行的零延时前仿真,仿真速度快,通常用以在采用 SDF 反标进行后仿之前 Try GLS Flow,确保 Netlist 的正确性。确保 Netlist 无误后,将 SDF 反标到设计文件中,以在设计文件中添加或修改延时值,进行时序仿真。

  SDF 反标有两种方法,一种作为编译 Elaboration 的选项,另一种是在 tb 中调用系统函数 $sdf_annotate(),其中第二种较为常见。具体用法我们下文会提到。


4.1 门仿详细步骤

  门仿真步骤大致如下:

  1. 文件准备:找后端要 netlist、sdf、lib 及 false patch 文件及无复位寄存器
    • netlist 是必须要的
    • 做 Zero-Delay GLS 可以先不要 sdf
    • lib 是指 netlist 中所需的与或非 cell 器件库
    • false_path 文件包含了不需要时序检查的异步路径
    • 上电后无复位寄存器 Q 端不确定,为防止 X 传播需要赋初值

  2. DV 准备 GLS 环境
    • filelist 中添加 cell lib
    • filelist 中的 RTL 换为 netlist
    • 采用 $deposit(path, value) 给所有无复位寄存器赋初值,一般单独出个 DV 维护的deposit 文件,也可以直 接在 cell 库文件中赋初值。
    • TB 的 `timescale 需要满足 SDF 要求的时间精度
    • TB、case 中的直接操作或观测的信号 hierarchy、信号名改为与 netlist 中相同的 hierarchy 与信号名(写 Case 时不建议 force wire)
    • 对于非 DFT 测试的 case,不能释放 DFT reset,确保 DUT 工作在 function mode 下,DUT top 上 DFT 相关接口赋初值(一般 assign 0)防止 X/Z 传播。
    • 对于不带 SDF 反标的门仿,查找 TB 中 clock、reset generation block,将其 output clock 及 reset 初值设为零,并 force 相关选择信号,以消除不定态。
    • 对于带 SDF 反标的门仿,需要将 SDF 反标到设计文件。有两种反标方法:
      • 采用 $sdf_annotate() 系统函数将 sdf 反标到 netlist,一般在 tb top 的 initial 块中。若有多个 sdf,每个 sdf 都需要进行反标。max/typ/min 不同情况下用的 sdf 文件也不同,建议用 macro 隔开。$sdf_annotate() 函数格式如下所示:

         `ifdef SDF
           $sdf_annotate(“sdf_file”[,module_instance][,“sdf_configfile”][,“sdf_logfile”][,“mtm_spec”][,“scale_factors”][,“scale_type”]);
           // "sdf_file":指定SDF文件的路径。
           // module_instance:指定反标设计的范围(scope)
           // “sdf_configfile”:指定SDF配置文件
           // “sdf_logfile”:指定VCS保存error 和warnings消息的SDF日志文件。也可以使用+sdfverbose runtime option来打印所有反标消息
           // "mtm_spec":指定延迟类型"MINIMUM(min)", "TYPICAL(typ)“或者"MAXIMUM(max)”。
           // "scale_factors":分别指定min:typ:max的缩放因子,默认是"1.0:1.0:1.0"
           // “scale_type”:指定缩放之前延迟值得来源,“FROM_TYPICAL”,“FROM_MIMINUM”, “FROM_MAXIMUM"和"FROM_MTM” (default).
         `endif
        
      • 在编译阶段通过 -sdf 编译选项来反标,用法如下:

        -sdf min|typ|max:instance_name:file.sdf
        
    • 对于通过 force 跳过步骤加速初始化的部分,建议去掉 force,走全流程

  3. 编译,vcs 编译时需要根据需求添加以下选项(仅列举了常用选项):
    • -sdf,若需要在编译阶段反标 SDF,必选此选项
    • +rad(可选),采用 Radiant 技术进行仿真优化及加速
    • +debug_access+all,不加此选项的话 deposit 有可能找不到路径
    • +optconfigfile+filename(必选),添加跟上述 false_path 相匹配的 notimingcheck.cfg 来忽略无需时序检查的异步路径。该选项也支持关闭特定 instance 的时序检查,cfg 中的示例写法如下:
      instance {tb_top.U_TOP.U_CORE.U_Async} {noTiming}
      
    • +notimingcheck(可选),仿真时不检查 specify block 的时序,但时延还在。对于不带 SDF 的门仿必须添加该选项,带 SDF 反标时不得使用。该选项笔 ucli 的 tcheck 优先级要高。
    • +nospecify(可选),是 +notimingcheck 的加强,不但忽略 specify block 中的时序检查,还消除所有 specify block 的路径时延,避免输出 X 态。不带 SDF 的门仿可以使用,带 SDF 禁用。采用该选项能够加速仿真。
    • +no_notifier(建议),关闭 X 态传播检查,若出现 Timing Violation 会报告,但不会影响逻辑功能的正确输出。
    • +no_tchk_msg(可选),关闭 Timing Violation 信息报告,Zero-Delay 仿真可选,时序仿真不建议。
    • -sdfretain(建议),在波形上显示 retain 信息,建议加。retain 参考 sdf反标之RETAIN信息
    • -sdfretain=warning(可选),配合 -sdfretain 使用,编译、仿真选项通用,若出现在编译选项中,则在编译期间就能显示 Retain Warning 信息。
    • -diag=sdf::verbose(建议),加了该选项后编译后会输出反标报告文件 sdfAnnotatedInfo
    • -sdfverbose(可选),不加该选项默认显示 10 条反标 Warning 和 Error,加了该选项后显示所有的 sdf 反标错误。
    • -negdelay(可选),允许采用 SDF 中的值对 IOPATH 及 IInterconnect 进行负延时反标,不加时负延时为 0。
    • +neg_tchk(可选),支持负延时检查,带 SDF 门仿建议加此选项。
    • +mindelays(可选),默认采用仿真库中的延时(一般 setup 1ns, hold 0.5ns),加上此选项后器件延时采 - 用 sdf 中的最小延时替代仿真库中的延时。
    • +maxdelays(可选),器件延时采用 sdf 中的最大延时。
    • -delay_mode_zero(可选),将标准库单元中定义的延时替换为 0,TB 中采用 # 引入的延时也被替换为 0,delay_mode_zero 进行,仅限 Zero-Delay 仿真使用。

  4. 仿真,simv 仿真时需要根据需求添加以下选项(仅列举了常用选项):
    • 如果复位寄存器的 deposit 文件为 .do 且采用 ucli 模式来执行,需要在仿真选项中添加
      -ucli -do /xxx/xxx/xxx/deposit.do
      
    • 若支持 ucli 模式,仿真时可以通过以下选项来开关时序检查
      ucli% tcheck <instance> tchk_type > msg|xgen > disable| enable
      
    • -sdfretain=warning(可选),配合 -sdfretain 使用,编译、仿真选项通用,若出现在编译选项中,则在编译期间就能显示 Retain Warning 信息。

  5. 仿真后确认及 Debug

4.2 门仿结果确认

  采用以下手段对门仿结果进行确认:

  • 确认 Netlist 正确
    • DV 确认 GLS filelist 中的 RTL 替换为了 Netlist 文件;
    • 后端确认 DV file list 中所用的 Netlist 及 Cell 路径正确、版本正确;
    • DV 门仿 Case Pass;
    • Verdi 打开 GLS 波形,再次确认其波形对于的设计文件为 Netlist。
  • 确认反标情况及反标率
    • compile log 内有 “SDF annotation completed” 或类似信息。
    • VCS 编译之后查看 compile 目录是否生成了相关 log,有几个就查看几个,没有的话可能是没有反标上。log 名称为 反标时,自定义的名称,例如 $sdf_annotate() 中的 sdf_logfile。
    • 确认 sdf_logfile 中显示的 sdf_annotated 所用参数符合预取,确认中 log 没有 Error,Warning 均可解释。有 Error 需全部清理,Warning 应清理大部分。
    • VCS 编译之后产生 sdfAnnotateInfo(位于 compile 文件夹),该文件总结了每一个 sdf 的 Path Delay 和 Tchecks 的反标率等信息,需要达到能够解释的 100%。
    • 确认时序仿真时关闭了 notimingcheck 和 nospecify,防止虚假反标,也防止未检查。
    • Verdi 打开 GLS 波形,再次确认波形上的延时与 SDF 延时一致。
  • 时序仿真没有预期外 Timing Violation
    • 从 VCS 仿真之后的 log 内提取 Timing Violation 信息,确认没有预期之外的 Timing Violation。同一 Path 会重复出现,只提取第一条即可。


5. 门仿怎么 Debug?


  门仿最常见的问题及解决办法:

  • 编译不过
    • 找不到 module、cell,查看 GLS filelist 是否正确 load 了所有 lib 及 netlist。
    • 找不到 Hierarchy,信号 Hierarchy 变了,该 TB/Case 中的相关 Hierarchy 与 Netlist 中一致。
  • Case 仿真 Hang 了
    • 检查 Clock 是否有,生成 Clock 的时候是否赋初值(重点查 Analog Model)。
    • 检查 Reset 是否正确,Reset 是否赋初值(重点查 Analog Model)。
    • 检查 Netlist 中 Reset、Valid 等信号是否信号取反了。
  • Case Failed
    • 确认前仿真(RTL & GLS without SDF)能 Pass。
    • 相关寄存器是否复位,是否赋初值。
    • TB/Case 中监测、驱动的信号是否取反,多 bit 信号是否只有部分取反。
    • Pad Un-Drivern 导致的 High-Z 传播,可以给 Pad 加上拉下拉。
    • Timing Violation 导致的 X 态传播。
  • Case Pass 但存在 Timing Violation(这个找 DE 看)
    • 确认 netlist、sdf 没用错。
    • 找后端确认使用的 sdf 是否为 Timing Clean 的。
    • 确认是否为异步路径,异步路径应加到 notiming_check list 中。
    • 以下过程/场景引入的 Timing Violation,找 DE 或后端确认是否可 Ignore:
      • 工作模式、时钟、上下电过程中
      • DFT 引入
      • 异步复位同步释放
      • 打两拍做异步的第一级寄存器
      • Latch 的 EN 和 CLK 端初始时

  此外,Verdi 提供了 Gate-level Debug Mode,很少使用,具体请查看 Verdi Spec。


  Note:

  • 万不得已不要 dump GLS 波形,非要 dump 波形的话,可以分模块、时间窗只 dump 所需的一小部分波形。
  • 万不得已不要 Trace 波形,netlist 很难读懂。
  • 修改 TB、Case 后重跑 Case Failed 时,可以同时跑两个, 一个 不 dump 波形,便于快速看结果,另一个 dump 波形。


6. 参考及友链




— END —


🔥 精选往期 IC 技能树相关博文,请查看【 数字 IC 技能树】专栏🔥

⬆️ 返回顶部 ⬆️

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值