| |
一、前言
前文提到verilog验证,仅仅是针对模块验证和小型项目验证。对于大型项目的验证,例如SOC类芯片,这种验证方式是不合适的,需要用到验证方法学。目前主要有OVM/VMM/UVM三种验证方法学,但并不局限这三种。如今最常用的还是UVM验证方法学。有关这方面的内容,本人接触得不多,只能做非常粗略的介绍,详细的还请自行参阅相关书籍。由于基于UVM的验证方法学是以SystemVerilog为基础的,因此推荐的《SystemVerilog与功能验证》是SystemVerilog入门较好的书籍。
二、推荐书籍
《SystemVerilog与功能验证》、《UVM实战》、《vcs User Guide 2016》
三、UVM验证
UVM究竟是什么呢?UVM是一种验证的理论,我们要应用这个验证理论的时候,理论总归要落地,那这个理论就表现为一堆基于SystemVerilog的源代码库,这也是为何本人要先推荐先学SystemVerilog语言的原因。(源代码库地址:http://xilinx.eetop.cn/viewthread-481243)
既然UVM表现的形式为一堆基于SystemVerilog的源代码库,那要应用这堆源代码,就要先了解UVM验证理论以及源代码的大致内容。《UVM实战》在这方面介绍得比较详细。那么,工具呢?有了源代码,没有工具可是没办法进行验证工作的。目前,笔者所接触到的信息,是采用VCS+VERDI作为使用UVM验证方法学的工具组合。后面的示例将贴出一个链接,大家可按照该教程学习UVM验证。
UVM架构图:
如上图所示,这是UVM的文件结构图,《UVM实战》对此有非常详细的介绍。红线为UVM验证方法学对应的文件架构,DESIGN为待验证的设计模块。
my_env,仿真顶层文件;
i_agt,输入代理文件,主要是将sqr,drv,mon做个封装,没有更多的功能,
o_agt同理;
sqr,激励信号产生文件,随机约束在这里起作用,这部分的内容非常多!
drv,激励信号驱动文件,将sqr文件产生的激励信号送入DESIGN模块;
mon,driver监视器,截获drv发送的激励信号,送入到mdl模块中;
mdl,行为模型模块,是用高级语言,例如C写就的,该模块功能与DESIGN功能是一一对应的,mdl的输出信号作为DESIGN输出信号的参考比较标准;
mon,DESIGN监视器,截获DESIGN的输出信号,送入scb中;
scb,记分板模块,比较mdl和DESIGN的输出信号是否一致,一致则表示一部分DESIGN的功能经过了验证;
具体流程:sqr模块产生DESIGN所需要的各种激励信号;接着,drv模块将激励信号送入到DESIGN模块和mon模块;DESIGN模块产生对应于激励的输出,被mon模块捕获;与此同时,mon模块将激励信号送入mdl中,mdl也产生对应于激励信号的输出;mdl和DESIGN两者产生的输出信号送入scb中进行对比,以此来对已验证的功能进行计数,也就是功能覆盖率统计。
SV+UVM的验证平台,本人对此并没有做过很多的研究,只是将推荐的书籍看过一遍。至于如何把握UVM验证的重点,本人觉得重点应该在故障模拟、激励的构造(sqr),行为模型(mdl)、覆盖率(代码覆盖率 功能覆盖率、断言覆盖率等)等方面。《UVM实战》这本书没有很详细的介绍故障模拟(用于产生测试激励)、行为模型、覆盖率等问题。《SystemVerilog与功能验证》对覆盖率问题、随机约束问题有专门的章节介绍。对于如何使用VCS生成代码覆盖率,本人不是很熟悉,网络有文章有介绍,如下网址所示:http://www.docin.com/p-541502332.html。对于功能覆盖率,断言覆盖率等覆盖率问题,则需要了解其它信息。
另外,利用UVM验证方法学验证设计,还需要掌握断言(assert)相关的知识,会更利于验证。《SystemVerilog与功能验证》中有断言的部分内容。
四、示例
具体的示例,大家可以在EETOP上搜索该文章。http://bbs.eetop.cn/thread-578008-1-1.html,《VCS+UVM+VERDI+Makefile
验证环境》。如果大家有兴趣,可以将本人提供的UART示例改用UVM验证方法去实现一遍。