Professional Documents
Culture Documents
Dpram
Dpram
constraint wr_rd_c{w_en!=r_en};
end transaction
///////////////////////////////////////////////////////////////////generator///////
/////////////////////////////////////
class generator;
task main();
repeat (repeat_count)
begin
tans =new();
if(!trans.randomize())
$fatal("transaction failed");
gen2driv.put(trans);
end
-> ended;
endtask
end class
////////////////////////////////////////////////////////////interface//////////////
//////////////////////////////////////
logic w_en,r_en;
logic [addr_width-1:0] r_addr;
logic [data_width-1:0] w_data;
logic [addr_width-1:0] w_addr;
logic [data_width-1:0] r_data;
endinterface
/////////////////////////////////////////////////////driver////////////////////////
///////////////////////////////////////
class driver;
int no_transactions;
mailbox gen2driv;
virtual interface intf vif;
task rst;
wait(vif.rst);
$display("--------- [DRIVER] Reset Started ---------");
vif.w_en <= 0;
vif.r_en <= 0;
vif.w_addr <= 0;
vif.w_data <= 0;
vif.r_addr <= 0;
//`DRIV_IF.r_data <= 0;
wait(!vif.rst);
$display("--------- [DRIVER] Reset Ended ---------");
endtask
task main();
forever begin
transactin trans;
vif.r_en<=0;
vif.w_en<=0;
gen2driv.get(trans);
$display("------- [DRIVER-TRANSFER: %0d] -------",no_transactions);
@(posedge vif.clk);
vif.w_addr<=trans.w_addr;
vif.r_addr<=trans.r_addr;
if(trans.w_en)
begin
vif.w_en <= trans.en;
vif.w_addr <= trans.w_data;
$display("w_addr= %b, w_data=%b",trans.w_addr,trans.w_data);
@(posedge vif.clk);
end
if(trans.r_en)
begin
vif.r_en <= trans.r_en;
vif.r_data <= trans.r_addr;
$display("r_addr= %b, r_data=%b",trans.r_addr,trans.r_data);
@(posedge vif.clk);
end
no_transactions++;
end
endtask
endclass
///////////////////////////////////////////environment/////////////////////////////
////////////////////
`include "generator.sv"
`include "driver.sv"
`include "transaction.sv"
class environment;
generator gen;
driver driv;
mailbox gen2driv;
event gen_ended;
task pre_test();
driv.rst();
endtask
task test();
fork
gen.main();
driv.main();
join_any
endtask
task post_test();
begin
wait(gen_ended.triggered);
wait(gen.repeat_count == driv.no_transactions);
end
endtask
task run();
begin
pre_test();
test();
post_test;
$finish();
end
endtask
endclass
/////////////////////////////////////////programtest///////////////////////////////
///////////
`include "environment.sv"
program test(intf kf);
environment env;
initial begin
env=new(kf);
env.gen.repeat_count=5;
env.run();
end
endprogram
////////////////////////////////////////top////////////////////////////////////////
//////////
`include "interface.sv"
`include "test.sv"
module top();
bit clk,rst;
//reset Generation
initial begin
rst = 1;
#5 rst =0;
end