为适应日益复杂的系统芯片SoC(System on Chip)设计,新一代芯片设计和验证语言SystemVerilog应运而生,并在2005年11月被美国电气和电子工程师协会(IEEE)批准为新标准[1]。在此基础上,Synopsys公司和ARM公司联合推出了VMM验证方法学[2,3]。运用VMM方法学提出的规则和标准函数库,可以快速搭建功能强大的验证平台。通过受约束的随机激励,并以覆盖率为指导,可以快速完成系统功能验证,显著提高验证效率。
文章以实际工程项目为背景,构建了一种符合VMM方法学标准的系统级软硬件协同验证平台。同时通过对实验数据的分析,提出了用于优化随机激励约束的方法。
1 系统级软硬件协同仿真验证平台
一般仿真验证SoC的策略可分为3个步骤:模块验证、集成验证和系统验证[2,4]。其中系统验证平台中包含处理器CPU或DSP[2],并且采用软硬件协同验证方法。因此系统级软硬件验证比其他形式的验证更贴近真实环境,在仿真中可以观察到软硬件运行的所有情况,这样可以快速有效地定位问题并进行系统性能综合分析。但是系统级软硬件协同仿真验证也存在验证平台搭建周期长、编译仿真时间长和资源消耗大的问题。针对这些问题可以采用VMM方法学推荐的方法和标准函数库,并采用成熟的VIP(Verification Intellectual Property),快速搭建验证平台。同时通过一次编译多次仿真的验证方式,以提高验证效率,缩短验证周期。
图1所示是一种符合VMM标准的系统级软硬件协同仿真验证平台。在这里,硬件指RTL(Register Transfer Lever)设计,包括ARM核处理器模型。软件指用汇编语言和C语言编写的程序,通过编译加载到仿真环境中由ARM核处理器模型执行[5]。验证平台由SystemVerilog语言实现,在RTL级仿真验证。
1.1 验证平台的架构
图1所示的验证平台符合可重用性[2,6],即不同的DUT(Design Under Test)模块可以共用同一个验证平台。验证平台结构被模块化和层次化。每个模块的功能和层与层之间的接口被明确定义,这使得验证平台十分灵活。
1.1.1 测试层
测试层主要是编写各种测试案例(Testcase),包括修改生成器的约束,定义新的随机场景,同步不同事物处理器和创建定向激励[2]。通常,在仿真的进行中要不断查看搜集的覆盖率,并以此来修改随机激励的约束条件,或者针对难以覆盖的边角情况编写定向激励。适当的约束条件可提高覆盖率收敛速度。
1.1.2 场景层
场景层由生成器(Generator)产生可控且同步的事务。生成器根据测试层提供的静态变量和约束条件,随机生成不同的配置信息和数据。配置信息通过功能层的事务处理器传递给命令层的软件程序,用于配置DUT。同时配置信息还要传到VIP事务处理器用于配置VIP模块。
1.1.3 功能层
功能层将场景层随机生成的配置信息和数据通过事先约定的通道传递给命令层的软件程序,另外检测VIP事务处理器传回的数据,送给计分板(Scoreboard),实现验证平台的自动检查功能。
1.1.4 命令层
命令层包括控制ARM核运行的软件程序(ARM Core Software,图1中带纹理方框),需要接收功能层通过通道(Channel)传递过来的配置信息和数据,同时还要配置和驱动DUT完成数据传输。VIP事务处理器(VIP Transfer)是用于验证DUT的成熟验证IP模块。VIP监视器(VIP Monitor)属于VIP模块,用于监视DUT与外部通信的接口信号。命令层还包含一个或多个AMBA总线监视器,属于成熟的VIP模块,用于监视多层AMBA总线(Multi-layer AMBA Bus)[7]。
1.1.5 信号层
在信号层,例化了所有SoC模块,实现系统级的功能验证。除AMBA总线外,主要还包括ARM核、片上RAM、中断控制模块、DMA控制模块以及其他模块。
1.1.6 功能覆盖率
功能覆盖率可以从验证平台的其他模块中收集,一般没有特定的限定。
1.2 验证平台中软硬件通信方式
上面所介绍的验证平台与其他验证平台最大的区别就是引入了软件程序,构建该验证平台的关键是软件与硬件之间的通信。一般软件是用汇编和C语言编写的,硬件与验证平台分别是用可综合Verilog语言和SystemVerilog语言编写的。在这里规定用软件程序与SV(SystemVerilog)之间的通信表示软件程序与硬件之间的通信,本文介绍以下三种软硬件通信方式。
(1)软件向总线未用地址写数据实现软件程序向SV的单向通信;
(2)通过SoC上的具有通信功能的模块,实现软件程序与SV之间的通信;
(3)通过片内RAM,实现软件程序与SV间的双向通信。
在实际使用过程中,通过第一种方法输出软件程序运行过程中的信息,通过第三种方法可以作为软硬件间信息通信的双向通道。图1所示的软硬件协同仿真验证平台就是通过第三种方式实现软硬件双向通信的,同时也用到了第一种方式,输出软件运行过程中的信息。第二种方式可以视情况使用。
图2所示是一种系统级软硬件协同仿真验证平台的结构,虚线中为SoC的系统架构。为满足验证需求,在SoC系统架构中增添了两个模块:一个是Print Tube(PT)模块,用来实现软件仿真时的信息输出。当软件需要输出信息时,向PT模块写数据,PT模块会调用$display系统函数,显示传输过来的信息。另一个是RAM(Random Access Memory)模块,作为软件和SV的信息交互的通道。RAM模块有两个总线接口,一个链接到SoC系统总线上,软件可通过其读写RAM模块;另一个接口与验证平台中的BFM(Bus Function Model)模块链接,如AHB VIP Master[8]。同时在验证平台中使用RAL(Register Abstraction Layer)[9]方法,将RAM模块抽象为RAL模型。这样处理后验证平台对RAM模块的访问更简洁方便。