江哥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