《UVM白皮书》关于driver的介绍
一、加入factory机制
1. 加入factory机制的driver
引入factory机制后,能够实现自动实例化class,并能正常调用其中的task&function。
下边是最简单driver的代码,只要在a_driver中加入红框中的内容就引入了factory机制。
引入factory机制:在声明一个新的class后,使用`uvm_component_utils()宏。
`uvm_component_utils()宏 能够把 新的class记录在uvm内的注册表上,方便后续使用。
2. 加入factory机制后top_tb实例化driver得到简化
上图右边使用一个run_test()语句替换掉了左侧原来的实例化和main_phase的显式调用。
根据类名创建其实例,这是`uvm_component_utils()宏带来的效果。
所有派生自uvm_component的类都应该使用`uvm_component_utils()注册宏!!!
- 传递给run_test()语句的是一个字符串“a_driver”,UVM能够依据run_test(“a_driver”);创建该字符串类的一个实例,并调用其main_phase。
- 在UVM中,只要一个类使用`uvm_component_utils()注册且被实例化,那么这个类的main_phase就会自动被调用。
- 实现一个driver就是实现其main_phase。
二、加入objection机制
- 问:为什么要加入objection机制?
- 答:UVM通过objection机制来控制验证平台的关闭,保证任务按预期执行而不被意外结束。
在每个phase中,UVM都会检查objection有没有被提起(raise_objection)如果有,那么等待objection被撤销(drop_objection)后停止仿真。 如果根本没有objection,那么立即结束当前phase。
task a_driver::main_phase(uvm_phase phase);
phase.raise_objection(this);
...
phase.drop_objection(this);
endtask
注意:raise_objection语句必须在phase的第一个消耗仿真时间的语句之前,否则无效。
三、加入virtual interface
【学习记录丨UVM】1.1接口interface-CSDN博客
较详细介绍可以看上边这个文章。
1. 定义interface
interface a_if(input clk, input rst_n)
logic vld ;
logic[7:0] data;
endinterface
2. 在top_tb中声明interface
这里也可以通过force dut.xx = u_if.xxx;直接连接
module harness();
…
a_if u_if(clk,rst_n);//module中interface的声明方式
…
dut my_dut(.clk(clk),
.rst_n(rst_n),
.DATA(u_if.data));
…
endmodule
3. 在driver中声明interface
声明后就可以在driver中使用了.eg.. vif.xx = 1'b1;
class a_driver extends uvm_driver;
…
virtual a_if vif;//在class中声明interface必须使用virtual
…
endclass
4. 连接top_tb和driver中的interface
config_db机制和具体介绍见【学习记录丨UVM】1.1接口interface-CSDN博客
使用config_db机制:在top_tb进行set操作;
在driver里进行get操作。
config_db机制和具体介绍见【学习记录丨UVM】1.1接口interface-CSDN博客