1. CPU设计
2. CPU验证
2.1 指令集验证(compliance test)
指令集验证主要是验证CPU对指令集的兼容性,即该CPU是否能准确无误的执行每条目标指令。
1 DUT仿真验证(simulation verification)
目前指令集验证均是编写测试激励对DUT和参考模型进行simulation,后对比结果。
- 指令集验证的需求
- 能够使用操作数产生合法的基本整数运算指令
- 在指令执行完成后能够检查通用寄存器的状态
- 指令执行完成后能检查副效应,例如溢出等。
- 指令集验证内容
指令集的验证需要验证工程师思考该指令需要测试的特征是什么,为了确保指令的正确执行需要检查的内容是什么,为了确保该特征被测试需要进行哪些激励和配置等。验证的充不充分取决于验证人员对CPU微架构的理解和风险应对能力。
(1)RISCV基本指令定向测试
设计出来的CPU首先需要兼容RISCV基本指令,即需要满足RISCV基本整数指令及相关标准指令集。
即risc-v兼容性测试,riscv-compliance工程主要由imperas公司维护,详细介绍见:RISC-V及RISC-V core compliance test简析 - 知乎
主要测试的内容有:
- 溢出检测及相关标志位
- 下溢检测及相关标志位
- 无指令执行的副效应,比如异常的通用处理寄存器变化,异常的条件代码
- 使用x0-x31作为rs1/rs2
- 使用x0-x31作为rd
- x0寄存器的值始终为0
- set/clear所有立即数的比特位
- set/clear源寄存器rs1/rs2的比特位
- 根据7/8两条set/clear目的寄存器rd的比特位
(2)自定义扩展指令定向测试
对于自定义扩展指令集的验证,该验证需要修改相关的工具链并通过相关测试验证工具链的修改成功,再进行(1)中的测试。
(3)随机约束测试
对进行大量的随机指令测试
- 指令集验证激励的种类
指令集验证testcase基本分为以下几种:
- self check
- signature comparison (extension of self check)
- trace log comparison
- step and compare
代码执行模式主要有以下两种:
- 自检测试激励运行时按照源文件中指令顺序依次,并同时将指令执行结果和参考值作检查,若出错则程序跳转到fail,打断正常执行顺序,立即执行完成。类似的测试集有riscv-tests、riscv-compilance-tests等
- 预存测试激励运行时不会打断执行顺序,执行的结果会和指令集模拟器(ISS)的结果作对比,最终统计对比的结果。类似的测试集有riscv-dv等
- 指令集验证pass/fail的标志
测试的pass/fail与上述激励的种类有关
- self checking:自检性质的测试激励在每条指令执行时就会同时将结果和参考值作对比,若失败则跳转到fail
- signature check:特征检查,相对自检来说更加复杂深入。测试的结果将被用来计算该指令的某个特征,这将会和预先确定好的较标准特征作对比。采用该检查的为riscv-complience-tests。
- check against ISS:与指令集模拟器对比检查。该情况下,testcase并不知道测试的参考值,仅仅给DUT提供激励,testbench会对比DUT和ISS的输出结果确定测试的pass/fail。该检查较被经常使用,因为它是的testcase更加简单。采用该检查的如riscv-dv
- check against RM:与参考模型对比检查,该检查方式与第三点类似,但相对ISS更加通用。通常用作ISS检测的补充。
- assertion check:通过断言判断是否执行出错。
2 形式化验证(Formal verification)
系统级验证中的形式化验证是近期较流行的一种验证方式,它是可以在simulation之前做的验证,在芯片设计流程通常处于CPU的RTL代码尚未设计好的阶段,此外,在simulation进行的同时,同样可以采用形式化验证并行工作,两种验证方法的feature做互补。
- 指令集描述语言——sail
sail是REMS构建的一种描述指令集的语言,可以认为是一种机器可读的形式化ISA模型。REMS是英国的一家学术组织,该组织已构建出RV32IMAC和RV64IMAC指令集的sail model,链接见上。
riscv基金会有意用其来描述RISCV指令集。
初步来看,sail可以用来形式化testbench断言的参考模型,这些assertion可以根据sail spec来验证基于RISCV ISA的某微架构。目前该领域OneSpin GapFree已经在sail model和RTL代码间做了可比性的check,该公司仍在探索如何充分使用sail model
SAIL模型的优点在于它可以与RISC-V ISA相同的方式进行扩展。然后对core执行formal验证,以创建一组SystemVerilog断言,然后将其用于对RTL进行formal验证。通过比较RTL的断言进行formal验证的工具是专有工具,并且用于执行此操作的技术将是每个供应商专有的。
该语言将持续关注。
2.2 系统功能验证
很明显,单单的compliance测试是远远不够的,compliance测试只是在验证指令执行的正确性,但是CPU中的debug功能,interrupt功能,异常检测等却没有验证。
此时应该做的是:
- 分析验证计划,扩充testcase
3. 设计验证生态
1 验证工具
- Risc-v verification APP (Onespin)
该解决方案的核心是使用OneSpin的断言设置方法将risc-v指令集形式化位一种systemverilog断言,该方法可以产生一种高性能、非重叠的断言,从而以一种纯粹优雅的方式来捕捉端到端的转换和需求,具体是:
- 将功能需求转换位一种形式化的可仿真执行的形式
- 捕捉完整的电路信号变化,类似于时序图
- 通过高级的易于复查的断言来获取100%的功能覆盖率
- 将特定于实现的支持验证代码与可重用规范级代码清晰地分离开来
- 使用OneSpin的GapFreeVerification进一步利用断言集用于自动检测规范遗漏和错误、验证计划中的漏洞和未验证的RTL函数
2. 测试用例
- benchmark测试
1. IO测试
Benchmark测试——fio_KGback的博客-CSDN博客
Benchmark测试——IOzone_iozone测试结果分析_KGback的博客-CSDN博客
Benchmark测试——Unixbench 2D测试和x11perf_KGback的博客-CSDN博客
网卡netperf测试:https://www.cnblogs.com/xieshengsen/p/6493277.html
https://www.cnblogs.com/davidesun/p/12726006.html
2. CPU性能测试
UnixBench:UnixBench的实现介绍-阿里云开发者社区
CPU2006: 测试工具(spec2006及Lmbench)讲解及数据分析_specint2006_GLL_的博客-CSDN博客
常见CPU benchmark的测试报告:实测一些CPU得到的原始测试报告
3. 验证相关文章
- semiconductor Engineering: Components For Open-Source Verification
链接:Components For Open-Source Verification
4. CPU开源项目分析
4.1 riscv指令集架构
1 wujian100
(1)SoC核分析
无剑100实际上是一款低功耗SoC,采用的CPU核是E902。
core通过AHB总线与Icache相连
(2)验证环境分析
通过 $readmemh("test.pat", temp_mem)将二进制文件读进工程。
通过Srec2vmem.py将某文件转化为某文件,为何转化尚未搞清。(判断S[1-9]是否跟某线程或某核有关?即某核只处理某类型的指令。)初步判断测试集为riscv-tests测试集。
2 bottlerocket
通过$readmemh({image,".hex"}, imem.mem)和$readmemh({image,".hex"}, dmem.mem)将bin文件读进工程
测试用例为riscv-tests中RV32ui和RV32mi测试集
3 rv32cpu
通过axi总线接入TEXT和DATA ram,但axi数据来源未知。
测试激励为src文件夹中的汇编文件,为指明测试激励集。
4 clarvi
在dual_port_bram模块中通过$readmemh(INIT_FILE, memory)将mem.hex读进工程。
测试用例为riscv-tests中RV32ui和RV32mi测试集
5 RI5CY
苏黎世联邦理工大学和波罗尼亚大学联合设计的一款小巧的4级流水线开源处理器,实现了RV32IC,以及RV32M中乘法指令mul,其目标是作为并行超低功耗处理器项目PULP(Parallel Ultra Low Power)的处理器核,所以RI5CY在RISC-V的基础上增加了许多扩展,包括硬件循环、乘累加、高级算术指令等。采用UMC的65nm工艺进行流片,RI5CY主频可以达到654MHz,动态功耗是17.5uW/MHz。采用SystemVerilog编写。
测试集有三种:
- RISCV tests 即riscv-tests。
- RISCV compliance tests 即指令集兼容性测试,共56个汇编文件,测试指令包括整数计算指令、存储器操作指令、控制跳转指令等。(该部分会做详细分析)
- firmware tests 固件测试。一个独立的测试用C代码。
6. openHW core-v系列
cv32e40p核分析:CPU设计——CPU核解析——cv32e40p_KGback的博客-CSDN博客
验证环境分析具体参见:CPU系统级验证——验证环境——OpenHW core-v验证环境及文件分析_riscv el2验证环境_KGback的博客-CSDN博客
7. LowRISC Ibex
参考链接:
8. pulpino
9. core-v-mcu
4.2 ARM指令集架构
1. Cortex-M0
上电启动流程