• 数字验证学习笔记——SystemVerilog芯片验证11 ——类的继承


    一、类和继承

    类的第二核心要素,即类的“继承”,继承也符合我们认识实际的观点,在自然界和科学界我们对世界的认识无外乎归纳法和演绎法。
    归纳论证是一种由个别一般的论证方法。它通过许多个别的事例或分论点,然后归纳出它们所共有的特性,从而得出一个一般性的结论。所以从具体对象抽象出类的属性和方法,就符合定义类时的思维方式。
    class cat;
    protected color_t color;
    local bit is_good;
    function set_good(bit s);
    this.is_good = s;
    endfunction
    endclass

    class black_cat extends cat; //extends 继承
    function new();
    this.color = BLACK;
    endfunction
    endclass

    class white_cat extends cat;
    function new();
    this.color = WHITE;
    endfunction
    endclass

    black_cat bk;
    white_cat wk;
    initial begin
    bk=new();
    wt=new();
    bk.set_good(1);
    wt.set_good(1);
    end
    在这里插入图片描述
    如果我们要将数据发送给dut,那么需要有以下的基本元素和数据处理方法,我们将它封装到Transaction类种。

    class Transaction;
    rand bit [31:0] src,dst,data[8]; //随机成员变量
    bit [31:0] crc ; //二次处理后的成员数据
    virtual function void clac_crc();
    crc=src^ dst^ data.xor ;
    endfuction
    virtual function void display( input string prefix= “”);
    $display("%sTr: src=%h, dst=%h , crc=%h “, prefix, src, dst crc);
    endfuction
    endclass
    在这里插入图片描述
    如果我们为了测试DUT 的稳定性 ,需要加如一些错误的数据来测试DUT的反馈,但我们又想复用原有的验证环境(也包括定义好的类)
    那我们就需要考虑使用继承的方式来创建一个类BadTr。
    class BadTr extends Transaction;
    rand bit bad_crc;
    virtual function void calc_crc(); // 父类有两个成员方法,子类也定义了两个这样的成员方法,是没有关系的
    super.calc_crc(); // 通过super来调用父类的方法,就表示继承啦
    if(bad_crc) crc=~crc;
    endfuction
    virtual function void display( input string prefix= “”);
    $write(”%sBadTr: bad_crc=%b ", prefix, bad_crc);
    super.display();
    endfuction
    endclass:BadTr

    BadTr是Transaction的子类,Transaction是BadTr的父类。
    BadTr重新定义了函数 calc_crc()和 display (),而在其内部通过索引super来索引父类的同名函数。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    子类在定义new函数时,应该首先调用父类的new函数即super.new() 。
    如果父类的new函数没有参数,子类也可以省略调用,系统在编译时会自动添加super.new() 。

    在这里插入图片描述
    在这里插入图片描述
    super.def = 100 this.def=200
    在这里插入图片描述
    其中t(t是父类句柄但指向的是一个子类对象)不可以赋值wr2(wr2也是一个子类句柄),不然编译会直接报错,可以通过$cast(wr2,t) , 将父类句柄转为子类句柄(这时的父类句柄应该指向的是子类对象,这样转化才能成功返回一个1,否则为0)。

    wr.def 和 t.def 分别是多少 wr.def = 200 , t.def=100
    在这里插入图片描述
    wr.def 优先访问的是子类里面的 def, wr.super.def 这个访问的是父类的def

    wr句柄对应的是整个存储basic_test 和 test_wr 空间,而 t 对应的是仅仅存储basic_test的空间

  • 相关阅读:
    漏洞复现----41、Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
    【数据结构与算法】之深入解析“考试的最大困扰度”的求解思路与算法示例
    C++ map容器用法
    3dmax如何制作模型走路动画
    开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势&未来发展方向
    【概率论与数理统计】
    百度网盘开启画中画教程介绍
    AIGC专栏6——通过阿里云与AutoDL快速拉起Stable Diffusion和EasyPhoto
    给小白的 PostgreSQL 容器化部署教程(上)
    istio 初识
  • 原文地址:https://blog.csdn.net/qq_32100199/article/details/128060994