0 弁言
随着旗子暗记处理系统日益繁芜,数字芯片的功能验证已经成为了影响芯片上市韶光和本钱的关键。然而旗子暗记处理芯片的系统级验证仍面临着诸多寻衅。只管在测试验证领域已经发展出了很多自动验证方法,但是目前在验证繁芜旗子暗记处理算法时,多数仍须要利用人工添加测试用例的方法进行验证,耗费了大量人力物力。
验证旗子暗记处理算法的难点紧张集中在如何利用得当的方法搭建高效的参考模型。

旗子暗记处理系统中一样平常包含大量繁芜的数学算法,利用硬件措辞实现这些算法的验证事情每每须要丰富的履历与技巧。如果利用硬件措辞SystemVerilog来对这些算法进行验证,即便不考虑对验证工程师履历与技巧的哀求,也应把稳到利用硬件措辞SystemVerilog来实现这些繁芜算法很可能会利用与被测件附近的设计思路,产生类似的缺点,从而遗漏一些致命缺点。正是考虑到这一点,本文提出了一种利用Matlab软件与高等验证方法学(Universal Verification Methodology,UVM)联合搭建的功能验证平台。利用UVM供应的直接编程接口(Direct Programming Interface,DPI)在验证平台中通过C++连接Matlab,实现旗子暗记处理系统中繁芜的算法部分的验证,从而大幅提高了验证平台开拓效率以及平台的复用性,加快了仿真验证韶光。
1 DVB-S编码调制系统
数字视频广播(Digital Video Broacasting)是欧洲电信标准协会(European Telecommunications Standards Institute,ETIS)订定的关于数字电视卫星业务中帧构造、信道编码和调制的标准[1],被包括我国在内的绝大多数国家和地区所采取。该标准针对卫星数字多节目电视以及高清电视节目在固定卫星业务和广播卫星业务的一次发送和二次转产生发火出的规定,其调制办法采取四位移相键控(Quaternary Phase Shift Keying,QPSK),并采取基于卷积码和RS(Reed-Solomon)码的级联纠错编码。根据ETSI的ETS 300 421的规定,DVB-S的编码调制事理框图如图1所示。
根据DVB-S标准规定并结合实际利用时对参数的配置以及数据实时监测的需求,DVB-S的编码调制系统构造框图如图2所示。
2 UVM验证平台
2.1 验证平台概述
本平台的验证是系统级的功能验证,紧张目的是确保DVB-S编码调制系统电路设计与功能规范定义功能吻合。在DVB-S编码调制系统电路外围搭建UVM验证平台,采取受约束的随机测试方法将勉励施加到被测件的输入,末了通过输出进行自动比较,检讨是否精确,同时也要查看覆盖率是否达到了目标哀求,如果没有达到,该当开拓新的有效验证场景,通过迭代完成验证收敛[2]。其代码覆盖率和功能点覆盖率哀求均为100%。平台利用的UVM库版本为1.1c,Matlab版本为2008b。
2.2 基于UVM的验证平台设计与实现
2.2.1 验证平台构造
通用验证方法学UVM是基于SystemVerilog开拓的一套开源类库,起源于OVM验证方法学[3]。UVM类库中定义了一系列的标准类,并结合标准接口、Factory 机制、Phase机制、分层构造以及面向工具的设计思想使全体平台具有灵巧配置、可重用、可扩展升级等优点[4]。本文提出的验证平台成功地运用于DVB-S编码调制系统的仿真验证,其最紧张的特点便是将Matlab与UVM相领悟,从而办理了仅用硬件措辞难以验证的繁芜数字处理算法。该验证平台的构造如图3所示。
除了在范例UVM验证平台构造之外,本验证平台在参考模型(Reference model)中增加了外部接口连接到Matlab程序,对相应数据进行处理。
2.2.2 验证平台顶层组件设计
本验证平台中的顶层紧张是连接顶层Test_top和环境类Environment。在Test_top中紧张完成6个紧张功能:被测件的例化,测试环境(紧张指环境类)的例化,接口的例化,被测件、测试环境和接口之间的相互连接,全体测试环境时钟和复位的产生,验证平台的启动。
在环境类(Environment)中,紧张完成5项事情:例化代理类,例化参考模型,例化记分板,连接以上三个部分,完成验证平台的通用设置。在验证平台中,组件在环境类中的相互链接通过UVM中的fifo链接,这样可以方便地实现各组件间的异步吸收。环境类处于验证平台的顶层,因此在环境类中同时也完成了一些与全体验证平台干系的设置事情,如设置平台可接管的最大缺点数量,信息输出等级等。
2.2.3 测试组件的设计
测试组件是验证平台的最主要也是核心设计,完成了验证平台的紧张功能。其紧张设计思想是尽可能地将对被测件单一功能项测试的组件进行封装,使组件能够尽可能少地依赖外部掌握。紧张包括7类关键组件:
(1)代理(agent):测试组件的顶层。由于DVB-S编码调制系统的输入输出关系相对大略,因此在本验证平台中只利用了一个agent对测试组件进行封装。agent紧张完成sequencer、驱动器(driver)、监视器(monitor)的例化和连接。
(2)驱动器(driver):紧张实现验证平台向被测件间输出的接口协议。在这里事物级的数据流将被转换为比特流,还有一个主要功能是将正在发送数据放到uvm_analysis_port端口上,供验证平台利用。在本验证平台中紧张有两个driver,分别是向参数寄存器组发送参数的driver_parameter以及发送串行数据的driver_data。
(3)监视器(monitor):紧张实现验证平台吸收被测件输出的接口协议。这里将输出总线上的比特流转换为数据帧放到uvm_analysis_port,供验证平台利用。在本验证平台中也设置了两个监视器monitor_data和monitor_source,用来分别监视输出的数据流以及对监测数据进行读取。
(4)transaction类:是传入数据的紧张载体。在验证平台中,共设置了3个不同的transaction类,用于发送参数和原始数据的transaction_source,用于吸收结果的transaction_data以及后面将提到的transaction_case。
(5)sequence类:紧张功能是将测试用例传来的测试场景转换为transaction中数据。在本验证平台中sequence类紧张将测试用例传来的参数传入Matlab程序,并由Matlab产生真正的原始数据写入到transaction_source中。
(6)参考模型(reference model):紧张是仿照被测件的行为,通过uvm_blocking_get_port吸收驱动器driver_parameter和driver_data传来的数据,并将这些数据传入Matlab进行处理,然后将处理结果通过uvm_analysis_port传给记分板。
(7)记分板(scoreboard):紧张功能是比对参考模型和被测件产生的数据,以确定是否存在问题。记分板(scoreboard)通过uvm_blocking_get_port吸收来自监视器monitor_data、monitor_source以及参考模型的数据。
2.3 C++、Matlab接口的设计
2.3.1 UVM验证平台与C++的接口
SystemVerilog供应了方便的DPI接口来连接C++代码,只需SV文件中进行大略的声明并在脚本中进行相应的编译链接即可以利用[5]。在本验证平台中首先在参数文件中加入了对打算函数compute的声明如下:
import \公众DPI-C\公众 context task compute(input int data[S_NUM], output int I[NUM], output int Q[NUM]);
然后在model_data中直接调用函数compute。在验证平台中C++与验证平台的接口紧张是用于将验证平台与Matlab程序相连接,因此没有用到繁芜的功能,仅仅是将数据以得当的类型传入。这样设计的目的是有效利用用于事理验证的Matlab仿真程序。只管Matlab仿真程序的运行效率远低于C++程序,但相对付HDL的仿真来说,这个效率问题每每可以忽略,而且Matlab仿真程序拥有的多种算法资源加快了验证平台的搭建。
2.3.2 C++与Matlab的接口
下面以compute函数为例解释在C++中调用Matlab函数的过程。个中函数声明如下。
int compute(const svOpenArrayHandle source_bit,svOpenArrayHandle data_i, const svOpenArrayHandle data_q)
在函数中,首先利用以下代码启动Matlab,个中头文件engine.h可在Matlab的安装目录下找到。
…
#include \"大众engine.h\公众
Engine ep;
engSetVisible(ep, 0);
…
利用自建函数input_arry将UVM传入C++的数据data进一步变换格式传入Matlab中成为数据x代码如下:
input_arry (ep, x, S_NUM , data);
个中自建函数input_arry如下:
void input_arry(Engine ep, char name, int num, const svOpenArrayHandle data_in)
{
/
输入: ep,打开matlab的句柄
num,数组长度
name,写入matlab的变量名
data_in,写入的向量
输出:无
/
int input_i;
double input_d= new double[num];;
mxArray input = NULL;
input_i=(int ) svGetArrayPtr(data_in);
for(int i=0;i<num; i++)
{
input_d[i] = (double)input_i[i];
}
input = mxCreateDoubleMatrix(1, num, mxREAL);//数据格式天生
memcpy((void )mxGetPr(input),(void )input_d,numsizeof(input_d[0]));//数据转换
engPutVariable(ep, name, input);//向matlab写数据
mxDestroyArray(input);
}
从Matlab到C++的转换程序与此过程类似,仅作反向处理即可,这里就不再谈论。末了将C++代码编译为动态链接库(dll)文件compute.dll,然后在脚本文件加入vsim-sv_lib./TestBench/c/compute即可完玉成部连接过程。
3 测试结果与剖析
仿真验证用例运行完成后,对代码进行了回归测试并对覆盖率进行统计。回归测试后代码覆盖率的统计结果为,DUT的代码覆盖率为99.72%,分支覆盖率为98.63%。剩余未覆盖到的情形如default语句很难覆盖到,并对这种情形进行了人工代码走查。因此达到上述代码覆盖率百分比的情形可以认为知足了目标覆盖率哀求。
UVM与Matlab联合仿真验证平台和完备利用硬件措辞编写的仿真验证平台的仿真验证韶光比拟如图4。从图中可以看出利用纯硬件措辞验证平台的测试用例均匀运行韶光为5.192 4小时,而利用UVM与Matlab联合仿真验证平台测试用例均匀运行韶光为2.646 6小时,均匀节约了近50%的韶光。
4 总结
本文采取基于UVM和Matlab联合搭建的仿真验证平台对DVB-S编码调制系统进行了功能验证,高效快速地达到了覆盖率哀求。该平台与纯硬件措辞仿真验证平台比较节约了近50%仿真验证韶光,而且可以利用Matlab中成熟的工具箱对各种数字处理算法进行编程,极大地降落了验证平台开拓难度,节约了开拓韶光并且提高了平台的复用性。
文中构建的平台构造移植性强,对其他类似的旗子暗记处理系统验证开拓具有非常大的借鉴意义。通过对UVM与Matlab联合仿真环境的利用,显著提高了仿真验证效率,为繁芜数字处理SoC验证供应了一条故意义的路子。
参考文献
[1] ETSI.EN 300 421.Digital Video Broacasting(DVB).Framing structure,channel coding and modulation for 11/12GHz satellite services[S].1997.
[2] 钟文枫.SystemVerilog与功能验证[M].北京:机器工业出版社,2010:5-7.
[3] Accdlera.Universal verification methodology 1.1 user′s guide[M].Cadence Design Systems Inc.,Mentor Graphics Corp.,Synopsys Inc.,2011,5:2
[4] 田劲,王小力.基于UVM验证方法学的AES模块级验证[J].微电子学与打算机,2012(8).
[5] Chris Spear.System verilog for verification[M].Synopsys Inc.,2008:329.