UVM实战CH2:07 验证平台加入env

验证平台加入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的创建

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值