rockeric.com
译者喵注:
这篇文章大致可以分成两个部分:
第一部分叙述了RISC-V指令集架构的灵活性,指出此指令集依靠其基本指令集及多种扩展指令集的组合,可以实现几十种RISC-V处理器核,常规的验证流程已不可用,顺势提出Codasip公司的自动化设计流程,高度的自动化流程省时省力,同时设计灵活的配置层应对RISC-V的灵活性,致力于覆盖RISC-V处理器的所有组合。
第二部分主要阐述了Codasip和Mentor在提高仿真速度减少时间成本的方面所做的努力:
1. IA模型生成黄金预测模型,不考虑微架构实现细节,提高仿真性能;
2. simulation与emulation结合混合仿真,利用硬件并行机制提高验证效率;
3. 使用FlexMEM缩减上千程序依次从软件烧入硬件的时间;将黄金预测模型从软件平台取出,使其与硬件仿真平台并行运行,以减小事物在软件硬件之间的传输对仿真速度的影响(附图为验证环境)。
RISC-V 是一种新的ISA(指令集架构),它的发布使得处理器体系结构设计更加灵活,而且RISC-V应用领域覆盖嵌入式系统,物联网,高端手机和仓库云等众多领域,这样就可以使用一种指令集架构为这些领域量身定做处理器。伴随着这种灵活性的扩展而来的挑战,是验证时必须考虑到RISC-V处理核的所有可能性。在这篇文章中,Codasip 和Mentor旨在描述他们对于RISC-V处理器的验证方法,这种验证方法基于标准技术的组合,比如UVM和硬件仿真,和针对RISC-V验证提出的新概念,比如配置层,黄金预测层以及FlexMem方法。
介绍
RISC-V最初只是加州大学伯克利分校设计的一种免费开源指令集架构,研发的目的是教学与科研,但现在已经和ARM核一样商业化了,现在由RISC-V基金会维护。RISC-V指令集架构非常灵活,因为它除了基本的指令集(“I”/“E”),还支持众多扩展指令集,比如整数乘法与除法指令扩展集(”M”),原子操作指令扩展集(”A”),浮点指令扩展集(”F”),双精度浮点指令扩展集(D),四精度浮点指令扩展集(Q)等,通过它们的组合可以创造出数以百计可用的指令集。
Codasip是家生产RISC-V IP核的公司,公司内部命名为Codix Berkelium(BK)。和现代处理器标准设计流程不一样,Codasip的设计流程高度自动化,流程可参考图1. Codasip使用一种架构描述语言CodAL,在更抽象的层次上描述处理器。每一种处理器都用两种CodAL 模型描述,分别是Instruction-accurate(IA)模型和Cycle-accurate(CA)模型。IA模型描述了指令的语法语义和它们的功能行为,不涉及任何微体系结构细节。CA 模型描述了微体系结构比如流水线设计,译码器,时序等。通过这两个CodAL模型,Codasip工具可以自动生成SDK(软件工具开发包)工具(汇编工具,链接器,C编译器,模拟器,分析器,调试器)以及RTL和UVM验证环境。在UVM 中,IA模型被用作黄金预测模型,CA模型生成的RTL被用作DUT。这样高层次的自动化允许非常快速地探索设计空间,并在几分钟之内使用所有的软件工具生成一款独一无二的处理器。
图1. Codasip 生成SDK,RTL,参考模型和UVM验证环境的模型
本文旨在证明RISC-V ISA的灵活性既带来了好处,也带来了挑战,尤其在验证方面。我们将展示如何使用适当的战略来克服这些挑战,包括以下几个阶段(在各章节中详细描述):
1.定义配置层:遍历RISC-V处理器所有可能的变体以便设计和验证
2.定义黄金预测层:基于ISA仿真器,减少RTL仿真成本
3.利用硬件仿真和FlexMem方法有效地执行所有的测试
为RISC-V设计和验证定义配置层
RISC-V核的变体可能性非常多,手动去实现和维护所有相应的RTL表示和UVM环境。这个时候必须要考虑自动化,其类型依赖于RISC-V核配置的变化。本文给出了三种类型。
出于演示的目的,我们会使用Codasip Berkelium处理器的两种不同配置:
a)bk3-32IM-pd
b)bk3-32IMC-pd
“I”,”M”和”C”如第一节所描述的那样,表示标准RISC-V指令的扩展集,”p”表示使能硬件并行乘法器,”d”表示使能JTAG调试接口。在BK处理器配置中是否存在乘除扩展集,实际上只有处理器支持的指令在数量上的区别。从RTL和UVM的角度来看,这意味着现有的RTL模块更长,指令解码器更加复杂。然而,当使能压缩指令扩展集,就要给RTL中加许多新的逻辑块,并且需要一个专用的指令译码器。这就要求便宜额外的RTL文件来描述这些新的逻辑块。从UVM的角度,需要为压缩指令译码器编译一个新的UVM agent,并妥当的连接到其余的UVM环境中。
1.第一种选项是将配置层放在自动化流程的开头。Codasip通过在高级别的CodAL语言描述中插入配置字符串来实现这一点。图2展示了Codasip Studio(处理器开发环境)中的图形配置入口。图中,配置字符串被破折号分为了三个部分,第一部分指定了处理器的名字和流水周期,第二部分包含了所用的ISA扩展集,最后一部分指定可用的硬件扩展。
(1)bk3-32IM-pd: 在CodasipStudio中输入bk3-32IM-pd的配置字符,所定义的处理器模型流水周期为3,并支持32bit位宽。支持的指令包括基本集成指令(”I”),乘除指令(”M”)。硬件扩展有两个,包括并行乘法器(”p”)和JTAG调试接口(”d”)。其他的设置如内存容量或者是否使能缓存,都能在这个窗口里找到。配置完成后,就可以通过单击为这个指定的配置自动生成RTL 和UVM。
图2 用Codasip Studio中配置bk3-32IM-pd
(2)bk3-32IMC-pd: 在Codasip Studio中配置bk3-32IMC-pd处理器时(如图3),使能压缩指令扩展集不会产生任何开销。唯一需要的操作是重构RTL 和UVM 环境,以便反映配置的变化。
图3 用Codasip Studio中配置bk3-32IMC-pd
2.第二种选项适合手动写RTL和验证环境,是通过ifdef 结构和相关脚本来实现RTL和UVM的配置。用这种方法,RISC-V的多种变体就只需要一种RTL 和验证环境。
(1)bk3-32IMC-pd: 要编译源文件,我们使用RTL和UVM 常用的编译器定义选项,如图4所示。如示例1中的代码所示,可以配置的各种扩展都包含在各自的定义块中,比如,’ifdefEXTENSION_M将”M”指令集放在decoder.svh 文件中。在编译时用+define+EXTENSION_M将文件编译进去,”M”指令集就能被译码器识别。例中和覆盖率相关的部分也是一样的。因此,这种方法原则上允许开始验证之前的编译过程中配置UVM环境,更重要的是,它让为新的ISA或者硬件扩展配置UVM环境变得更容易些。
图4 使用Define命令编译所有文件
例1 bk-32IM-pd配置的ifdef部分的代码片段
(2)bk3-32IMC-pd: 加入压缩指令扩展集的时候,有一点至关重要,那就是要确保压缩指令译码器的agent已经被编译和连接到环境中。如例2,在compile.tcl文件中,’ifdef EXTENSION_C中的agent包包含了所有压缩指令译码器的agent文件,dut.sv文件中,’ifdef EXTENSION_C中连接agent和处理器RTL信号,在env.sv文件中,将agent注册到UVM环境中的配置数据库中。
例2 bk-32IMC-pd配置的ifdef部分的代码片段
3.第三种选项是使用UVM的标准配置方法(uvm_config_db),这种方法类似第二种使用ifdef的方法,但仅限于UVM环境。
(1)bk3-32IM-pd: 如例3的代码片段所示,使能乘除指令扩展集由保存在UVM配置数据库中的extension_M参数反映。接下来,通过调用UVM环境中特定部分的get函数,比如覆盖率文件,就有可能得到extension_M的值,并利用这个值创建新的对象。
例2 bk-32IM-pd配置的uvm_config_db代码片段
(2)bk3-32IMC-pd: 当我们使用uvm_config_db程序来配置压缩指令扩展集时,连接额外的agent和编译源文件就变得困难。这就告诉我们这种方法适合ISA或者硬件扩展这类扩展处理器功能,而不是额外的逻辑块,这样的逻辑快需要被编译和连接到环境中。
通过对比以上所有的方法,我们在表1 中总结了它们各自主要的优缺点。
优点 | 缺点 | |
更抽象层设置配置并生成RTL+UVM | 设置需要的配置更加容易;生成的源文件有更好的可读性,速度快 | 生成的RTL+UVM只能用于特定配置的处理器 |
Ifdefs的结构,手动编写RTL和UVM文件 | 支持多种配置 | 源文件代码可读性差 |
uvm_config_db,手动编写UVM文件 | UVM源文件中支持多种处理器配置 | 源文件可读性差,仅限于UVM |
基于ISA仿真器定义一个黄金预测模型
当不考虑微体系结构实现细节,ISA仿真器或者指令仿真器只用来执行指令流,这种方法可以提高性能,通常都是用C/C++/SystemC来实现这种仿真器,表示这是一种参考行为。
Codasip用IA模型生成一个ISA仿真器作为自动化流程的一部分。ISA仿真器在UVM验证中被用作黄金预测模型,也就是说,我们将用这个模型验证用CA 模型生成的RTL 处理器模型(DUV)。这种方法真正实现起来还有许多障碍,比如C++实现的ISA模型本质上是异步的,而RTL是周期精确,这个问题我们可以用内存加载器loader解决,这个内存加载器可以将程序一致加载到RTL和C++中的程序内存中,之后,两者以各自的速度运行。结果比较是通过缓冲较快部分的输出处理的:当黄金预测模型FIFO和记分板的DUV FIFO中出现数据时,执行结果比较。
在Codasip自动化流程中,配置包含黄金预测模型的UVM环境要比手写所有组件手写的标准流程快得多。如此一来验证工作节省的时间以每人每月为单位计算。
利用硬件仿真和FlexMEM方法有效的进行测试
在节省时间方面,获得一个可用的黄金预测模型仅仅是第一步,第二个更重要的标准是仿真运行时间。RISC-V ISA的灵活性允许实现几十种可用的RISC-V微架构处理器。比如,在Codasip 我们目前正在研究48种RISC-V的变体,其中每一个微架构都是由大约500条指令(c程序、基准测试、随机生成的汇编语言),至少10.000个程序验证的,因此验证需要的时间将是巨大的。为了减少时间成本,我们把验证分成了几个阶段。第一阶段,我们在RTL仿真中运行适当的有代表性的程序,利用了仿真器非常好的调试能力。在第二阶段,调试之后,我们把其余的程序(主要是随机的一部分)放在硬件环境中去运行。
RTL仿真的主要缺点是不能并行执行任务,比较好的方案是使用真实的硬件并利用硬件固有的并行性。许多已经出版的论文和书籍都提出了在运行时间上有可能的改进方法,比如参考文献[8]中的例子;本文的目标是展示如何验证RISC-V,尤其怎样更好的利用硬件环境。
1.首先,我们先来比较纯软件仿真环境和纯硬件仿真环境的运行时间。这意味着,我们要测量三个时间,一个是特定的程序加载到内存部分所用的时间,二是UVM环境使用Questa RTL仿真工具运行RISC-V BK 处理器的一个程序所用时间,三是在硬件上运行相同的程序所用的时间。本例中,我们使用了一个非常简单的硬件仿真顶层模块,它实例化了BK处理器。一开始,程序被加载进去,取消处理器的复位信号,处理器就开始运行程序。这类简单的比较清晰地表明了特定DUV的最大硬件模拟性能,因为没有相应的软件拖慢仿真速度。此外,还可以评估特定程序使用硬件仿真器的好处,估计可以使验证加速100倍。
2.第二步,我们推荐创建两个顶层模块:硬件仿真器顶层和TB顶层模块。硬件仿真顶层实例化了BK处理器,TB顶层模块包含了一个简单的SV类,这个类有两个管道分别开始程序和结束程序(它也开始比较参考内容和寄存器内容,现在只是用一个简单的比较来完成,所以这个阶段没有使用黄金预测模型)。这种方法让我们可以在处理器上运行更多的程序,同时也遇到了第一个瓶颈。比如,我们发现处理处理程序非常快,但是加载新的程序会拖慢硬件仿真速度25倍。为了解决这个问题,我们在之后进程中加上FlexMEM块,本文的下一部分将对此进行描述。
3.最后,建议把所有要使用的UVM对象连接到TB顶层模块,因为这些UVM对象通常会增加一些额外的问题。我们把SV程序加载器loader,Codasip C++ ISA仿真器当作参考模型连接,一个主动UVM agent驱动处理器的输入端口,读取解码指令(测量指令覆盖和指令序列覆盖的重要性),被动的UVM agent 读取总线上的事物,结构寄存器和内存的内容,它们会和参考模型给出的参考结果进行比对, 硬件仿真的性能降低了很多,我们开始分析Questa以及硬件仿真器。分析结果发现,使用FlexMEM块可以有效缩减了从软件向硬件加载程序的时间。但是,我们必须实现所谓来自主动UVM agent的“事物”,这样才能驱动处理器的输入端口,监控来自处理器的译码指令,监测程序的结束。我们还意识到,测试平台顶层模块和硬件顶层之间事务的传输,寄存器和内存的内容传输都会影响仿真性能,因此将黄金预测模型及与记分板的比较放在软件测试平台依然会拖慢速度。于是我们决定将预测模型放在测试顶层的外面,并与硬件顶层相连,可以在程序结束后用diff工具开始进行结果比较。这就意味着黄金预测模型和硬件仿真可以并行运行,我们使用来自硬件环境中的处理器的结果数据和来自黄金预测器的参考数据,综合得到的环境如图5。
图5 Codasip 移植 UVM到Veloce® Emulator
通过上述三个步骤,我们可以给出表2“仿真性能结果”。当前版本已经实现了25.6x的加速,我们正通过在测试台上和仿真端进行数据聚合,以及在硬件仿真上直接测量指令覆盖率尝试进一步的优化。
一个程序的平均运行时间(~10万条指令) | 加速 | |
纯软件仿真验证VS纯硬件仿真验证 | 软件仿真:128
硬件仿真:1.28 |
100倍 |
带有简单测试平台和管道的硬件仿真验证 | 32 | 4倍 |
使用UVM,FleMem和外部ISA仿真器的硬件仿真验证 | 20 | 25.6倍 |
总结
本文围绕RISC-V IP核的灵活性讨论了三个主题。第一个主题分三个部分描述了配置层的使用,第一部分介绍了CodasipStudio处理器开发环境使用的自动化流程,该流程允许用户简单的输入所需的配置,此配置必须是被开发环境支持的,然后开发环境自动生成验证和应用程序开发所需的所有工具;第二部分解释了在RTL和UVM文件中定义配置层的用法。由于编译器的定义允许标记特定处理器扩展部分的代码,用户可以用一个源文件包实现多种配置;第三部分阐述了UVM配置数据库的使用过程。它的优点在于UVM本身的集成配置,由于它仅限于UVM文件,RTL文件一次只能包含一个配置。
我们利用实践将一个基于纯软件仿真的UVM环境转换成了一个硬件仿真环境,并测量了加速的结果。通过与Mentor的合作,我们认识到处理器中的某些部分需要经过特殊处理才能充分利用硬件仿真性能。把参考模型从UVM中提出来,实现事物的处理,在UVM外利用diff进行比较,通过这些手段,可以使我们移除DPI层的重要部分并减轻软件和硬件仿真环境之间的传输负担。当然,加载程序到程序内存时,使用FlexMem方法要比直接使用硬件仿真器内存的readmemh和writememh功能更加节省时间。
扫描二维码,观看路科芯片验证【V】系列视频课程介绍
参考文献
[1] RISC-V Foundation. (2017, July) RISC-V Specifications
[2] David Patterson and John Hennessy. (2017) ComputerOrganization and Design, RISC-V Edition, Morgan Kaufmann.
[3] John Shen and Mikko Lipasti. (2013) Modern ProcessorDesign, Waveland Press.
[4] Jari Nurmi. (2007) Processor Design, Springer.
[5] Marcela Zachariášová, Zdeněk Přikryl, et al. (2013)“Automated Functional Verification of ASIPs,” in IFIP Advances in Informationand Communication Technology. Springer Verlag, pp. 128–138.
[6] Verification Academy. (2017, July) UVM Configuration
[7] Rainer Leupers and Olivier Temam. (2010) Processor andSystem-on-Chip Simulation, Springer
[8] Hans van der Schoot and Ahmed Yehia. (2015) “UVM andEmulation: How to Get Your Ultimate Testbench Acceleration Speed-up”, DVConEurope 2015.
[9] Veloce emulator
[10] Janick Bergeron, Alan Hunter, Andy Nightingale, EduardČerný. (2006) Verification Methodology Manual for SystemVerilog. Springer.
往期精彩:
2019验证VIP春季班 早鸟报名通道扫码报名稿!
二胎未生,程序员已死
实锤!30W+!!!2018芯片校招薪资比肩互联网!
理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够了
Verification和Validation傻傻分不清楚?面经重点!
没想到,双十一只花10块钱,我竟然爱上了加班
点击阅读原文下载论文