1. 引言
随着芯片自身复杂度的逐渐增大,其中包括芯片的功能愈加复杂,其制造工艺的愈加精细及其制造费用愈加昂贵,任何存在设计错误的情况都不能进入流片,其所带来的风险是不可承受的,因此验证也开始变得尤为重要,验证的目的就是为了找出设计过程中可能出现的问题和错误。
验证方法学经历了一些变化,从最初推出的VMM (Verification Methodology Manual),到OVM (Open Verification Methodology),再到2011年推出的UVM,UVM继承了前两种方法学的优点并且得到了三大EDA厂商的支持,UVM已经得到了市场的肯定 [1]。
本文需要实现1000BASE-T千兆以太网MAC层协议以及UDP协议,完成与PC机或其他设备进行千兆以太网通信。千兆传输广泛应用于广告屏显示、图像传输、游戏等,千兆以太网联合DDR3等存储器可以实现图像的存储,显示和传输,以FPGA为采集和传输的基础,克服了使用专用硬件灵活性不足且昂贵的缺点,并且利用FPGA的并行性可以实现高清的图像采集系统,通过千兆以太网传输的方式,可以在远程终端实现灵活的展示方式,如通过多终端的应用软件或通过网页的方式呈现 [2]。文献 [3] 基于UVM的千兆以太网MAC控制器验证设计与实现采用以SystemVerilog语言结合UVM搭建验证平台,对整体硬件模块进行了功能验证,但其只收集了代码覆盖率和功能覆盖率,并没有做回归测试和收集断言覆盖率去判断时序的正确性,验证完备性有待提高。
传统的VHDL验证方法严重缺乏组织性,改变激励相当困难,对于不同场景下的激励传输需要对代码进行巨大改动,不仅需要大量时间去建立平台而且平台也极难维护,平台不可重用。UVM验证方法学只有在发现设计存在漏洞时才需要对代码进行修改,且激励的产生是独立的,各个模块的环境是独立封装的,对外不需要保留数据端口,可以很快地创建新的测试,平台可扩展可重用,这是UVM平台巨大的优势。UVM支持工业标准,可以促进平台的标准化,通过OOP面向对象编程的特点及使用覆盖率组件提高了重复使用率,这些都是UVM的好处。本文提出用UVM验证方法学,并且使用SystemVerilog语言进行编写测试,SystemVerilog的优势在于能够允许用户在多个项目中使用统一的语法来构造可靠且可重用性的平台,该平台的搭建将会实现对图像采集、显示和传输等功能的全面验证。采用回归测试的策略确保能够按照预定目标实现新的功能,伴随着代码覆盖率、功能覆盖率、断言覆盖率的收集,通过不断地回归测试来逐步提高验证的完备性。
2. UVM验证方法学及研究内容
2.1. UVM验证方法学
UVM (Universal Verification Methodology),其正式版本于2011年2月由Accellera推出,并且得到了Sysnopsys、Mentor和Cadence的支持。验证语言SystemVerilog和UVM的结合使得用户可以不再受限于特定的仿真器,可以随意切换到任何一家。这种通过UVM搭建的验证IP,可以很好地实现跨平台复用。UVM平台框架可以帮助我们解决环境构建上的难题,从而将注意力放在对DUT的测试功能点提取和测试用例上,提高工作效率。
UVM方法学的优势在于打通了各个EDA公司和IC公司的验证方法通道,便于验证技术的交流和验证人员的技能提升,也使得IC公司对于使用工具的选择广泛了许多。对于用户来说,不再受限于使用哪一种仿真器及哪一家的验证IP,从而将主要的精力放在对设计的验证上,从而提高验证的效率。其服务目的在于提供一些可以重用的类来减轻不同项目之间水平复用和垂直复用的工作量,通过这种可复用性的平台可以为验证人员提高一套可靠性的框架 [4]。
UVM面向所有数字设计,涵盖了从模块级到芯片级,ASIC到FPGA,以及控制逻辑、数据通路到处理器验证对象的全部场景。
我们在探索UVM世界的过程中,会逐步认识到UVM的类库地图和其工作机制,了解UVM平台所需的组件和层次构建,再到各组件如何建立通信及其测试场景的构建,最后到其寄存器模型的应用。
2.2. 研究内容
本文研究的千兆以太网PHY芯片(VSC8601),该芯片支持10/100/1000BASE-T,与我们电脑、FPGA、MCU等处理器通信必须遵循RGMII协议,使用PC机将图像数据信息通过千兆以太网发送给FPGA,存储到DDR3中,HDMI将DDR3中数据读出显示到显示器上,同时将图像数据回传到PC机对应的上位机上。硬件连接图如图1所示。通过搭建可重用性的验证平台来验证FPGA涉及到的所有功能模块,其验证结果以覆盖率收集的结果作为测试功能的指标。
3. 1000BASE-T图像传输系统的设计模块
本文的验证对象是1000BASE-T图像传输系统模块,在进行功能验证之前,将对该系统的设计模块进行简单的介绍,为后期搭建UVM验证平台建立理论基础。1000BASE-T图像传输系统的设计模块框图如图2所示。
由图2可知,系统主要分为7个模块,分别包括iddr_clk数据转换模块、run_clk_ctrl跨时钟域处理模块、image_ctrl图像提取模块、gen_frame数据帧传输模块、crc校验模块、checksum模块和oddr_clk数据转换模块。其中iddr_ctrl数据转换模块功能是将双沿4 bit数据转换成单沿8 bit数据。run_clk_ctrl跨时钟域模块功能是采用双口RAM进行跨时钟域,将系统时钟经过PLL使得频率50 MHz变成125 MHz。image_ctrl模块功能是实现RGB图像信息提取。gen_frame数据帧传输模块功能是将数据组成基本的千兆以太网成帧数据。checksum模块功能是对IP_checksum和UDP_checksum进行计算,组成无crc校验的千兆以太网UDP协议包。crc校验模块功能是推导出32位crc校验分成4个字节到无crc校验的千兆以太网协议包后面,组成完整的千兆以太网UDP协议包。oddr_clk数据转换模块功能是将单沿8 bit数据转换成双沿4 bit数据。

Figure 2. Design block diagram of image transmission system
图2. 图像传输系统设计框图
本文主要研究内容是完成千兆以太网图像传输系统的功能验证,对整体功能和输入输出接口协议进行分析,对内部模块(7个模块)进行接口时序分析,明确验证目标,此外该设计还需要支持以下功能,支持RGMII接口协议、支持UDP协议、数据结构符合IEEE以太网标准。根据协议和功能需求,将该系统细分从行为到结构再到物理级,这种方式可以节省时间成本及提高设计效率,最重要的是独立模块可重复使用 [5]。验证周期从创建验证计划开始,接着开发验证环境,当验证环境准备完成后,提供可供测试的激励对设计的输出结果进行比对,当硬件设计经历了大量的激励测试后,开始进行回归(regression)测试,即将已有的所有测试序列都执行一次。
3.1. UVM验证平台的搭建
图3为UVM验证平台架构图,该平台架构总共包括了UVM平台常用的组件,如env (容器类)、agent (封装)、sequencer (序列发生器)、driver (驱动激励)、monitor (监测)、scoreboard (计分板)、reference_model (参考模型)、sequence (序列)等组件 [6]。
通过interface接口来进行软件世界和硬件世界的连接,即平台和FPGA的信息交互 [10]。平台相应地采用了6组不同的interface来进行连接,同时采用6组不同的agent封装所用到的sequencer、driver、monitor组件,agent通过模块的功能进行划分。
其中多个sequence同时挂载到相应的sequencer上面,创建所需的sequence_item激励。sequencer的作用是为了传递sequence_item到driver,同时还具备仲裁特性,允许特定sequence中的item激励优先通过。这时的sequence起到一定的协调作用,driver接收到item后,将激励发送到DUT的一侧,用monitor组件来监测DUT另一侧出来的数据信息,将其数据发送到scoreboard中,在scoreboard中进行期望数据和实际数据的比对 [7]。
平台的启动通过tb文件中的run_test()进行,sequence中的body()任务可以进行激励item的随机约束、准备发送激励item和完成发送激励item工作,代码如下:
task body();
uvm_sequence_item tmp;
bus_trans req, rsp;
start_item(req);
req.randomize with {data == 10;};
finish_item(req);
get_response(tmp);
`uvm_info(SEQ, $sformatf(got a item \n %s, rsp.sprint()), UVM_LOW)
endtask
该平台用到的virtual sequence不同于常见的hierarchical sequence,不同点在于hierarchical sequence面向的对象是同一个,而对于virtual sequence来说,它内部不同的sequencer可以允许面向不同的sequencer对象。对于更上层的环境,顶层的测试序列要协调的不再是面向一个sequencer的sequence群 [8]。virtual sequence可以承载不同目标的sequencer的sequence群,它是一个连接所有底层sequencer句柄的中心化路由器。

Figure 3. UVM verify platform architecture
图3. UVM验证平台架构
3.2. 验证方法
本文通过SystemVerilog语言搭建验证环境,该语言方便编写输入源,控制激励在不一样时钟周期的变化,而Verilog这种硬件描述语言需要综合成电路,因此它在书写测试平台和测试用例是不够方便的(测试平台和用例不须要综合成电路)。而SystemVerilog引入了面向对象编程OOP的概念,不需要满足可综合性。UVM是一种库,调用库的时候,可方便使用库中各类写好的函数,是一个成熟的框架体系。通过SystemVerilog语言编写环境结合UVM的验证方法,可以支持回归测试的策略进行全面的验证。
4. 验证功能点
根据该图像传输系统的设计需求,使用表格的形式列出验证计划,验证计划是为了完成验证目标的,包含了需要验证的模块测试功能点。接着验证人员进行开发验证环境,在开发的过程中,验证人员和设计人员可以一同回顾验证计划,确保验证功能点没有遗漏的部分,这种验证计划的回顾可以作为一个检查点。列出的验证功能点分析表,如表1所示。

Table 1. Test function point analysis
表1. 测试功能点分析表
4.1. 回归测试
回归测试指的是去验证硬件在某个缺陷修复或某项功能添加了之后,仍然可以通过以前的所有测试用例case和新添加的测试用例。这些可能存在的环境变化包括硬件设计自身的改进、缺陷修复、功能添加和验证环境的更新。回归测试的意义在于确保某项功能改动后没有引入新的缺陷并修复之前的漏洞,由于在做随机测试时默认的随机种子是不同的,伴随着代码覆盖率、功能覆盖率和断言覆盖率,可以通过反复的回归测试和补充定向测试来提高验证的完备性。代码编译完成后,输入仿真命令:vsim -i -classdebug -solvefaildebug -coverage -coverstore test E:/work/lab/coverage(工程路径) mcdf_full_random_test -sv_seed random +TESTNAME=mcdf_full_random_test -l macdf_full_random_test.log work.tb,其中的seed种子为随机种子,run -all之后仿真结束,可查看所有的覆盖率数据。
4.2. 覆盖率
覆盖率是衡量设计验证完备性的一个指标,覆盖率工具在仿真过程中收集信息并且得到覆盖率报告。通过这个报告可以发现覆盖之外的盲区,可以通过修改或创建新的测试进行填补。这个过程可以一直迭代,直到覆盖率达到预期结果。本文收集的覆盖率分为三种,代码覆盖率、功能覆盖率和断言覆盖率。
代码覆盖率又包含行覆盖率、路径覆盖率、翻转覆盖率、状态机覆盖率 [9],其结果用于衡量执行了设计中的多少代码,关注点在设计代码的分析上。
功能覆盖率和功能设计意图紧密相连,可以发现某个功能在设计中的遗漏,这是和代码覆盖率不同的一点,每次仿真都会产生覆盖率数据库,将这些数据信息合并到一起即可得到功能覆盖率,通过分析覆盖率数据可以决定修改回归测试集。如果想要测试一些边界情况可以使用交叉(cross)覆盖率。覆盖组covergroup方法通过sample()函数进行采样,get_coverage()函数获取覆盖率,start()和stop()表示使能或关闭覆盖率的收集。
断言覆盖率中的断言表示一次性地对一个设计信号在逻辑上和时序上的声明,形式验证工具证明断言可以跟随设计和测试平台同时仿真,它常用于查找错误,一旦检测到,仿真立即停止。一般使用cover property来测量信号或状态是否发生,断言覆盖率数据会被集成在同一个数据库中。
5. 验证结果及分析
针对设计模块中的功能测试点,在不同的test仿真测试中做随机测试和定向测试,测试结果如表2所示。通过仿真工具Questasim64_10.6c进行回归测试,每个随机种子都会生成覆盖率数据,将这些覆盖率数据合并到一起,通过生成的ucdb文件查看最终收集到的覆盖率结果,如下图4所示。

Table 2. Functional coverage results
表2. 功能覆盖率结果

Figure 4. Coverage collection and analysis
图4. 覆盖率收集分析图
做回归测试进行了大量的随机种子测试,如果有一些功能点无法覆盖到,针对未覆盖到的这些功能点,添加新的定向测试,测试结束后,合并所有的覆盖率ucdb文件,使用Questasim64_10.6c来打开UCDB利用工具来查看覆盖率,打开当前覆盖率数据库的同时生成HTML报告,这种方式更加直观有效。由上述表3结果可知,其中仓(bin)作为衡量功能覆盖率的基本单位,它能够记录数据被采样的次数,所有的covergroup的覆盖率构成了整个平台的覆盖率,Covergroups覆盖率和Assertion断言覆盖率都达到100%,表示验证的模块功能均已实现且RTL设计逻辑和时序正确。
6. 结语
UVM是一个以SV语言类库为主体的验证平台架,利用其可重用性可以构建具有标准化层次结构和接口的功能验证环境 [10]。UVM验证方法学有效结合了测试激励随机生成、自测试平台和随机化约束等方法,验证了设计代码的可行性。通过代码覆盖率、功能覆盖率、断言覆盖率达到100%,其中断言可以针对设计上的内容进行检查,证明该验证平台可以实现模块功能点的测试完备性及该图像传输系统中的模块能够正确的执行各自的功能行为,同时平台具有可重用性。这种验证方法可以降低风险及节省时间,可以缩短产品上市时间,并且在芯片开发上具有相当重要的价值。