微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于VMM验证方法学的MCU验证环境

基于VMM验证方法学的MCU验证环境

时间:02-24 来源:中国集成电路 点击:

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状态

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top