UVM初级开发指南本文完成于13年10月,是自己在做验证过程中的第一个文档。文档中以张强的《UVM1.1应用指南及源代码分析》中的第一章的示例作为模型,简单讲述了UVM1.1d在QuestaSim中的应用,并添加了C语言和SV语言的联合仿真,对初学UVM验证的同学提供实际操作方面的帮助。因为自己的毕业设计需要用到文档中的部分内容,所以直到现在才将其分享出来,希望更多的人能够受益。II写在前面时光荏苒、岁月如梭,转眼已到自己毕业的时间。回首自己将近三年的研究生学习生活,一路坎坎坷坷,幸而得到身边许多良师益友的关怀和指导、帮助和激励,使自己得以勤奋自勉,顺利完成学业。以前自己主要是做单片机、MSP430、STM32,写过LDPC的译码Verilog代码,偶尔做做安卓客户端,玩过新浪的SAE,总体来说做得比较杂,对于验证方面的知识从来没有接触过。之后自己分到的任务是用SystemVerilog做一个CPU模型,用于测试我们的RTL代码。于是自己开始学习SV,在学习SV的过程中钟文枫的《SystemVerilog与功能验证》这本书给自己提供了很大的帮助,自己基本上将里面的代码都敲了一遍,就这样摸索了大约两周吧,摸索到了UVM(UniversalVerificationMethodology)这个陌生的东西,到这里,自己才算是摸到了验证的门沿。同时期间由于北大的需求(要实现两个软件自动执行然后文件夹比较的功能,也是用于验证),自己学习了批处理语言,给下一步工作打下了基础。然后找到张强的《UVM1.1应用指南及源代码分析》(去年8月张强出了一本《UVM实战-1》的书,可喜可贺,建议阅读该书)开始看啊看,主要看了其中的前两章,总共能看三遍吧,因为后面基本上都是源码的分析,我又用不到理论的东西(其实有空了还是要看一看的,这样出现问题了好排查),因此没有往后看,算是对UVM有个初步的了解,期间各种百度和google,UVM的中文资料还是比较少,最后在EETOP的IC验证板块中找到一些信息,后面自己有什么问题都在上面问。期间,将UVM1.1开发指南中的第一章的工程全部敲下来了并且进行了运行,其中收获颇丰,不仅对Questasim的软件进行了学习并且对UVM的编译和其框架以及其组件之间的关系都有了清晰的了解。同时对DPI接口进行了学习,通过DPI接口能够调用外部的C或者C++函数。这一段时间也差不多是两周吧,可以说这两周是我成长最快的两周,其中得益于张强的UVM1.1源码指南这本书,自己成长很快,同时少走了很多弯路。在做项目期间,自己深深感受到文档和注释的重要性,很多人都不喜欢写注释,不喜欢写文档。心里想着先将代码写完,到时候再补注释和文档,但是最终III代码写完,调试通过之后,就不想写了,代码已经通过还要注释干什么?对于另外一个接手工作的人,注释和文档太重要了。期间自己为了排查RTL里面的错误,因此要读待测代码,结果待测代码里面注释很少,另外文档和代码不同步,导致读代码效率很低,读了两遍还是没有理清思路(这里也有可能是自己能力的问题,呵呵)。因为深受其害,自己对这方面格外重视,我对自己的要求是:一个testbench必须有说明文档,一个case必须有测试功能描述说明,一个工程必须有修改说明,另外代码的注释应不低于70%,关键代码必须有更详细的注释。另外就是要重视计划,按照计划一步一步来,一个工作并不是说越快越好,而是按照进度保证完成质量。尤其是自己在做×××的验证的时候,基本上是现学现卖,很多东西乱成一团糟,最终出来的结果不如人意。究其原因,就是自己太过于追求速度,忽略了前期对基础知识的学习。最后,通过来自各方面的消息以及综合自己找实习的情况,感觉国内的IC验证还是不受重视,还是没有发展起来,只有外资企业在找验证在招数字验证方面的实习,国内本土的企业基本上都还没有动作,这对于这几年学验证的也是一个机遇吧,我相信随着国内IC行业的发展,对验证人员的需求会越来越多。郭乐2015-3-18于西安电子科技大学IV目录第一讲开发环境搭建.........................................................................................1第二讲UVM的helloworld..................................................................................3第三讲编译UVMDPI接口................................................................................6第四讲一个完整的UVMDEMO.....................................................................10第五讲hello_DEMO中的文件关系..................................................................13第六讲hellodemo中模块的连接关系..............................................................16第七讲如何在UVMDemo中调用C代码......................................................191第一讲开发环境搭建在win7上开发UVM,需要用到modelsim或者QuestaSim或者其他的软件(Ncverilog、VCS等)…不过对于初学者modelsim和QuestaSim足够了…鉴于QuestaSim对SystemVerilog语言有更好的支持,我推荐使用QuestaSim。这里涉及QuestaSim的版本问题。目前支持UVM的最低版本貌似是10.0a(其支持UVM1.1),因此推荐用10.0a以上版本的软件…我使用的是10.0c(14年6月更新:最新用的是10.1d-win64位,破解完全没有问题)。安装QuestaSim。QuestaSim安装不是很复杂…按照提示一步一步操作就可以…安装完成后需要做两件事情:1.破解软件,网上教程很多这里不再赘述;2.添加环境变量,需要在计算机-属性-高级系统设置-环境变量中选择PATH变量,然后将安装路径中的win32文件夹目录(我的目录是C:\questa_sim_10.0c\win32)添加进去,保存。另外win732位系统的用户可以将添加一个QUESTA_HOME的环境变量,然后内容写成安装的路径(我的路径是:C:\questa_sim_10.0c)。上面的添加环境变量,最好在用户变量和系统变量都做添加。至此QuestaSim环境安装好了…然后我们需要用到编译uvm库的gcc编译器,名称为:modelsim-gcc-4.2.1-mingw32vc9.zip(如果用win64位软件,请使用264位编译器gcc-4.5.0-mingw64,网上也可以找到),网上一搜一大把,这个编译器可以用于modelsim和QuestaSim,我们将其解压缩到随便一个目录中。然后同QuentaSim安装一样将其文件夹下bin文件夹的目录(我的目录是C:\gcc-4.2.1-mingw32vc9\bin)添加到环境变量PATH。这样编译环境也安装好了在这里,我们运行cmd打开DOS命令行。首先输入:gcc–version查看输入的gcc编译器的版本号。本机输出如下所示:说明gcc编译器安装成功了…接下来我们输入:vlog–version.将会输出当前QuentaSimvlog命令的版本号。本机输出如下图所示:说明QuestaSim也安装好了…至此,UVM开发环境算是搭建好了…但是这个环境是否能用,我们下一节用一个demo验证一下…3第二讲UVM的helloworld这一讲需要我们从网上下载一个UVM的源代码包,目前最新的UVM源码包是1.1d,我用UVM1.1a来说明,下载UVM1.1a源码包后加压缩,在其/root/example/simple/文件夹中能够找到一个helloworld的文件夹。在该文件夹中能够看到好几个后缀为sv的文件,具体文件的内容这里也不讲述,请参考systemverilog相关资料来学习。这里主要讲述如何编译和运行一个uvm的helloworld。1.将这个helloworld文件夹拷贝在一个合适的目录下,我拷贝的目录是:E:\questasim-project\hello_world2.在该文件夹下新建一个txt文件.然后打开文件,将下面的批处理文件拷贝进去,然后保存:vlibworkpausevlog+incdir+C:/questa_sim_10.0c/verilog_src/uvm-1.1/src+incdir+E:/questasim-project/hello_world/-LmtiAvm-LmtiOvm-LmtiUvm-LmtiUPFE:/questasim-project/hello_world/hello_world.svpausevsim-c-sv_libC:/questa_sim_10.0c/verilog_src/uvm-1.1/lib/uvm_dpiwork.hello_worldpause上面批处理的代码的具体意思如下所示:4编译自己的代码vlog+incdir+C:/questa_sim_10.0c/verilog_src/uvm-1.1/src-LmtiAvm-LmtiOvm-LmtiUvm-LmtiUPFE:/questasim-project/hello_world/hello_world.sv编译解释:+incdir+dir:Searchdirectoryforfilesincludedwith`includefilename-Llibname:SearchlibraryfordesignunitsneededwhenmtiAvmmtiOvmmtiUvmmtiUPF的意思目前我也还不清楚仿真代码vsim-c-sv_libC:/questa_sim_10.0c/verilog_src/uvm-1.1/lib/uvm_dpiwork.hello_world-c命令行模式-sv_libshared_objDPIsharedobject,withoutextensionwork.实体名运行仿真3.在写批处理的过程中,有个小问题需要注意到,就是从window系统的路径栏拷贝过来的路径是这样子的:E:\questasim-project\hello_world,但是在批处理中我们需要的路径是这样子的:E:/questasim-project/hello_world,这个一定要注意。5然后将上面的txt文件的后缀改成bat。这样一个批处理的文件就写好了…双击该bat文件…最终到达VSIM1的命令行,这里输入run–a,得到执行结果,本机部分执行结果如下图所示:这里得到了hello_world例子的输出结果。也验证了开发环境能够正常使用。6第三讲编译UVMDPI接口这一讲是独立于前面的知识的。我们在第一讲提到了questasim1.0a只能支持UVM1.1,如何让他支持最新的UVM1.1d?这就是我们这一讲要讲到的问题。具体来说:我们分析第二讲的批处理指令的下面的一条:vsim-c-sv_libC:/questa_sim_10.0c/verilog_src/uvm-1.1/lib/uvm_dpiwork.hello_world在C:\questa_sim_10.0c\verilog_src\uvm-1.1\lib这个路径下的uvm_dpi是个什么东西?我们打开这个路径,发现这个是一个uvm_dpi.dll的动态链接库文件。这里的动态链接库文件是UVM的DPI接口,通过DPI可以调用C/C++语言,