基于VMM验证方法学的MCU验证环境
,同样这些状态都保留在单独的文件中,以作为ScoreBoard的输入。
因为MCU的指令组合可以说是无法测全的,真正的测试往往要发生在应用代码测试上,Driver除了可以接受从channel中得到的指令,也可以直接从外部文件得到asm代码或是16进制代码,这样已有的MCU测试代码或是应用程序都可以在这个环境中直接调用。此外,中断的外部输入也有随机的数据灌入,外部端口的输入数据也是在指令数据包中产生,并且由TestCase控制的。MCU工作方式的特殊性,导致Driver相对于验证环境较为独立,与验证环境的接口都是磁盘文件。
4.4 C模型
环境中使用两个C模型:汇编器和仿真器,将asm代码汇编成为16进制代码,并仿真16进制代码。通过DPI调用C函数如下:
import "DPI" function void asmb_r(string in_file, string out_file);
import "DPI" function void siml(int run_for_n_ins, string in_file2, string in_file1, string in_file, string out_file, string out_file2, string out_file3, string out_file4);
如Driver所示,输入输出都是磁盘文件。汇编器通过查表将指令翻译成16进制代码,对于变量将用哈希表实现,通过查表替换,插入校验码,最后得出的16进制代码,作为MCU的C模型仿真输入,并且由Driver的ROM模型读入。
仿真器输入16进制代码,通过先解码16进制代码,然后逐条执行代码,所有memory都是在C中实现,每个指令分别调用相应的函数,此外还有相应的中断函数处理中断,在每一条指令后写出SFR,Internal RAM以及External RAM中的值到磁盘文件中,以作为RTL仿真的参照,C模型的结果直接影响整个验证的准确性,因为RTL是由时钟驱动,而C模型是不带时序关系,有些指令的执行结果需要根据时序做部分调整,调整模型在验证中占去较多资源。
4.5 memory模型
MCU外围连接了四个外部memory,包括Internal SFR、Internal RAM、External SFR以及External RAM。在验证MCU时,memory中的值就可以保证MCU的工作状态,因此在验证中,MCU的外部memory都是用SystemVerilog实现的行为模型,除了通过interface io来响应MCU的读写要求之外,还有数据通道通往ScoreBoard,这里每个MCU时钟都会将memory值记录下来送往ScoreBoard,由于Internal SFR、Internal RAM、External SFR仅有128 byte,数据量较小,可以每个时钟周期来检查,但对于External RAM有64k byte,对比或是传输都比较耗费资源。另外,对External RAM的操作并不多,这里实现的是在Testcases中约束对于External RAM的地址都为低256 byte,这样可以有效地控制数据量并且在每个时钟周期检查memory状态,另外一种可选方式是每隔一定数量的指令来对比External RAM的值,同样对仿真影响较小。
4.6 ScoreBoard
ScoreBoard收集到从各个memory传递过来的memory值,因此对应一块memory就会有一块ScoreBoard,对比通过读取MCU 的C模型写出的memory状态值,由于MCU模型写出的值是每条指令执行之后的值而memory传递过来的数据为每个时钟周期,这里 ScoreBoard不但要负责解读C模型写出的参照memory结果文件,通过参照将确认每个指令执行时钟周期长度,然后从memory模型传递过来的数据中选取该指令执行之后一个时钟周期的数据与参照数据进行对比,考虑到部分数据会有延迟,ScoreBoard在对比时,不仅仅考虑当前比较时间点上的数据,如果对比失败,ScoreBoard的自检会进入子线程,继续读取memory传递过来的数据,考虑到MCU支持指令延迟操作最多8个时钟周期,如果在后续16个周期内得到正确的值,ScoreBoard会认为结果正确,并且中止子线程返还检查成功标志。
MCU指令一旦开始运行,尤其是随机指令,指令执行不是顺序,有时会跳入死循环,很难设定仿真中止时间,这里设定了两种机制,一种是仿真指令计数,另一种就是根据覆盖率分析,通过VMM的覆盖率分析函数,可以动态的得到覆盖率情况,如果随机指令跳入死循环,覆盖率就会一直维持不变,每次覆盖率分析不变就进行计数,当计数超过限定,就会让ScoreBoard结束,通过环境对ScoreBoard的监测,一旦ScoreBoard停止,整个仿真也会停下。
4.7 功能覆盖率模型
对于MCU这样的DUT,代码覆盖率已经不能够代表验证进度,而功能覆盖率也只能代表相当一部分待验证的功能,这里对于基本的memory,功能覆盖率仅要求所有位都被指令操作过,对于特殊寄存器SFR,需要指定某些特定位有相应的"0"以及"1"状态。代码如下:
coverpoint memory[‘h87]
{
wildcard bins
SystemVerilog VMM 相关文章:
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)
- 适用于工业能源采集的技术 (08-10)
- 单片式电池充电器简化太阳能供电设计(08-20)