练习一:
类的继承
代码:
typedef enum {WHITE,BLACK} color_t;
class cat;
protected color_t color;
local bit is_good;
function set_good(bit s);
this.is_good=s;
endfunction
endclass
class black_cat extends cat;
function new();
this.color=BLACK;
endfunction
endclass
class white_cat extends cat;
function new();
this.color=WHITE;
endfunction
endclass
module test;
black_cat bk;
white_cat wt;
initial begin
bk=new();
wt=new();
bk.set_good(1);
wt.set_good(1);
end
endmodule
仿真结果:
解析:
断点执行顺序:line27->line28->line29->line6->line30->line6
执行完毕line27,bk开辟空间,此时bk.color=BLACK;is_good=0;
执行完毕line28,wt开辟空间,此时wt.color=WHITE;is_good=0;
执行完毕line29,bk.is_good=1(跳转到line6执行函数);
执行完毕line30,wt.is_good=1(跳转到line6执行函数);
练习二:
类的成员操作
代码:
class Transaction;
logic [31:0] addr,data[8];
local bit is_summer=6;
function new(logic [31:0] a=3,d=5);
addr=a;
foreach(data[i])
data[i]=d;
endfunction
function bit set_summer(bit s);
this.is_summer=s;
endfunction
endclass
Transaction tr,t1;
initial begin
tr = new(10,1);
t1 = new(5,2);
t1.set_summer(1);
$display("ADDR= %d",t1.addr);
$display("is_summer is %d",t1.set_summer());
$display("is_summer is %d",t1.is_summer); //illegal
t1=tr;
$display("ADDR= %d",t1.addr);
t1.addr=6;
$display("ADDR= %d",tr.addr);
$display("ADDR= %d",t1.addr);
end
仿真结果: