验证平台加入env
加入env
在验证平台中加入reference model、scoreboard等组件后需要考虑对它们进行实例化,在top_tb中使用run_test已经不合适,因为run_test只能创建一个实例。而显式地例化这些组件与run_test例化的对象不属于同一个层次结构。
解决方案:引入一个容器类,在这个容器类中实例化化driver、monitor、reference model和scoreboard等,而使用run_test创建这个容器类的实例。这个容器类称为uvm_env
my_env代码
`ifndef MY_ENV__SV
`define MY_ENV__SV
class my_env extends uvm_env;
//所有的env应该派生自uvm_env
my_driver drv;
function new(string name = "my_env", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
drv = my_driver::type_id::create("drv", this);
//actory机制注册过的类的独特的实例化方式
//验证平台中的组件在实例化时都应该使用type_name::type_id::create的方式
endfunction
`uvm_component_utils(my_env)
//容器类在仿真中一直存在,使用uvm_component_utils宏来实现factory的注册
endclass
`endif
- new函数第一个参数是实例的名字,第二个则是parent
- my_driver在uvm_env中实例化,所以my_driver的父结点(parent)就是my_env
- 通过parent的形式,UVM建立起了树形的组织结构,节点必须由
uvm_component或者其派生类继承而来 - 由run_test创建的实例是树根(这里是my_env),并且树根的名字是固定的,为uvm_test_top
- 长出枝叶(这里只有my_driver)的过程在my_env的build_phase中手动实现
UVM树结构图
- 此时整个验证平台中存在两个build_phase,一个是my_env的,一个是my_driver的
- build_phase的执行遵照从树根到树叶的顺序
my_driver在tb中层次结构
my_driver在验证平台中的层次结构发生了变化,从树根变为树叶,以在top_tb中使用config_db机制传递virtualmy_if时,要改变相应的路径
`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;
`include "my_if.sv"
`include "my_transaction.sv"
`include "my_driver.sv"
`include "my_env.sv"
module top_tb;
reg clk;
reg rst_n;
reg[7:0] rxd;
reg rx_dv;
wire[7:0] txd;
wire tx_en;
my_if input_if(clk, rst_n);
my_if output_if(clk, rst_n);
dut my_dut(.clk(clk),
.rst_n(rst_n),
.rxd(input_if.data),
.rx_dv(input_if.valid),
.txd(output_if.data),
.tx_en(output_if.valid));
initial begin
clk = 0;
forever begin
#100 clk = ~clk;
end
end
initial begin
rst_n = 1'b0;
#1000;
rst_n = 1'b1;
end
initial begin
run_test("my_env");
//run_test中的参数由之前的my_driver变为my_env
//my_driver的例化在my_env的build_phase中实现
end
initial begin
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.drv", "vif", input_if);
//传递interface参数时,由之前从uvm_test_top变为了uvm_test_top.drv
end
endmodule
仿真结果
仿真平台组件里增加了my_env这个组件,my_env里实现my_driver的创建