首页 > 其他分享 >UVM - 9 (override - 2)

UVM - 9 (override - 2)

时间:2024-03-15 09:34:39浏览次数:31  
标签:parrot am 重载 inst UVM override type bird

System Verilog本身就是一种面向对象的语言,即本身就支持重载(override),重载即当父类中定义一个virtual类型的函数或任务时,在子类中可以重载这个函数或任务。所以我们来先看一下System Verilog对重载的支持。

案例2

system verilog重载

  • 本质是使用继承和多态的思想实现方法的重载
class bird extends uvm_object;
    virtual function void hungry();
        $display("I am a bird, I am hungry");
    endfunction

    function void hungry2();
        $display("I am a bird, I am hungry2");
    endfunction
endclass

class parrot extends bird;
    virtual function void hungry();
        $display("I am a parrot, I am hungry");
    endfunction

    function void hungry2();
        $display("I am a parrot, I am hungry2");
    endfunction
endclass

function void my_case0::print_hungry(bird b_ptr);
    b_ptr.hungry();
    b_ptr.hungry2();
endfunction

function void my_case0::build_phase(uvm_phase phase);
    bird bird_inst;
    parrot parrot_inst;

    super.build_phase(phase);
    
    bird_inst = bird::type_id::create("bird_inst");
    parrot_inst = parrot::type_id::create("parrot_inst");
    print_hungry(bird_inst); // 传入的bird_inst,根据多态的思想,调用的是bird的方法
    print_hungry(parrot_inst); // virtual方法调用的是parrot的方法,普通方法调用的是bird中的方法
endfunction
// print_hungry(bird_inst);
"I am a bird, I am hungry"
"I am a bird, I am hungry2"
// print_hungry(parrot_inst);
"I am a parrot, I am hungry"
"I am a bird, I am hungry2" // hungry2()不是virtual方法,所以调用bird中的方法
  • 类通过继承可以重载其中的方法,在使用多态的方式调用方法的时候,virtual方法通过子对象调用,可以表现出子对象新的行为

system verilog约束重载

System Verilog还有一个非常有用的特性是支持约束的重载。像我们已经在transaction里定义了某些变量的约束,如果我们需要修改约束的时候只需要派生一个新的transaction,然后直接重载约束即可。

class new_transaction extends my_transaction;

    `uvm_object_utils(new_transaction)
    function new(string name= "new_transaction");
        super.new(name);
    endfunction
    constraint crc_err_cons{
        crc_err dist {0 := 2, 1 := 1};
    }
endclass

变量crc_err已经在my_transacton里给定了约束,但是我们想更改这个约束,就从my_transaction里派生一个新的transaction,然后直接重载crc_err的约束即可。

uvm factoroy重载

function void my_case0::build_phase(uvm_phase phase);
    
    // 用parrot替代bird类型
    set_type_override_by_type(bird::get_type(), parrot::get_type());
    
    bird_inst = bird::type_id::create("bird_inst");
    parrot_inst = parrot::type_id::create("parrot_inst");
    
    print_hungry(bird_inst);
    print_hungry(parrot_inst);

endfunction
"I am a parrot, I am hungry"
"I am a bird, I am hungry2"
"I am a parrot, I am hungry"
"I am a bird, I am hungry2"


  • 实例化对象的时侯,实例化语句并不会立马生效,UVM会通过factory机制在自己内部的一张override表格中查看是否有相关的重载记录。 set_type_override_by_type语句相当于在factory机制的override表格中加入了一条记录。当查到有重载记录时,会使用新的类型来替代旧的类型。所以虽然在build_phase中写明创建bird的实例,但是最终却创建了parrot的实例。
  • set_type_override_by_type()函数的作用就是在创建实例之前,将新的类型记录到override的表中
  • 实例化的时候,factory会先查找override表中原类型是不是被override了,然后创建对象,如果没有override,就创建原对象,如过有override就创建新对象

连续重载

连续重载即factory机制查到一条重载记录时不会立马创建重载类的实例,而是全部查完后再创建,假设查到parrot派生自bird后又查到big_parrot派生自parrot,那么所有的bird和parrot的实例化都会被big_parrot重载掉,这就是连续重载。

class big_parrot extends parrot;
    virtual function void hungry();
        $display("I am a big_parrot, I am hungry");
    endfunction

    function void hungry2();
        $display("I am a big_parrot, I am hungry2");
    endfunction

    `uvm_object_utils(big_parrot)
    function new(string name = "big_parrot");
        super.new(name);
    endfunction
endclass
//////////////
function void my_case0::build_phase(uvm_phase phase);
    bird bird_inst;
    parrot parrot_inst;
    super.build_phase(phase);
    set_type_override_by_type(bird::get_type(), parrot::get_type());
    set_type_override_by_type(parrot::get_type(), big_parrot::get_type());
    bird_inst = bird::type_id::create("bird_inst");
    parrot_inst = parrot::type_id::create("parrot_inst");
    print_hungry(bird_inst);
    print_hungry(parrot_inst);
endfunction
# I am a big_parrot, I am hungry
# I am a bird, I am hungry2

替换重载

替换式重载即已经查到了一条重载记录是parrot重载bird,但再继续查找的过程中又找到了sparrow重载bird(sparrow也派生自bird),这样sparrow就会把上一条的parrot的重载替换掉(前提是重载函数的replace参数值为1,即default值)。

// 替换重载
class sparrow extends bird;
    virtual function void hungry();
        $display("I am a sparrow, I am hungry");
    endfunction

    function void hungry2();
        $display("I am a sparrow, I am hungry2");
    endfunction

    `uvm_object_utils(sparrow)

    function new(string name = "sparrow");
        super.new(name);
    endfunction
endclass
//////////////
function void my_case0::build_phase(uvm_phase phase);
    bird bird_inst;
    parrot parrot_inst;
    super.build_phase(phase);
    set_type_override_by_type(bird::get_type(), parrot::get_type());
    set_type_override_by_type(bird::get_type(), sparrow::get_type());
    bird_inst = bird::type_id::create("bird_inst");
    parrot_inst = parrot::type_id::create("parrot_inst");
    print_hungry(bird_inst);
    print_hungry(parrot_inst);
endfunction
# I am a sparrow, I am hungry
# I am a bird, I am hungry2
# I am a parrot, I am hungry
# I am a bird, I am hungry2

uvm factory重载的条件

  1. 无论是重载的类(parrot) 还是被重载的类(bird) , 都要在定义时注册到factory机制中。

  2. 被重载的类(bird) 在实例化时, 要使用factory机制式的实例化方式, 而不能使用传统的new方式。

  3. 最重要的是, 重载的类(parrot) 要与被重载的类(bird) 有派生关系。 重载的类必须派生自被重载的类, 被重载的类必须是重载类的父类。

  4. component与object之间互相不能重载

uvm重载方法

uvm_component中的重载方法

  • 使用set_type_override_by_type函数可以实现两种不同类型之间的重载,
  • set_inst_override_by_type函数(并不是希望把验证平台中的A类型全部替换成B类型,而只是替换其中的某一部分)
extern static function void set_type_override_by_type
				(uvm_object_wrapper original_type,   
//第一个参数是被重载的类型,父类
				uvm_object_wrapper override_type,    
//第二个参数是重载的类型。子类
				bit replace=1);

extern function void set_inst_override_by_type(string relative_inst_path,   
  //其中第一个参数是相对路径,
						uvm_object_wrapper original_type,  
                          //第二个参数是被重载的类型,父类
  						uvm_object_wrapper override_type
                          //第二个参数是被重载的类型,子类
);
  • 无论是set_type_override_by_type还是set_inst_override_by_type,它们的参数都是一个uvm_object_wrapper型的类型参数,这种参数通过xxx::get_type()的形式获得。
    使用类的名称进行替换的方法:set_type_override/set_inst_override
  • 传入参数为字符串
set_type_override("bird","parrot");

set_inst_override("env.o_agt.mon","my_monitor","new_monitor");

tb_top中initial中的也可以用的重载函数

  • 以下四个函数可以用于替换上述函数
  • 这四个函数都是factory的重载函数
  • 在component中也可以使用factory机制的重载函数
initial begin
  factory.set_type_override_by_type(bird::get_type,parrot::get_type());
end

在命令行重载函数

+uvm_set_inst_override="my_monitor,new_monitor,env.o_agent.mon"
+uvm_set_type_override="my_monitor,new_monitor"

标签:parrot,am,重载,inst,UVM,override,type,bird
From: https://www.cnblogs.com/Icer-newer/p/18074410

相关文章

  • UVM - 6 (Transaction Modeling)
    内容uvm_sequence_item是transaction的基类可以使用uvm_sequence_item和uvm_transaction对数据进行建模什么是事务(transaction)?总线协议可以认为是一个事务UVM数据流testcase一般不产生数据,通常进行configsequencer会产生激励给到driver,传递的就是transaction......
  • UVM - 5 (Lab 1)
    DUT的RTL文件:router.vtestbench架构Flowtest.svtest_base.sv注册的时候,以uvm_component扩展出来的类,在注册的时候要使用uvm_component_utils()注册,以uvm_transaction,uvm_sequence扩展出来的类需要用uvm_object_utils()注册//以uvm_component扩展出来的类uv......
  • UVM - 4 (UVM验证平台)
    Reviewthis-指的是当前的类双冒号进行索引-静态方法或者是静态变量在类之外写函数也可以使用双冒号进行索引,双冒号指定作用域所有的phaze是UVM中已经定义好的,不需要显式调用TLM-事务级传输UVM中组件之间的通信使用的是TLM,不使用mailboxuvm_sequence_itemcla......
  • UVM - 3 (UVM验证平台)
    内容UVM-统一的验证方法学UVM演进什么是验证?验证计划验证目标RTL代码覆盖率功能覆盖率功能覆盖率和代码覆盖率的关系覆盖率驱动的验证CDV验证阶段随机大量测试加定向边界测试UVM提供了哪些内容UVM基础类库和宏定义UVM编码原则更多的测试案例和......
  • UVM - 1
    VMM/OVM-都是验证方法学CDV-coveragedriververification-覆盖率驱动的验证课程概述课程概述内容OOP:class类OOP:封装OOP:继承OOP:多态不是虚方法,看句柄的类型是虚方法,看对象的类型使用虚方法,创建通用的方法OOP编程规则:在class之外定......
  • UVM - 2 (补充虚基类及纯虚函数知识点)
    虚方法和纯虚方法虚方法定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。virtualfunction纯虚方法定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范......
  • UVM宏解释+odt文件转doc+merge命令和difflib+python调用命令+clog2和系统函数+java添
    UVM宏解释UVM_DISABLE_AUTO_ITEM_RECORDINGhttps://blog.csdn.net/MGoop/article/details/127295965itemrecord的方法主要是用于记录事务信息的,原理是调用accept_tr,begin_tr,end_tr。似乎和波形上显示出各个事务相关。默认情况下,在调用get_next_item()和item_done()时自动......
  • 【UVM】 【source_code】 uvm_cmdline_processor
    classuvm_cmdline_processor 函数get_arg_values()用于收集命令行(commandline)中匹配的参数,便于后续处理。返回所有匹配上的参数数量,所有匹配上的参数词尾被存放在values[$]中。sourcecodefunctionintget_arg_values(stringmatch,refstringvalues[$]);  int......
  • 2.1.一个简单的UVM验证平台------验证平台的组成
    1.1验证平台的组成:一个验证平台中通常要实现以下的功能:1.验证平台要能模拟DUT的各种真实使用情况,也就是可以提供激励,激励的功能是由driver来实现的。2.验证平台要能够根据DUT的输出来判断DUT的行为是否与预期相符合,称为计分板scoreboard3.验证平台能够收集DUT的输出并把它们传......
  • UVM Primer OOP前置部分(Chapter 6)
    资料:-UVMPrimer(英文原版)-UVMPrimer(中译版)前言:-本部分将包括UVMPrimer的第4章-第9章,仅整理OOP特性,不会涉及DUT及验证平台构建的相关内容。正文:本书的4-9章以一个动物园为例,讲述了OOP的不同特性,包括:-类-继承-多态-静态变量和方法-factory模式第六章:多态多态(polymorp......