江哥nb!
今天的头版必须给到江哥,华为树枝江哥,FPGA设计岗,两年工资翻倍,年薪突破50,月薪突破30,向江哥学习!
想做江哥的水花兄弟,差个11号球衣
——————————————————————————————————————————
今天完成031-038,有关类的知识
035-037类 这个世界由无数的类class和对象object构成的,class是将系统个体抽象出来的描述方式,object是实体,具备独立行为的能力面向对象编程的三要素:封装,继承,多态类的定义核心:属性声明和方法定义,类是数据和方法的自洽体,既可以保存数据和处理数据。区别于struct结构体,结构体只是单纯的数据集合,不能处理验证世界中的类 stimulator生成激励内容给到接口driver将激励以时序的形式发送到DUTmonitor检测信号记录数据比较器checker比较数据transaction事务类
class transactionbit [31:0] addr,crc,data[8];function void display;$display("transaction: %h",addr);endfunction:displayfunction void calc_crc;crc=addr^data.xor;endfunction:calc_crcendclass: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;endfunctionendclass
任何一个类都需要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;endfunctionendclassinitial begintransaction tr;tr=new(10);//10传递给了aend
在完成对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指向第一个对象1t2=t1;//t1赋给t2,也就是两个句柄指向同一个对象1t1=new();//t1指向对象2//看到一次new就是例化了对象
//定义一个类,名字是wordclass wordbyte nb[];//注意:定义动态数组nb给的值时用[],而new是用()function new(int n);nb=new[n];//分配n个元素给动态数组nbendfunctionendclassinitial begin :initial_1word wd;//类word的句柄是wdfor(int i=1; i=4;i++) wd=new(i);//做4次例化endinitial 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);//静态方法调用类里边静态的成员变量//如果在这里声明动态变量,也是可以的endfunctionendclassconfig cfg;initial begincfg=new(MODE_ON);transaction::cfg=cfg;//索引到类里边的变量transaction::display_statics();//和方法,调用静态方法end