Systemverilog(绿皮书)第五章——类与对象(一)类的概述
程序员文章站
2022-05-31 17:17:25
...
如下题目所示:
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[i] = d;
endfunction
endclass
initial begin
Transaction tr,tr1;
tr = new(10);
tr1 = new();
end
理解new()创建对象的过程, 首先new(10)根据类 中的变量类型,addr,crc和data来开辟空间,这时addr先被赋值16。之后,我们 传递参数10进入函数,addr值被覆盖为10。
而 new()函数调用时,未从外部传递 参数,因此,addr值被赋值为3。
对象的创建和销毁:
class word
byte nb[];
function new(int n);
nb = new[n]; //动态数组空间开辟
endfunction
endclass
initial begin : initial_1
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 instance?")
end
若wd = new(1)所需开辟的空间为1B,那么执行完开辟空间:
wd执行完,句柄指向第四个对象,4B。由于initial中是静态变量,及时initial执行完了,那么变量还在。
class Transaction
static intcount= 0;
int id;
function new();
id = count++;
endfunction
endclass
Transaction t1,t2;
initial begin
t1 = new();
t2 = new();
$display("Second id=%d, count = %d",t2.id,t2.count);