从0开始搭建基于UVM的验证平台-----phase 0.0
- 0. Introduction
- 1. Creating simple test
- 2. Build your own test case
- 3. Basic debug method in uvm
- 4. Makefile
- comment
0. Introduction
本系列需要基于一定verilog基础下学习,里面的代码仅是部分关键代码。作为一个刚刚工作的验证小白(以前主要做FPGA相关设计),由于工作原因,公司验证十分流程高效化,可操作性以及探究性的机会很少,自身又对工程以及uvm整体验证环境十分好奇,于是就私下学习并参考synopsys的教程以及rk的课程并参考uvm白皮书,打算从头开始自己尝试搭建一个基于UVM的验证平台,这里我会按照自己的搭建过程将其中的心得以及知识分享给大家,希望每个新人验证工程师都对整个验证流程有一定了解,而不是只成为一个做业务的验证工程师,也希望有经验的验证工程师进行指正,欢迎大家一起讨论,加油!
标记部分会在最后进行解释。
标记文本
1. Creating simple test
记得上学的时候,我们在测试自己编写的verilog模块时总是会编写一个简单的testbench来做为激励产生源,已经控制器。而对于一个基于UVM的验证环境也是同样的,我们会将测试过程代码写入initial 模块中,然后将initial 块放入program和model中(这里更推荐放入program中,可以有效的消除竞争等问题的发生)。
下图是一个简单的program块,注释中有详细作用
在program块中,首先我们们需要调用import块来引入uvm_pkg,这里会确保我们可以使用uvm_pkg中的所有功能,类似头文件的作用(编译中也需要注意会存在先后顺序)。下面是UVM最重要的三个特点。
- Execution manager (uvm_root::get())
- Factory (uvm_factory::get())
- Configuration database (uvm_config_db)
2. Build your own test case
从上面的program块中可以看到,timeformat会确定相对应的仿真参数,接下来就是run_test()函数,会直接调用整个uvm_component中的顶层tc(test case),如果不进行设定,会导致uvm无法找到test从而无法进行仿真 reporter[NOCOMP]。
此处创建base_test作为UVM_TESTNAME, 作为
v
a
l
u
e
value
valueplusargs传入来指定仿真使用的testcase。
这里使用到了之前提及的UVM的特性
(1)`Uvm_component_utils marcon provide factoy机制,将其注册到UVM中,接下来的new是构造函数,其中两个参数是针对uvm_factory机制创建的,分别是例化名和组件对应的父类,用来构建uvm树形结构使用。
(2)super.new();sv所作面向对象的语言,可以使用继承特性来集成父类的功能。
将base_test放入test_pkg中便于今后的编译分类管理
3. Basic debug method in uvm
这里我们学习以及基本的debug方式,由于uvm是软件类的思维进行debug,所以多数都是采用打印结合波形的方法(涉及到硬件功能时),而打印时,我们常用得到的函数主要是如下几种基本的。
(1)`uvm_info(get_type/full_name()/”you own tracking name”, $sformatf(“”), uvm_verbsity);
(2)uvm_root::get() 得到整个验证环境的层次;
(3)uvm_factory::get() 得到所有注册在uvm factory机制中的例化的模块
4. Makefile
由于是基于vcs的环境,所以这里的makefile 使用vcs相关指令编写。图片中主要列举了相关的编译以及运行所需vcs命令,具体环境变量以及参数,可以根据自身需求进行编写和赋值。这里分为两步,首先调用sv和uvm库编译测试文件,然后启动vcs仿真即可。
comment
(1)为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。
(2)编译中也需要注意会存在先后顺序,后面需要的东西前面必须先编译
(3)$timeformat (units_number, precision_number, suffix_string, minimum_field_wdith);