基于VMM验证方法学的MCU验证环境
RAM和SFR的值并传递给ScoreBoard,由ScoreBoard来进行自检,并且在log中写出自检结果。
3.3 功能覆盖率收集
在Direct TestCase下,汇编代码都是特定目的的测试代码,所关注的寄存器状态,或是真实指令执行情况往往很难统计,代码覆盖率能提供的信息相当有限。在 VMM环境中,可以通过模型的执行结果来统计指令的执行情况,因为模型和RTL是功能一致的,内部数据每条指令之后都会对比自检,可以将模型运行的结果和模型内部对应的SFR状态位作为功能覆盖率收集点,将关注的功能写为覆盖率模型,在仿真中自动收集,并在仿真所有TestCase后将覆盖率结果合并在一起,给出一个最终的功能覆盖率,这里要求功能覆盖率和代码覆盖率都为100%。
4 验证功能模块的具体实现
4.1 简介
以VMM为基础,实现了一个验证8位MCU的平台,这个平台可以随机生成一系列的指令,并且在每个指令后进行自检。下面就这个平台的详细实现加以介绍,4.2小节将会介绍随机指令生成,以及Scenario约束的实现,4.3小节将会介绍Driver部分,这里Driver实现了Transactor的任务,除了实现汇编,将16进制代码读入ROM模型中,还要调用MCU的C模型并产生结果供后续ScoreBoard对比。 4.4小节将会介绍MCU的C模型,C模型行为是直接影响MCU是否正确的保证。4.5小节将会介绍memory模型的实现,包括Internal SFR、Internal RAM、External SFR以及External RAM。4.6小节介绍过于ScoreBoard的自检机制,以及自动终止仿真的方法。4.7小节将会介绍关于功能覆盖率模型的建立。
4.2 指令数据包以及Scenario Generator
在VMM环境中,所有的数据都是扩展vmm_data得到,在这里首先对指令分类,相同格式的指令皆为同一类型,具体部分分类表格如表1中所示。
分类的依据在于指令格式,例如对从工作寄存器Rn到A的操作,或是从直接地址Rx到A的操作,这样可以通过约束一个种类来随机化指令格式,生成指令格式以后可以根据指令格式来填入相应的随机值。首先就是约束指令格式对应的指令,代码如:
constraint add_mode_decide_kind{
(addr_mode==RN_A) -> kind inside {MOV, ADD, ADDC, SUBB, XCH, ANL, ORL, XRL};
(addr_mode==RX_A) -> kind inside {MOV, ADD, ADDC, SUBB, XCH, ANL, ORL, XRL};
…………}
然后约束对应的寄存器地址,立即数,相对地址等,代码如:
constraint inst_valid{
di_x inside {[0:255]};
reg_y inside {[0:255]};
reg_i inside {0, 1};
reg_n inside {[0: 7]};
…。}
得到了指令的格式,随机得到指令,指令参数,在以上约束下就可以生成一条符合语法的指令。通过在TestCase中约束指令格式,或是地址数据就可以在TestCase中控制Generator生成的指令,通过变换随机种子就可以生成不同类型的指令集合。
使用宏定义对数据类扩展就可以得到数据类的Generator和Channel:
`vmm_channel(inst)
`vmm_scenario_gen(inst, "inst")
每次scenario Generator生成一条指令,并且通过channel传递给Driver。可以将一系列约束做为一个scenario,这样可以控制指令与指令之间的关系,将一系列scenario合并可以生成更多的随机组合,例如:
$void(scenario_kind) == R0_OP -> {
foreach(items[i]){
items[i].addr_mode inside {0,1,2,4,5,6,7,8,10,11,12,13,14,21,22,23,24,26,27,28=};
items[i].reg_x inside {0};
items[i].reg_n inside {0};
items[i].reg_i inside {0};
}
}
验证这里能够做到尽可能大量重复地测试某些指令的集合,以便将一些边缘情况测到,例如实际应用上会反复使用累加器或是反复调用R0-R7,都可以通过约束来实现。大量随机的代码测试下,可以给出更边缘的TestCase,尽可能地测试到一些边缘情况。
4.3 Driver
这里Driver实现了Transactor的功能,除了实现将asm代码汇编,将16进制代码读入ROM模型中,还要调用MCU的C模型并产生结果,供后续ScoreBoard对比。
由于汇编器需要将所有指令代码读入进行统一汇编,由Generator生成的所有指令代码在Driver中会被写入asm文件,通过DPI调用一个汇编的 C function来处理这个asm文件,生成一个HEX 代码文件,Driver可以读入这个HEX 代码,并且写入一个用SystemVerilog实现的ROM模型中,另外通过DPI调用一个C的MCU仿真器,可以实时写出每一条指令MCU的SFR、 RAM状态
SystemVerilog VMM 相关文章:
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)
- 适用于工业能源采集的技术 (08-10)
- 单片式电池充电器简化太阳能供电设计(08-20)