编译选项

增加编译选项

在后仿真中,需要增加如下的编译选项:

  • +neg_tchk
    •  negative timing check是一个在仿真过程中控制负时序检查的选项,允许仿真器忽略负的时序检查结果,从而减少不必要的警告或错误;
  • initial reg:
    • 初始化无复为寄存器为随机值,防止无复位寄存器引入的x态传播;
    • 或者,使用deposite的方式,将这部分值给做初始化掉;
  • +maxdelays/+mindelays:
    • 使用SDF文件中最大延时/最小延时,maxdelay直接影响建立关系,mindelay直接影响保持关系。
  • +sdfverbose:
    • 显示SDF反标时的详细告警和错误信息。
    • 有一个与之对应的+sdf_no_warning, 这个是都关掉,这个最好不要用;
  • +no_notifier:
    • 在VCS中, no-notifier是一个高级仿真选项,它的核心思想是通过关闭或优化事件通知机制来提高仿真速度,尤其在高性能仿真环境下。这个选项可以关闭或最小化事件通知处理,减少因事件通知所带来的额外开销。
    •   
  • -negdelay:
    • 用于SDF文件中有负延迟,如果省略此选项,VCS将所有负延迟更改为0。
    • 也就是说,有负延迟的时候,要打开这个选项,为了以防万一,加上就行了;
  • +warn=SDFCOM_SWC (Simple Wire Connection Warning),
    • 在反标过程中,会报大量的warning, 分析这些warning,有助于我们提前发现问题,当然,如果觉得SDF的log中,这类信息太多了,可以使用这个选项,将warning都屏蔽掉;
    • 一般我们在后仿中,需要分析这些warning, 这些warning都是按照类别来分析的,针对不同的类别,可以在网上或者spec中查找其含义,确认是否ok;
    • 同理,除了SWC,可能还有NL/CFTC等等其他类型的warning;
    • 后仿中常见的SDF warning分析 - 知乎
  • 初始化mem
    • 这个不一定是在后仿真中,前仿真中也有可能;
    • TSMC_INITIALIZE_LOAD_0/1/RDM等宏定义,可以控制mem 仿真时走不同的分支;
    • 不同的分支,即表示mem中初始的值不同;
    • 其他类型的mem类似;
  • +csdf+precomp+dir+目录
    • 预编译,SDF文件预编译为一种格式,供VCS在编译Verilog代码时进行解析。
    • +dir: 指定您要VCS在其中写入预编译的SDF文件的目录路径。
    • 其实也就是你要使用的反标文件的路径;

    可选编译选项

    • transport_path_delays+pulse_r/<滤除百分比>及+pulse_e/<滤除百分比>

      • 在仿真时,增加如下仿真参数:+transport_path_delays +pulse_r/ +pulse_e/ 可在仿真阶段实现传输延迟的模拟,并且配置不同的滤除百分比,输出的结果也会有差异,一般输出结果为三种情况:滤除、通过、不定态。

      • 其中“+pulse_r”和“+pulse_e”后指定的参数表示允许通过和滤除的信号的宽度占指定延迟的百分比。例如,如果指定延迟为5ns,参数为“+pulse_r/40”和“+pulse_e/80”(其中的40和80为百分比),那么小于2ns(5x(40%))的信号将被滤除,大于等于4ns(5x(80%))的信号将可以通过,介于两者之间的信号将输出不定态。

    • 关闭某些时序检查
      • 后仿过程中可能有一些不必要或者不想检查的时序,尤其是跨时钟域的两级同步的第一级DFF出现所谓的时序违例,这是一种假的时序违例所以通常不关心它们是否有时序违例。
      • 也就是false_path 文件,后端提供;
      • 增加不需要检查的选项及路径:VCS +optconfigfile+notiming.list;
      •  notiming.list中按照如下格式编写: 
      • 这样在后仿过程中将不对这些寄存器做时序检查,避免不必要的时序问题而引起X态传递。

    删除编译选项

    在后仿真中,需要删除如下的编译选项:

    • 删除notimingcheck的选项;
    • 删除nospecify的选项,防止cell中的一些延时被过滤掉;
    • 删除+delay_mode_zero,该功能是将标准库单元中定义的延时替换为0。testbench中的 #延时也都被消除。因为testbench中的也被消除,所以一般前仿也不怎么用;

    环境准备

            后仿真由于整个DUT和前仿真不一样了,比如某些信号的名字,某些信号的路径,等等,因此,吃进来网表之后,我们一般都要对环境做适配,保证编译ok;

            这一步通常比较麻烦,需要逐一修改,但是必不可少;

    先做纯网表仿真

    • 由于后仿真很耗时间,如果直接一上来就做带延时的后仿真,期间只要出了任何问题,这段时间的工作都白做了,非常耗时;
    • 因此我们需要先做纯网表的仿真,也就是将rtl替换为网表,进行仿真,这也能从侧面证明网表的正确性;
    • 纯网表的仿真,可以开启no_timing_check和no_specify, 毕竟本身就不带延时;
    • 此阶段,直接将仿真的filelist, 替换为网表即可;

    反标

    • 在testbench中,initial begin end块内,增加如下语句
    • $sdf_annotate ("sdf_file"[, module_instance] [,"sdf_configfile"][,"sdf_logfile"][,"mtm_spec"] 
      [,"scale_factors"][,"scale_type"]);
      • sdf_file: 指定指向SDF文件的路径;
      • module_instance: 调用$sdf_annotate模块实例的范围,也就是我们顶层在环境中的hierarchy;
      • sdf_configfile: 指定SDF配置文件。
      • sdf_logfile: 指定SDF log文件,可以使用+sdfverbose显示所有的sdf反标错误。
      • mtm_spec: 指定哪一种延迟类型,通常有三种min:typ:max,它的可能值是"MINIMUM", "TYPICAL", "MAXIMUM", or "TOOL_CONTROL"(默认值)。在仿真器读入SDF的时候,要指定使用哪一组。避免出现指定的组的时序信息不存在的情况。
      • scale_factors: 指定min:typ:max的缩放因子,默认为三个正实数“1.0:1.0:1.0”。
      • scale_type: 指定SDF文件中在缩放前使用的延迟值。它可能的值是“FROM_TYPICAL”、“FROM_MIMINUM”、“FROM_MAXIMUM”和“FROM_MTM”(默认);
    • 如何确认反标成功
      • 确认log中打印出Doing SDF annotation ...... Done

    后仿建议

    • 一般我们跑完后仿,需要看log里面的Timing violation,找到这些时序违例的cell;

      • 添加到verdi中,追产生x态的信号,直到追到某个D触发器的两端,意味着D触发器的D端输入信号是正常的,但是Q端有了x态,说明x态是由该D触发器产生的;

      • 我们就需要分析看倒是为什么导致了x态的产生。还有一些width和period的违例,这些一般可能是由于设计中存在的时钟切换导致的,需要根据违例来确定发生的cell,以及是否会对设计产生影响。

    • 后仿真波形,需要确认信号是否真的又延时,也就是我们的反标是否真的标上去了,防止因为某些原因,一直跑的是网表;
    • 由于后仿真,既耗时间,又定位困难;所以建议,用同一个种子,跑一个前仿真和后仿真,两个都dump波形,这样定位的时候对比这看,能够更快的找到问题;

    Logo

    DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

    更多推荐