1.先看代码:

`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;

   `uvm_component_utils(my_driver)
   function new(string name = "my_driver", uvm_component parent = null);
      super.new(name, parent);
      `uvm_info("my_driver", "new is called", UVM_LOW);
   endfunction
   extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phase phase);
   `uvm_info("my_driver", "main_phase is called", UVM_LOW);
   top_tb.rxd <= 8'b0; 
   top_tb.rx_dv <= 1'b0;
   while(!top_tb.rst_n)
      @(posedge top_tb.clk);
   for(int i = 0; i < 256; i++)begin
      @(posedge top_tb.clk);
      top_tb.rxd <= $urandom_range(0, 255);
      top_tb.rx_dv <= 1'b1;
      `uvm_info("my_driver", "data is drived", UVM_LOW);
   end
   @(posedge top_tb.clk);
   top_tb.rx_dv <= 1'b0;
endtask
`endif



主要在第5行,`uvm_component_utils(my_driver),剩下的加一些打印信息。

1)factory使用来实现,做的事情很多,其中包括把my_driver这个class登记在UVM内部的一张表中(书里是这么写的,我也不知道什么表。。)


2.top也要改动

`timescale 1ns/1ps
`include "uvm_macros.svh"

import uvm_pkg::*;
`include "my_driver.sv"

module top_tb;

reg clk;
reg rst_n;
reg[7:0] rxd;
reg rx_dv;
wire[7:0] txd;
wire tx_en;

dut my_dut(.clk(clk),
           .rst_n(rst_n),
           .rxd(rxd),
           .rx_dv(rx_dv),
           .txd(txd),
           .tx_en(tx_en));

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_driver");
end

endmodule


1)有了run_test,之前的声明句柄,类的实例化,显示调用main_phase,全都可以不需要


2)run_test创建一个my_driver的实例,并自动调用my_driver的main_phase。具体大概是:2.1)UVM根据run_test这个字符串找到了一个跟它一样的class,然后创建了实例。2.2)或者理解成my_driver就是一个case的名字,UVM吃了这个case名字之后就会自动去找这个class,和命令行的+UVM_TESTNAME=xxx感觉差不多。

3)所有派生在uvm_component,或者在其基础上继续派生的class都应该使用uvm_component_utils宏注册。

4)但是注册完之后,发现 ”data is drived“一次都没输出,这个是objection的问题。


UVM:2.2只有driver的验证平台->2.2.2加入factory机制_命令行


3.其实不仅是信息没打印:看下结束时间:

UVM:2.2只有driver的验证平台->2.2.2加入factory机制_命令行_02

0ns 就结束了,也就是说进到这个phase就结束。任何信号都没法,波形也没有,除了打印 0 时刻的message的消息,什么都没做。

4.再把get_full_name加上

UVM:2.2只有driver的验证平台->2.2.2加入factory机制_字符串_03


输出:

UVM:2.2只有driver的验证平台->2.2.2加入factory机制_sed_04

这次它说自己叫:uvm_test_top。这个名字我可从来没给过它。原来是无论传递给run_test的参数是什么,它都根据string 去找同名的class,创建的例化名字都叫uvm_test_top。UVM自带的。

问题:

1.$urandom_range(0,255);完整含义。

2.uvm_component_utils到底做哪些,以后再写。