class transaction; // 4属性2方法的事务
rand bit[31:0]src,dst,data[8]; // 随机化数据,dst表目的,src表源
bit[31:0]crc; // 循环冗余校验
virtual function void calc_crc; // 基类虚方法,可以在扩展类中重写
crc=src^dst^data.xor;
endfunction
virtual function void disoplay(input string prefix="");
$display("%sTr:src=%h,dst=%h,crc=%h",prefix,src,crc);
endfunction
enclass
-----------------------------------------------------------------------------------------
class Badtr extends transaction; // 错误注入扩展类
rand bit bad_crc;
virtual function void calc_crc; // 重写calc_crc方法
super.calx_crc(); // 计算正确的crc
if(bad_crc)crc=~crc; // 随机产生错误的crc
endfunction
virtual function void display(intput string prefix=""); // 重写display方法
$write("%sBadtr:bad_crc=%b,",prefix,bad_crc);
super.display;
endfunction
endclass
-----------------------------------------------------------------------------------------
class generator; //创建事务,随机化,送给邮箱put
mailbox gen2drv;
transaction blueprint;
function new(mailbox gen2drv);
this.gen2drv = gen2drv;
blueprint = new();
endfunction
task run();
transaction tr;
forever begin
assert(blueprint.randomize) //这里的assert?
tr = blueprint.copy();
gen2drv.put(tr);
end
endtask
endclass
-----------------------------------------------------------------------------------------
class environment;
mailbox gen2drv;
generator gen;
drive drv;
function build();
gen2drv = new();
gen = new(gen2drv); //注意输入
drv = new(gen2drv);
endfunction
task run();
fork //注意
gen.run();
drv.run();
join_none
endtask
task wrap_up();
endtask
endclass
-----------------------------------------------------------------------------------------
program automatic test; //简单的测试程序,走一遍环境。注意automatic
environment env;
initial begin
env.new();
env.build();
begin
Badtr bad = new(); //实例错误事务
env.gen.blueprint = bad; //错误对象代替蓝图对象
end //"钩子"完成事务基类错误注入
env.run();
env.wrap_up();
end
endprogram