vcs后仿实现的总结

一,后仿平台的搭建

1,准备工作,这块主要包含一下几个的内容需要我们事先准备好:

①,后仿网表,后端提供

后仿的网表指的是,在仿真时,我们不再使用最开始的rtl代码来进行仿真,而是使用将rtl转化为真实的逻辑门电路的netlist来进行仿真,这里面会涉及到器件标准库的选择和设计的约束,这里不是我们的重点,重点是我们要拿到对应仿真模块的后仿 netlist

②,后仿反标的sdf文件,后端提供

所谓的SDF文件就是:Standard delay file,它是把布局布线过程中器件延时和线延时的信息保留下来,据此就可以在路径时序分析时将整条路径的时序计算出来,再判断时序约束条件就能知道是否满足时序要求了,在后仿时,vcs等工具会检查标记出来的路径,如果满足时序要求就不会报时序违例,如果不满足就会报timing violation 不同的工具生成的报告不同,但内容是一致的。

③,lib库文件,后端提供

综合后的网表中,都是逻辑门电路,因此需要这些器件的lib库来支撑vcs等仿真工具的仿真。

④,false_path 文件,后端提供

这部分指的是,一些不需要时序检查时序的异步路径,告诉仿真工具这部分的时序不需要检查,对于不同的工具,tfile文件的格式不同:

vcs的格式为: instance {false_path} {noTiming};

irun的格式为:PATH false_path -tcheck

⑤,无复位端寄存器,后端提供

这一部分主要是需要给无复位端的寄存器提供一个初始值,不然这部分寄存器在上电之后,寄存器Q端的值是不确定的,会引起内部x态的传播,需要我们给这部分寄存器一个初值。

这部分的做法有两种:

1,一个叫做cmd的文件,将所有无复位端寄存器的路径里出来,用 $deposit(instance.path,'b0/1)处理掉,加到编译列表里面即可;

2,直接在cell的库文件中,用同样的方式处理;

2,脚本需要注意的地方:

①,首先你要关注的是filelist,是否正确的将netlist包含了进来

②,lib库文件是否也被包含了进来

③,false_path需要包含进来,所谓包含进来,对于vcs来说需要通过+optconfigfile+false_path.tfile的方式包含进来,而对于irun来说只需要 +nctfile+false_path.tfile即可,同样的也可以在sim这一步,通过ucli命令将 tfile吃进来

④,compile这一步需要添加的编译命令,+maxdelays 或者 mindelays,切记需要去掉nospecify,不然迟我们添加的路径期间延就不会起作用了。但是针对maxdelays 和 mindelays,这两个命令的使用,是与网表结合在一起的,maxdelays针对setup,mindelays针对hold(其实网表生成的时候,以为已经比较贴近真实的芯片,根据器件的模型可以跑出来125℃或者-40℃的网表,我们一般都是85℃下典型场景的网表)

⑤,无复位端寄存器,和tfile一样的处理方式,只是不需要加额外的命令。

⑥,sdf的反标:

       这里简单的说明一下,我们需要通过系统函数将sdf反标到netlist里面,如下:

 $sdf_annotate("sdf_file",  module_inst, sdf_configfile ,"sdf_log_file");

"sdf_file":指定SDF文件的路径,可以用宏定义来代替,一般也是这么做的

module_instance:指定反标的标注范围,一般都是从顶层开始的

“sdf_configfile”:配置文件的绝对路径或相对路径

“sdf_logfile”:指定VCS保存error 和warnings消息的SDF日志文件。也可以使用+sdfverbose来打印所有反标消息

其实还有很多参数,这里不做介绍了,因为我也不懂。。。
写法如下:

initial begin

    $sdf_annotate("sdf_file",  module_inst, sdf_configfile ,"sdf_log_file");  // 此处,我们可以根据sdf_file 来反标不同的conner,就是上文提到的内容。

end

二,后仿上需要完成的内容

        一般我们跑完后仿,需要看log里面的Timing violation,找到这些时序违例的cell,添加到verdi中,追产生x态的信号,直到追到某个D触发器的两端,意味着D触发器的D端输入信号是正常的,但是Q端有了x态,说明x态是由该D触发器产生的,我们就需要分析看倒是为什么导致了x态的产生。还有一些width和period的违例,这些一般可能是由于设计中存在的时钟切换导致的,需要根据违例来确定发生的cell,以及是否会对设计产生影响。

        对于后仿log中 Timing violation的处理,一般我们都有脚本将所有的时序违例过滤出来,并且时序违例中会有很多重复的违例,我们只需要将第一次遇到时序违例的地方过滤出来即可,逐条分析,逐条解决直到不再出现Timing violation。对于过滤Timing violation 脚本的编写,我在perl脚本专栏里面有讲到过。

三,后仿小结

        说到后仿,这是一个十分痛苦的过程,仿真不仅慢,而且log会特别大,需要我们用脚本将Timing violation提取出来,并逐条分析,分析的过程也会非常的耗时,这条路并没有什么捷径可说,需要花费大量的时间来分析和消除timing violation,对于后端或综合提供的异步路径文件,可能往往是不完备的,我们需要通过后仿产生的x态的cell的前后级来确定是否是异步跨时钟域产生的x态,如果是,那说明异步路径文件并不完整,需要和综合/后端确认是否需要添加到异步路径文件中,做好这些,又得重新编译仿真,循环这个过程,直到消除所有的Timing violation。

  • 9
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值