ic验证笔记-20天挑战day10.1

本文介绍了SystemVerilog中的类型转换,包括显式、动态和隐式转换,并强调了$cast函数的作用。接着探讨了虚方法的概念,它是实现类多态性的重要手段,通过动态方法查找实现运行时绑定。同时,详细阐述了对象拷贝的浅拷贝操作以及如何处理句柄转换。最后,文章讲解了回调函数的使用,展示了如何在不修改原有代码的基础上,通过回调实现功能扩展,提高代码复用性和灵活性。
摘要由CSDN通过智能技术生成

1.类型转换

显式转换:静态转换:加上单引号

动态转换:$cast(get, src),有返回值

隐式转换:如左侧5位矢量,右侧4位矢量,右侧位宽扩展

父类句柄转换为子类句柄 $cast(h2,h1) h2.super.del找到父类变量

$cast(target,src)会检查句柄所指向的对象类型,而不仅仅检查句柄本身

一旦源对象和目的句柄是同一类型,或者是目的句柄的扩展类,$cast()函数执行即会成功,返回1,否则返回0

2.虚方法

类的特性:封装,继承,多态

类的多态

通过虚方法,实现动态绑定,在sv中称之为动态方法查找

动态绑定,在调用时,会在运行时来确定句柄指向对象的类型,句柄指向子类,调用子类中的方法,再动态指向应该调用的方法

为了实现动态绑定,将basic_test::test定义为虚方法

virtual task test();//只有虚方法,没有虚成员

与父类虚方法同名的子类的继承方法不能使用不同类型的参数定义

3.对象拷贝

浅拷贝

Packet p1;

Packet p2;

p1 = new();

p2 = new() p1;//拷贝其成员变量,integer,string和句柄

子类的copy()方法继承自父类,需要考虑句柄的转换

$cast(h, wr.copy());

class basic test;

        ...

        virtual function void copy_data(basic_test t); //父类方法

                t.def = def;

                t.fin = fin;

        endfunction

        virtual function basic_test copy();

                basic_test t = new(0);

                copy_data(t);

                return t;

        endfunction

endclass

class test_wr extends basic_test;

        ...

        function void copy_data(basic_test t)

                test_wr h;

                super.copy_data(t); //返回的父类句柄

                $cast(h,t);

                h.def = def;

        endfunction

        function basic_test copy();

                test_wr t = new();

                copy_data(t);

                return t;

        endfunction

endclass 

4.回调函数

水平复用和垂直复用,应尽可能少的修改验证环境本身 

顶层环境的配置对象,不修改原始类的情况下,注入新的代码

父类中预留回调函数入口,继承的子类中填充回调函数,完成对父类方法的修改

虚类不能例化,类的模板 

class Driver_cbs_drop extends Driver_cbs;
    virtual task pre_tx(ref Transaction tr, ref bit drop);//ref引用
    // 1/100的传输事务丢弃概率
    drop = ($urandom_range(0, 99) == 0);
    endtask
endclass

class Driver;
    Driver_cbs cbs[$];
    task run();
        bit drop;
        Transaction tr;
        forever begin 
            drop  = 0;
            agt2drv.get(tr);
            foreach (cbs[i]) cbs[i].pre_tx(tr, drop));//产生新的drop
            if(drop) continue; //如果为1,不发送信息了
            transmit(tr);
            foreach(cbs[i]) cbs[i].post_tx(tr);
        end
    endtask
endclass

program automatic test;

        Environment env;

        initial begin

                env = new();

                env.gen_cfg();

                env.bulid();//构建函数

                begin //创建回调对象并且植入driver

                        Driver_cbs_drop dcd = new();

                        env.drv.cbs.push_back(dcd);

                end

                env.run();

                env.wrap_up();

        end

endprogram

回调的使用:

1.类中预留回调路口

2.定义回调类和函数

3.例化及添加回调类的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值