SPI_Test/tb/testbench/mcureg_tb/mcureg_driver.sv

82 lines
1.3 KiB
Systemverilog
Raw Normal View History

2024-06-25 16:41:01 +08:00
class mcureg_driver;
mcureg_trans tr;
//interface
virtual mcureg_if mif;
virtual spi_if wif;
int pktnum;
function new();
endfunction
extern task do_drive();
extern task make_pkt();
endclass : mcureg_driver
task mcureg_driver::do_drive();
int pkt_i = 0;
mif.fb_st_info = 2'b0 ;
mif.run_time = 32'b0 ;
mif.instr_num = 32'b0 ;
mif.mcu_param[3:0] = {32'b0,32'b0,32'b0,32'b0} ;
fork
while(1) begin
if(pkt_i == pktnum) break;
make_pkt();
end
repeat(pktnum) begin: kill_progress
@(negedge wif.csn);
pkt_i++;
end
join
endtask
task mcureg_driver::make_pkt();
int cnt=0;
cnt = 0;
tr = new();
if(!tr.randomize())
$fatal(0,"Randomize Failed");
while(cnt<2000) begin
@(posedge wif.clk);
cnt = cnt + 1;
case(cnt)
tr.wrmask_time:
mif.wrmask <= tr.wrmask;
tr.fb_st_info_time:
mif.fb_st_info <= tr.fb_st_info;
tr.run_time_time:
mif.run_time <= tr.run_time;
tr.instr_num_time:
mif.instr_num <= tr.instr_num;
tr.mcu_param_time[0]:
mif.mcu_param[0] <= tr.mcu_param[0];
tr.mcu_param_time[1]:
mif.mcu_param[1] <= tr.mcu_param[1];
tr.mcu_param_time[2]:
mif.mcu_param[2] <= tr.mcu_param[2];
tr.mcu_param_time[3]:
mif.mcu_param[3] <= tr.mcu_param[3];//*/
endcase
end
endtask : make_pkt