从0开始搭建基于UVM的验证平台---phase0.0

从0开始搭建基于UVM的验证平台-----phase 0.0

0. Introduction

本系列需要基于一定verilog基础下学习,里面的代码仅是部分关键代码。作为一个刚刚工作的验证小白(以前主要做FPGA相关设计),由于工作原因,公司验证十分流程高效化,可操作性以及探究性的机会很少,自身又对工程以及uvm整体验证环境十分好奇,于是就私下学习并参考synopsys的教程以及rk的课程并参考uvm白皮书,打算从头开始自己尝试搭建一个基于UVM的验证平台,这里我会按照自己的搭建过程将其中的心得以及知识分享给大家,希望每个新人验证工程师都对整个验证流程有一定了解,而不是只成为一个做业务的验证工程师,也希望有经验的验证工程师进行指正,欢迎大家一起讨论,加油!
标记部分会在最后进行解释。

标记文本

1. Creating simple test

记得上学的时候,我们在测试自己编写的verilog模块时总是会编写一个简单的testbench来做为激励产生源,已经控制器。而对于一个基于UVM的验证环境也是同样的,我们会将测试过程代码写入initial 模块中,然后将initial 块放入program和model中(这里更推荐放入program中,可以有效的消除竞争等问题的发生)。

下图是一个简单的program块,注释中有详细作用
从0开始搭建基于UVM的验证平台---phase0.0
在program块中,首先我们们需要调用import块来引入uvm_pkg,这里会确保我们可以使用uvm_pkg中的所有功能,类似头文件的作用(编译中也需要注意会存在先后顺序)。下面是UVM最重要的三个特点。

  1. Execution manager (uvm_root::get())
  2. Factory (uvm_factory::get())
  3. 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。
从0开始搭建基于UVM的验证平台---phase0.0
这里使用到了之前提及的UVM的特性
(1)`Uvm_component_utils marcon provide factoy机制,将其注册到UVM中,接下来的new是构造函数,其中两个参数是针对uvm_factory机制创建的,分别是例化名和组件对应的父类,用来构建uvm树形结构使用。
(2)super.new();sv所作面向对象的语言,可以使用继承特性来集成父类的功能。
将base_test放入test_pkg中便于今后的编译分类管理
从0开始搭建基于UVM的验证平台---phase0.0

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仿真即可。
从0开始搭建基于UVM的验证平台---phase0.0

comment

(1)为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念。
从0开始搭建基于UVM的验证平台---phase0.0
(2)编译中也需要注意会存在先后顺序,后面需要的东西前面必须先编译
(3)$timeformat (units_number, precision_number, suffix_string, minimum_field_wdith);

上一篇:UVM 怎么层次化引用其他component类中的属性


下一篇:日常记录(35)UVM的phase