Professional Documents
Culture Documents
class generator;
rand transaction trans;
mailbox mlt;
event ended;
function new(mailbox mlt, event ended);
this.mlt = mlt;
this.ended = ended;
endfunction
task main ();
repeat (repeat_count)
begin
trans = new();
trans.randomize;
end
endtask
endclass
class interface;
interface mem_intf (input logic clk, reset);
logic [1:0]addr;
logic wr_en;
logic rd_en;
logic [7:0]wdata;
logic [7:0]rdata;
class driver;
int no_transaction;
virtual mem_intf mem_vif;
mailbox mlt;
function new(virtual mem_intf mem_vif, mailbox mlt);
this.mem_vif = mem_vif;
this.mlt = mlt;
endfunction
task reset;
wait(mem_vif.reset);
$display ("----------reset started---------");
`driv_if.wr_en <=0;
`driv_if.rd_en <=0;
`driv_if.addr <=0;
`driv_if.wdata <=0;
wait(!mem_vif.reset);
$display("----------reset ended---------");
endtask
task driver;
transaction trans;
`driv_if.wr_en <=0;
`driv_if.rd_en <=0;
mlt.get(trans);
$display("\t addr=%0h wdata=%0h",trans.
addr,trans.wdata);
@(posedge mem_vif.driver.clk);
`driv_if.addr <= trans.addr;
if(trans.wr_en)begin
`driv_ifwr_en <=trans.wr_en:
`driv_if.wdata <=trans.wdata;
$display("\t addr=%0h wdata=%0h",trans.addr,trans.wdata);
@(posedge mem_vif.driver.clk);
end
if(trans.rd_en) begin
`driv_if.rd_en <=trans.rd_en;
@(poseedge mem_vif.driver.clk);
`driv_if.rd_en <=0;
@(poseedge mem_vif.driver.clk);
trans.rdata = `driv_if.rdata;
$display('\t addr=%0h rdata=%0h",trans.addr,`driv_if.rdata);
end
$display("---------------------");
//no_transaction++;
end
endtask
endclass
`include "transaction.sv"
`include "generator.sv"
`include " driver.sv"
class enviornament;
generator gen;
driver driv;
mailbox mlt;
event gen_ended;
virtual mem_intf mem_vif;
function new(virtual mem_intf mem_vif);
this.mem_vif = mem_vif;
mlt = new();
gen = new(mlt,gen_ended);
driv = (mem_vif,mlt);
endfunction
task pre_test();
driv.reset();
endtask
task test();
fork
gen.main();
driv.main();
join_any
endtask
task poast_test();
wait(gen_ended.triggered);
//wait(gen.repeat_count==driv.no_transactions);
endtask
task run;
pre_test();
test();
post_test();
$finish;
endtask
endclass
`include "environment.sv"
program test(mem_intf intf);
enviornament env;
initial begin
env = new(intf);
env.gen.repeat_count = 10;
env.run();
end
endprogram
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// www.verificationguide.com testbench.sv
//-------------------------------------------------------------------------
//tbench_top or testbench top, this is the top most file, in which DUT(Design Under
Test) and Verification environment are connected.
//-------------------------------------------------------------------------
//-------------------------[NOTE]---------------------------------
//Particular testcase can be run by uncommenting, and commenting the rest
//`include "random_test.sv"
//`include "wr_rd_test.sv"
`include "default_rd_test.sv"
//----------------------------------------------------------------
module tbench_top;
//clock generation
always #5 clk = ~clk;
//reset Generation
initial begin
reset = 1;
#5 reset =0;
end