路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

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

日志

缩短测试激励仿真时间的一种方法

已有 1431 次阅读| 2016-11-6 21:24 |个人分类:验证前沿资讯|系统分类:芯片设计

随着SOC设计复杂度越来越来高,我们需要更多的时间进行功能仿真,有时一个测试激励会仿真几个甚至几十个小时,再加上测试激励的数量巨大,无疑会延长我们的验证时间,而对于这些仿真时间比较长的测试激励,大都会经历一些共同的初始化阶段:设计单元初始化,reset初始化,配置阶段,具体激励初始化,这些初始化阶段占用了一定的仿真时间,但它们几乎对于每个测试激励都是一样的,而且当测试激励数量比较大的时候,初始化阶段占用的时间是一个惊人的量,如果我们可以对初始化完成后的阶段保存一个状态,供其他测试激励使用,让它们可以跳过初始化阶段,直接仿真具体的测试函数,这样在我们的验证环节可以节省许多时间,本文将介绍一种它的具体实现方法(基于Questasim的checkpoint和restore技术)
在介绍之前,我们先来看看它的应用场景:
  1. 设计中包含PHY的元件,它需要很长的初始化时间
  2. 设计中有DDR4或者SDRAM的接口,在正式激励发送之前需要一些training sequence
  3. 有好多需要配置的寄存器,例如视频控制器,在初始化之后需要启动时间
一旦能够为这些测试激励保存一个初始化之后的阶段,让它们跳过初始化阶段,这将能够节省测试激励20%到90%的仿真时间,会极大的提高我们的验证效率
对于我们的实现的具体方法,如下图:
这种基于Questasim的checkpoint(其实目前的商业仿真器几乎都支持)技术目前支持的语言有Verilog,VHDL,Systemverilog,UVM,OVM,对于包含SystenC,C/C++模块和一些DPI,VPI的设计时需要我们自己对设计文件做一些手动的更改来支持,但是如果设计比较复杂,那么我们的手动更改也会比较困难而且有可能会出错,所以我们更多的希望借助仿真工具自己去完成,以很少的手动更改量去实现,另外,checkpoint和restore这个特性对与跑仿真的服务器也有一定的要求,它需要我们做checkpoint时的服务器和restore时的服务器有相同的操作系统规格,如果操作系统规格不一样,那么在测试激励仿真时存储器映射可能会不一样导致不能正常使用,一般对于典型的作业提交系统如LSF,SGE它们都支持用户去选择前后类型相同的服务器以避免发生问题
对于上图中的第一步,我们需要确认我们要checkpoint的时间和位置,这完全取决于设计文件的状态,checkpoint的位置可以是在一个固定的仿真时间,也可以是在TB的某一个位置,或者根据设计文件的实时运行状态来决定,如果是一个确定的仿真时间我们可以按照下面的命令来进行,仿真器会仿真1000ns然后把当时的所有数据状态保存在test.chk文件中,然后再从这个文件加载初始化的状态
如果是在TB的某一个确定的位置,那么我们可以设置一个变量checkpoint_enable来确定仿真时候到达这个位置,如果到达把它置1然后开始存储当前状态,具体如下图:
一旦我们设置好第一步checkpoint的时间点,那么第二步和第三步仿真器会自己去完成,接下来我们需要考虑第四步,如何去为测试激励更改配置文件去实现不同功能的验证,在这里我们可以借助Questasim的plusarg语法来为不同的测试激励传递不同的配置变量,具体如下图:
另外我们还可以为不同的测试激励传递不同的激励产生器,第一个vsim命令会checkpoint当前的状态当checkpoint_enable变量变为1的时候,第二个命令会restore存储的状态
不同的测试激励读取不同测试文件:
如果我们的设计只包含Verilog,VHDL,UVM,OVM,Systemverilog那么对于上图心里的1到3步仿真器可以自己完成,不需要我们认为更改任何东西,如果我们的设计中包含C/C++代码,或者是一些关于DPI的代码,那么我们需要去检查这一部分能不能被正确的checkpoint和restore,虽然仿真器也会自己检查并且在不能正确工作的时候去自动更改一些必要的东西,但还是需要我们去手动做一些事情来保证它完全可行,如果我们的设计包含SystemC代码,那么暂时不能使用这个功能,对于包含C/C++的代码,我们需要做一些处理来应用Questasim的checkpoint和restore特性:
  • 所有与memory处理相关的函数都应该通过仿真器的API接口函数来进行(使得对于memory的操作可以被仿真器捕捉),Questasim提供了mti_Malloc()和mti_Free()函数来代替C语言中的malloc()和free()函数来进行memory的操作
  • 所有的静态变量和全局变量需要用户自己去checkpoint和restore,Questasim提供了处理它们的API程序,这些函数可以在用户手册中查到
对于包含C++的设计模块要求和C做一样的处理,对于包含DPI函数的模块需要做一下处理,例如'my_scope',需要调用mti_SaveBlock()来存储它的值,restore的时候它的值会被mti_RestoreBlock()读取,具体细节如下图:
下面是我们运用checkpoint-restore技术后的regression的仿真时间图:
结论:
在本篇文章中,我们讨论了Questasim的checkpoint-restore功能以及它的使用方法和适用范围,并且介绍了对于包含C和C++的模块怎么进行更改来使用checkpoint-restore技术来减少我们测试激励的仿真时间,最后以实例来呈现checkpoin-restore技术在设计仿真中的重要作用,如果你的测试激励仿真时间比较长,而且有一些许多测试激励都需要经历的初始化阶段,那么你不妨试试这个功能,会有惊喜哦!

点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

GMT+8, 2024-3-29 04:41 , Processed in 0.015188 second(s), 12 queries , Gzip On, Redis On.

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