SV--factory机制

在my_driver中加入factory机制:

1.my_driver

`ifndef MY_DRIVER__SV          //`ifndef和`endif将程序功能模块包括进去,以便于向某个用户提供该功能
`define MY_DRIVER__SV          //定义字符串
class my_driver extends uvm_driver;

   `uvm_component_utils(my_driver)//引用uvm_component_utils宏
      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

注意:
1.关于uvm_component_utils宏的几点说明
【1】宏是一些命令组织在一起,作为一个单独的命令完成某项任务;
【2】factory机制的实现在这个宏中,作用是将my_driver登记到UVM内部一张表中;run_test传递给他的参数为字符串,UVM会创建一个此字符串代表的类的实例,并自动调用main_chaserun_test传递给他的为字符串,UVM会创建一个此字符串代表的类的实例,并自动调用main_chase。
【3】在定义一个新的类时,使用了这个宏,那么就相当于将这个类注册到了这张表中;
【4】该宏还有一个效果,根据类名创建类的实例,如: run_test(“my_driver”);

run_test("my_driver");//run_test传递给他的为字符串,UVM会创建一个此字符串代表的类的实例,并自动调用main_chase

【5】所有派生自uvm_component及其派生类的类都应该使用该宏进行注册,注意,在类定义时应该声明这个宏,否则宏将不可用。使用宏之后,附带的效果是,根据类名创建一个类的实例;
【6】只要一个类使用了uvm_component_utils注册,且从此类被实例化了,那么这个类的main_chase将会被自动调用;

2.top_tb.sv

`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 run_test("my_driver");
      #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】`include "uvm_macros.svh"把uvm_macros.svh文件通过include语句包含进来。
【2】import uvm_pkg::*通过import语句将整个uvm_pkg平台倒入验证平台,只有导入这个库,在编译的时侯,my_driver.sv才会认识其中的类名。
【3】 run_test(“my_driver”)run_test传递给他的为字符串,UVM会创建一个此字符串代表的类的实例,并自动调用main_chase

发布了50 篇原创文章 · 获赞 5 · 访问量 2678

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/103901858