有点类似软件测试中的测试框架。
一个简单的UVM例子
名词解释
UVM:universal verification methdoogy通用验证方法学
可以基于UVM使用system verilog搭建测试平台。
DUT:Design under test被测设计代码
验证平台的组成
driver:产生各种激励信号给DUT;
记分板(也叫checker):检验DUT在指定激励下的输出是否和预期相符;
monitor:收集DUT的输出,并把它传递给记分板;
参考模型:用于制造产生预期输出,根据被测功能在DUT运算时,参考模型也做相应逻辑的运算。
以下是只有driver的测试平台:
典型测试平台
构造各组成部分
UVM是个库,库中提供可以生成验证平台各组成部分的类,可以被使用,通过类中提供的函数和任务完成各部件的功能,因此各个组件派生自UVM提供的类。
driver构造
class my_driver extends uvm_driver;
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);//name是driver的名字,parent是uvm规定的
endfunction
//driver具体实现在这里,phase管理验证平台的运行
extern virtual task main_phase(uvm_phase phase);
endclass
task my_driver::main_phase(uvm_phase phase);
top.tx = 8'b00000000;....//这里实现产生激励信号的代码
endtask
`uvm_info(s1, s2, s3);
uvm宏,用于打印信息,s1用于信息归类,s2是要打印的内容,s3打印等级。
打印等级:UVM_HIGH:信息可有可无;
UVM_LOW:信息非常关键;
UVM_MEDIUM:信息重要程度介于high和low之间;
uvm_info打印low和medium信息。
使用driver的测试平台
`include "uvm_macros.svh"//这里包含uvm的众多宏定义
import uvm_pkg::*;//导入uvm库
`include "my_driver.sv"//导入自己的driver
module top;
//信号定义
//被测设计和驱动器的信号连接
//信号初始化等
initial begin
my_driver dv;//实例化driver
dv = new("dr", null);
dv.main_phase(null);//调用产生激励
$finish();
end
endmodule
factory机制:自动创建实例和执行
上面是需要自己显式实例化类和调用driver方法,引入factory机制后,可以自动创建实例调用对应方法。
与上例的区别:注册自己的驱动类,注册之后就可以实现自动创建实例和调用方法。
class my_driver extends uvm_driver;
`uvm_component_utils(my_driver);//使用uvm宏注册自己的驱动类
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);//name是driver的名字,parent是uvm规定的
endfunction
//driver具体实现在这里,phase管理验证平台的运行
extern virtual task main_phase(uvm_phase phase);
endclass
task my_driver::main_phase(uvm_phase phase);
top.tx = 8'b00000000;....//这里实现产生激励信号的代码
endtask
在top模块中的使用run_test();代替实例化和调用函数:
`include "uvm_macros.svh"//这里包含uvm的众多宏定义
import uvm_pkg::*;//导入uvm库
`include "my_driver.sv"//导入自己的driver
module top;
//信号定义
//被测设计和驱动器的信号连接
//信号初始化等
initial begin
run_test("my_driver");//根据传入的字符串决定其要实例化的类
$finish();
end
endmodule
加入objection机制
uvm自动调用phase时通过objection机制来控制验证平台的关闭,如果UVM监测到有objection,则需要等objection被撤销后才结束验证仿真,如果没有监测到