由于功能变得难以理解,通过肉眼检查波形来验证FPGA设计变得越来越困难。作为一个顶级油田服务公司,Baker Hughes主要设计小规模FPGA设计,通常少于10万门。但是在尺寸大小和复杂程度上一直在增加。同时,这些FPGA设计是需要很长集成时间的更复杂系统的一部分。
由于上述原因,我们的FPGA设计和验证需要找到不依赖于肉眼检查,缩短集成测试时间,标准化验证平台,使我们功能验证更稳健的新方法。
VHDL是我们RTL设计和验证平台的语言,但是验证平台没有标准化或鲁棒性,不能被重复使用。UVM提供验证平台标准化,这就是我们研究采用基于UVM流程的原因。
为了验证从VHDL到UVM 验证平台的转变,我们做了一个评估来比较三种不同验证平台的优缺点,即简单的VHDL验证平台,高级的VHDL 验证平台和UVM 验证平台。评价它们的标准是代码覆盖率,验证平台组件重复使用率和产生不同激励的难易度。
先前的设计和验证流程
我们的大部分设计是在实验室集成测试时调试的。设计和验证流程是开始于RTL设计和VHDL建立的验证平台。我们给DUT(design under test)提供简单的激励,然后通过仿真器肉眼观察波形。当对肉眼观察结果有足够信心时,我们会进实验室,下载代码到FPGA并集成到整个通常包含数个PCB的设计中。如果发现FPGA在集成过程中不能正常工作,我们会修改验证平台然后再次肉眼检查波形。我们重复这一循环直到没有新的bug发现,通常需要花费数周或数月时间。
我们的大部分设计都用于汽油或天然气提取工具,需要在高温、振动环境下使用。所以当我们挑选一个组件,比于FPGA,在工作环境下我们使它通过一系列合格检验程序。一旦FPGA通过检验,我们做板级的验证,然后做系统级验证直到最终的工具可以被使用。
特别需要注意的是FPGA的失败都是在系统级测试中发现的。所以在检验FGPA的同时,会有特别多的组件需要被检验。整个系统级别的验证需要一年到两年时间。如果我们能大程度的减少验证时间,增加FPGA调试的彻底度,这会积极影响我们整体产品开发计划。
设计和验证平台的评估
对于这个评估,我们使用了小型的FPGA设计,有三个接口: GPIO,ADC和UART接口。 GPIO和ADC是DUT的输入,UART是输出。验证平台从GPIO和ADC口发激励,从UART口读取数据。
图1:设计模块的评估。
首先建立简单的VHDL验证平台,然后过渡到高级的VHDL验证平台,最终过渡到UVM验证平台。
通过这一个过渡过程,三个验证平台在模型方面保持一致。尽管代码覆盖率是评估指标之一,但是并没有采用具体的改变来提高覆盖率,因为这样会影响三种验证平台比较的公正性。
简单的VHDL验证平台使用RTL-style 过程。高级的VHDL验证平台GPIO,ADC,UART transcation采用record,激励和检查采用procedure。 UVM验证平台中agent 被用于GPIO,ADC和UART接口。我们搭建的UVM环境的一个关键方面是用于产生激励的sequence是隔离独立的。
验证平台1:简单VHDL验证平台
在这个验证平台中,DUT, stimulus和check 是通过RTL-style 过程建模的。Check 通常是在实验室调试之后建模的。
我们建立一组简单的测试然后肉眼检查结果。在我们肉眼检测结果之后会插入几个断言,但是一个完整的验证平台需要长时间的实验室测试才能搭建起来。
对于验证DUT来说这是一个高互动率的过程。每当在集成测试时发现问题,都需要修改验证平台,重现引起这个错误的bug,修复设计,然后重回实验室测试它。
简单VHDL验证平台的结构图显示了三个接口。每个接口都有很多个process : GPIO有4个process,ADC 有3个process,UART有2个process。Check分布在各处。这反映了缺乏组织性。所有的process和check都是在每次集成测试发现bug之后添加的,使得甚至对于创建验证平台的人来说都很难知道将会遵循什么。
图2:简单VHDL验证平台结构图。
从上述评估中我们认识到需要大量时间来建立简单的VHDL验证平台,而且这一平台严重缺乏组织性,极难维护。同时,我们的关注点在产生激励,而不是checks。但我们需要的是对两者都关注。
验证平台2:高级VHDL验证平台
我们不想忽略搭建高级VHDL验证平台直接从简单的VHDL验证平台跳到UVM验证平台。 大家都知道UVM使用 transaction -level建模,所以我们试着使用record和procedure来建立高级VHDL验证平台。每个DUT接口都连接给record,类似于SystemVerilog的接口。然后增加激励或记录record的procedure。procedure被封装在只调用这个procedure的process中。自检验部分(在UVM中叫做scoreboard)在不同的checker procedure中建模。有三个process来产生激励,记录总线活动,另一个process验证结果。
图3: 高级VHDL验证平台结构图。
因为只有四个process,高级VHDL验证平台比简单VHDL验证平台的process少。每个stimulus process会把它所产生的送给check process。这将会检查UART packet是否与GPIO或ADC process 激励产生一致,并检查是否与scoreboard一致。所有check 都在一个process中,使得这一验证平台更具有组织性。更具组织性的结构使得维护更简单,且更容易理解和读懂代码。
研究发现这一验证平台具有更好的代码组织性,但是对于不同的test sequences要改变激励依然很困难,需要重写procedure,并对driver做巨大改动。procedure和record可以放在package中重复使用,但是没有标准化方法来遵循。这个验证平台依然庞大。
验证平台3:UVM
UVM验证平台使用sisytem verilog 语言和UVM库搭建。DUT的接口被分为几个不同的类,例如driver,monitor, agent。每个接口会创建agent,agent是激励的容器,也是接口的验证组件。因此,agent对于代码的重复使用很重要。
验证平台环境包含所有的agents和scoreboard。Scoreboard是用来自检验结果的。一个顶层的测试类包含测试环境和测试sequence(见图7)。
图7:UVM验证平台
上图所示,DUT在中心,有三个接口。不同的是,agent是连接在接口上。GPIO和ADC 每个agent 都有driver 和monitor。 UART agent只有一个monitor是因为DUT只在UART接口上传输。GPIO在驱动DUT的同时,也通过monitor观察DUT。Monitor 捕捉并发送信息给scoreboard.
在UVM验证平台中,接口的信息在系统级别是通过transaction传递的。这些transaction由test sequence产生。 Test sequence 由ADC和GPIO的不同的测试激励产生。Transaction产生并传递给agent,再传递给DUT。一组相同的transaction会传递给scoreboard. Scoreboard总会自动检查UART packet是否 与ADC和GPIO的transaction一致。
更关键的是,test sequence是和agent与验证平台环境隔离的。这点非常重要因为当需要改变test sequence时,不需要改变agent driver。
与VHDL的验证平台比较,只有当你在实验室发现bug时,才需要对drivers, procedures和process做大量改动。
这是UVM验证平台一个巨大的优势。因为在UVM中,test sequence是隔离独立的,可以很快的创建新的测试。在这种情况下,只通过改变测试sequence,代码覆盖率就可以从79%提高到85%。在UVM环境下改变测试sequence,重跑代码覆盖率花费时间少于一天。同比于VHDL验证平台需要花费数周来达到相同的改善。
我们可以从中学到,UVM中test sequence和验证平台是隔离独立的,使得我们可以更好的控制激励而不需要重新设计agent. 改变测试sequence可以简单高效提高代码覆盖率。UVM支持工业标准,这会促进验证平台标准化。对于VHDL来说没有验证平台工业标准。此外,UVM通过OOP(面向对象编程)的特点(例如继承)以及使用覆盖组件提高了重复使用率。这些都是UVM的额外好处。
总结和结果
三种不同验证平台的比较可以总结为以下几点:
- VHDL不太支持约束随机激励, 而System Verilog则支持,因此在UVM验证平台中ADC和GPIO可以带约束随机。
- 非常少的简单VHDL验证平台可以被重用。通过创建package,高级VHDL验证平台可以被重用。但是因为没有标准的方法,连接到一个新的验证平台并不直观。Package是结构性的,它只组织代码。此外,数据定义和函数定义(package 主体)被分离开。OOP会将这两者结合起来以便更好维护。UVM 验证平台因为OOP特点会更从容处理这些,使得验证组件和结构具有很高重用率。
- 两个VHDL验证平台迫使工程师侧重于创建激励而不是check。但我们所需要的是对两者都重视,这点在UVM中实现了。
- 简单VHDL验证平台的代码覆盖率是78%, 高级VHDL验证平台是74%。回想起从简单到高级VHDL的转变不是为了提高代码覆盖率本身,其目的是使用先进的结构(即record和procedure)并更具组织性。当使用有次序的test sequence时,UVM的代码覆盖率是79%,而当使用随机化的test sequence时,代码覆盖率提高到85%。代码覆盖率的改善难易程度在这里很重要。
- UVM增加了功能验证的鲁棒性,允许创建灵活的,适应性强的,可扩展性的验证平台。它提供了量化的,可测量的进展,同时通过改变test sequence可以方便增加代码覆盖率。
- UVM会降低工具集成时间,从而允许我们达到减少实验室集成周期的终极目标。
- 最后,UVM重点不是肉眼检查波形,这点非常重要,因为FPGA变得越来越大,对于肉眼检查越来越困难。
因此,我们最终将使用UVM来验证FPGA。
图8:验证平台的比较