电力电子转战数字IC20220613day23——江哥nb!

江哥nb!

今天的头版必须给到江哥,华为树枝江哥,FPGA设计岗,两年工资翻倍,年薪突破50,月薪突破30,向江哥学习!

想做江哥的水花兄弟,差个11号球衣 

——————————————————————————————————————————

 

 今天完成031-038,有关类的知识

  • 035-037 类
    • 这个世界由无数的类class和对象object构成的,class是将系统个体抽象出来的描述方式,object是实体,具备独立行为的能力
    • 面向对象编程的三要素:封装,继承,多态
    • 类的定义核心:属性声明和方法定义,类是数据和方法的自洽体,既可以保存数据和处理数据。
    • 区别于struct结构体,结构体只是单纯的数据集合,不能处理
    • 验证世界中的类
      • stimulator生成激励内容给到接口
      • driver将激励以时序的形式发送到DUT
      • monitor检测信号记录数据
      • 比较器checker比较数据
    • transaction事务类
      class transaction
      bit [31:0] addr,crc,data[8];
      
      function void display;
      $display("transaction: %h",addr);
      endfunction:display
      
      function void calc_crc;
      crc=addr^data.xor;
      endfunction:calc_crc
      
      endclass:transaction

      class换成module即可,软件盒子和硬件盒子

    • class中的变量默认是动态变量,软件盒子只能定义软件变量,bit是var变量,不能定义成硬件世界的reg和wire。
    • 接口的指针可以传递到类中,获得硬件世界的信号
    • class中不能出现initial和always
  • transaction tr;
    //声明句柄,
    tr=new();//创建对象,通过函数new完成例化
    
    //可以合并成
    transaction tr=new();
  • 创建对象实际就是开辟了新的内存空间,用来存放新的成员变量和方法
  • 创建对象时可以通过自定义构建函数完成变量的初始化和其他初始操作
    class transaction;
    logic [31:0] addr, crc, data[8];
    //new()是系统预定义函数,不需要指定返回值,函数会隐式的返回例化后的对象指针
    function new();
    addr=3;
    foreach (data[i]) data[i]=5;
    endfunction
    
    endclass
  • 任何一个类都需要new函数
  • 构建函数也可以定义多个参数作为初始化时外部传入数值的手段
    class transaction;
    logic [31:0] addr='h10;
    logic [31:0] crc,data[8];
    function new(logic [31:0] a=3,d=5);
    addr=a;
    foreach (data[i]) data=d;
    endfunction
    endclass
    
    initial begin
    transaction tr;
    tr=new(10);
    //10传递给了a
    end

    在完成对tr的初始化后tr.addr的值时多少?

    答:定义变量时是16,定义new时把a=3传递给addr,调用时是10,new开辟空间,完成了16的初始化,然后进入到new才把10给进来,所以结果是10。默认参数是3,如果没给10就是3,但是给了10,3就不用考虑了。

  • 句柄:就是指针
    transaction t1,t1;//声明句柄t1t2,悬空的指针,没有指向对象
    t1=new();//例化对象,t1指向第一个对象1
    t2=t1;//t1赋给t2,也就是两个句柄指向同一个对象1
    t1=new();//t1指向对象2
    
    //看到一次new就是例化了对象
    //定义一个类,名字是word
    class word
    byte nb[];
    //注意:定义动态数组nb给的值时用[],而new是用()
    function new(int n);
    nb=new[n];//分配n个元素给动态数组nb
    endfunction
    
    endclass
    
    initial begin :initial_1
    word wd;//类word的句柄是wd
    for(int i=1; i=4;i++) wd=new(i);//做4次例化
    end
    
    initial begin :initial_2
    #1ps
    $display("How many bytes are allocated for word instances?");
    end

    1ps后wd这个变量依然存在,因为是在initial里面声明的。

        如果在word前面加上automatic,执行完就销毁句柄和对象了,下面的答案就变成0B

  • 例化4次,假设每次开辟1B的空间,所以在display需要开辟4B的空间

 

 class里面定义的变量都是动态变量,如果加上static就可以是静态变量,可以用句柄来索引,t2.count,也可以用class名来索引,transaction::count

静态方法里面可以声明并使用动态变量,但是!不能使用类的动态成员变量,因为没有为动态变量开辟空间

class transaction;
static config cfg;//静态变量,一开始就有空间
static int count=0;
int id;

static function void display_statics();
$display("transaction cfg.mode=%s, count=%0d", cfg.mode.name(), count);
//静态方法调用类里边静态的成员变量
//如果在这里声明动态变量,也是可以的
endfunction
endclass

config cfg;
initial begin
cfg=new(MODE_ON);
transaction::cfg=cfg;//索引到类里边的变量
transaction::display_statics();//和方法,调用静态方法
end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值