class generator;
mailbox gen2drv;
transaction blueprint;
function new(input mailbox gen2drv);this.gen2drv = gen2drv;
blueprint =new();
endfunction
task run;
transaction tr;
forever begin
assert(blueprint.randomize());
tr = blueprint.clone();//blueprint只在run外声明了一个句柄,所以要把对象clone出来,不然下次run时就被覆盖了
gen2drv.put(tr);
end
endtask
endclass
8.2.2 environment
environment实现:创建(create),运行(run),收尾(wrap-up)
class environment;
generator gen;
driver drv;
mailbox gen2drv;
function voidbuild();
gen2drv =new();
gen =new(gen2drv);
drv =new(gen2drv);
endfunction
task run();
fork
gen.run();
drv.run();
join_none
endtask
task wrap_up();//调用计分板&生成报告
endtask
endclass
8.2.3 测试平台
program automatic test;
environment env;
initial begin
env =new();
env.build();
begin
badtr bad =new();//将要发送的事务传给蓝图
env.gen.blueprint = bad;
end
env.run();
env.wrap_up();
end
endprogram
//父类class transaction;...
virtual function voidcalc_crc();...
endfunction
endclass
//子类class badtr extends transaction;...
virtual function voidcalc_crc();//子类也可以不用再写virtual了...
endfunction
endclass
8.5 对象的复制
复制有两种:clone()和copy(),区别在于clone()=new()+copy()
//clone()class transaction;
rand bit [31:0] src, dst, data[8];
bit [31:0] crc;
virtual function transaction clone();
clone =new();
clone.src = src;
clone.dst = dst;
clone.data = data;
clone.crc = crc;
endfunction
endclass
//copy()class transaction;
rand bit [31:0] src, dst, data[8];
bit [31:0] crc;
virtual function copy(input transaction tr);this.src = tr.src;this.dst = tr.dst;this.data = tr.data;this.crc = tr.crc;
endfunction
endclass
8.6 抽象类和虚方法
SV创建可以共享的基类方法有二 ①抽象类: virtual声明的class ②纯虚方法: pure virtual声明的的方法原型
抽象类不能直接实例化,只能被继承后并完善所有纯虚方法后才能实例化
纯虚方法只能声明在抽象类,抽象类中可以pure virtual或virtual或普通方法
8.7 回调
回调即在父类中定义一个virtual的空方法,然后子类需要的时候再调用重写添加功能
8.8 参数化类
再class声明的时候在类名和参数列表之间添加#(type T)传入类型参数
整数堆栈
class intstack;
local int stack[100];
local int top;
function voidpush(input int i);
stack[++top]=i;
endfunction
function intpop();return stack[top--];
endfunction
endclass
参数化的栈堆
class intstack#(type T=int);
local T stack[100];
local int top;
function voidpush(input T i);
stack[++top]=i;
endfunction
function intpop();return stack[top--];
endfunction
endclass
参数化蓝图模式generator
class generator#(type T=tr);
mailbox gen2drv;T blueprint;
function new(input mailbox gen2drv);this.gen2drv = gen2drv;
blueprint =new();
endfunction
task run();T tr;
forever begin
assert(blueprint.randomize());
tr = blueprint.copy();
gen2drv.put(tr);
end
endtask
endclass