Tutorials
DRIVER
Driver is a tranctor. It is extension of avm_verification_component. Get the packets from gen2drv chennel and drive them on to dut interface. Put the packets in to drv2sb channel.
CODE:driver.sv
class driver extends avm_verification_component;
virtual switch_if intf;
string msg;
packet pkt;
Configuration cfg;
tlm_blocking_get_if#( packet) get_port;
tlm_blocking_put_if#( packet) put_sb;
function new ( string nm, Configuration cfg);
this . cfg = cfg;
super . new ( nm);
endfunction
function void connect;
endfunction
task run;
reset_dut();
cfg_dut();
forever
begin
get_port. get ( pkt);
$display ( "consumer: sendging %s packet\n" , pkt. convert2string);
drive( pkt);
avm_report_message( "Driver" , "Puting packet to score board" );
put_sb. put ( pkt);
@( negedge intf. clock);
end
endtask
task drive( packet pkt);
logic [ 7 : 0 ] pack[];
int pkt_len;
pkt_len = pkt. byte_pack( pack, 0 , 0 );
$swrite ( this . msg, "Packed packet length %d \n" , pkt_len);
avm_report_message( "Driver" , this . msg);
@( negedge intf. clock);
for ( int i= 0 ; i< pkt_len - 1 ; i++)
begin
@( negedge intf. clock);
intf. data_status <= 1 ;
intf. data_in <= pack[ i];
end
@( negedge intf. clock);
intf. data_status <= 0 ;
intf. data_in <= pack[ pkt_len - 1 ];
@( negedge intf. clock);
endtask
task reset_dut();
avm_report_message( "reset_dut" , " Starting... reset_dut \n" );
@( negedge intf. clock);
avm_report_message( "reset_dut" , " Starting... reset_dut \n" );
intf. data_status <= 0 ;
intf. data_in <= 0 ;
intf. read <= 0 ;
intf. mem_data <= 0 ;
intf. mem_add <= 0 ;
intf. reset <= 0 ;
intf. mem_en <= 0 ;
intf. mem_rd_wr <= 0 ;
@( negedge intf. clock);
# 2 intf. reset <= 1 ;
@( negedge intf. clock);
# 2 intf. reset <= 0 ;
@( negedge intf. clock);
@( negedge intf. clock);
avm_report_message( "reset_dut" , " Ending... reset_dut \n" );
endtask
task cfg_dut() ;
avm_report_message( "cfg_dut" , " Starting... cfg_dut \n" );
for ( int i = 0 ; i< 4 ; i++)
begin
intf. mem_en <= 1 ;
@( negedge intf. clock);
intf. mem_rd_wr <= 1 ;
@( negedge intf. clock);
intf. mem_add <= i;
intf. mem_data <= cfg. da_port[ i];
end
@( negedge intf. clock);
intf. mem_en <= 0 ;
intf. mem_rd_wr <= 0 ;
intf. mem_add <= 0 ;
intf. mem_data <= 0 ;
avm_report_message( "cfg_dut" , " Ending... cfg_dut \n" );
endtask
endclass