110 lines
2.6 KiB
Systemverilog
110 lines
2.6 KiB
Systemverilog
class mcureg_monitor;
|
|
|
|
virtual mcureg_if mif;
|
|
virtual spi_if wif;
|
|
virtual sram_if xif;
|
|
|
|
static int pktnum;
|
|
|
|
//Mask Cache
|
|
bit[3 :0] mask_temp[$];
|
|
|
|
//Collected Vars
|
|
mcureg_trans mcu_tr[$];
|
|
|
|
|
|
function new();
|
|
endfunction
|
|
extern task do_mon();
|
|
extern task collect();
|
|
|
|
endclass : mcureg_monitor
|
|
|
|
task mcureg_monitor::do_mon();
|
|
int pkt_i=0;
|
|
|
|
fork
|
|
|
|
while(1) begin: mcureg_monitor
|
|
if(pkt_i==pktnum) break;
|
|
if(wif.csn) @(negedge wif.csn);
|
|
collect();
|
|
end: mcureg_monitor
|
|
|
|
repeat(pktnum) begin: kill_progress
|
|
@(negedge wif.csn);
|
|
pkt_i++;
|
|
end
|
|
|
|
join
|
|
|
|
endtask: do_mon
|
|
|
|
|
|
task mcureg_monitor::collect();
|
|
mcureg_trans mcu_tr_temp;
|
|
bit[31:0] cmd_temp;
|
|
int size=0;
|
|
int i=0,j=0;
|
|
|
|
for(j=0;j<31;j++) begin
|
|
@(posedge wif.sclk or posedge wif.csn)
|
|
if(wif.error_check | wif.csn)
|
|
break;
|
|
cmd_temp[j] = wif.mosi;
|
|
end
|
|
size = cmd_temp[1] ? 16 : 1;
|
|
|
|
mcu_tr.delete;
|
|
j=0;
|
|
repeat(size) begin
|
|
|
|
mcu_tr_temp = new();
|
|
|
|
//if read, collect regfile's input port as exp_data
|
|
//act_data is monitored by spi_monitor(MISO)
|
|
if(cmd_temp[0]) begin: mcureg_in_monitor
|
|
//get the "mask" @ the last write_enable
|
|
//because registers update "mask" only @ "wren"
|
|
mcu_tr_temp.wrmask = mask_temp[j];
|
|
@(posedge xif.rden);
|
|
repeat(1) @(posedge wif.clk);
|
|
mcu_tr_temp.mcu_param = mif.mcu_param;
|
|
mcu_tr_temp.run_time = mif.run_time;
|
|
mcu_tr_temp.instr_num = mif.instr_num;
|
|
mcu_tr_temp.fb_st_info = mif.fb_st_info;
|
|
end: mcureg_in_monitor
|
|
|
|
//if write, collect regfile's output port as act_data
|
|
//exp_data is monitored by spi_monitor(MOSI)
|
|
else begin: mcureg_out_monitor
|
|
@(posedge xif.wren);
|
|
repeat(2) @(posedge wif.clk);
|
|
mcu_tr_temp.wrmask = mif.wrmask;
|
|
mask_temp[j] = mif.wrmask;
|
|
//wait half_clk to sample output port,for stability
|
|
@(negedge wif.clk);
|
|
mcu_tr_temp.mcu_result = mif.mcu_result;
|
|
mcu_tr_temp.mcu_cwfr = mif.mcu_cwfr;
|
|
mcu_tr_temp.mcu_gapr = mif.mcu_gapr;
|
|
mcu_tr_temp.mcu_ampr = mif.mcu_ampr;
|
|
mcu_tr_temp.mcu_baisr = mif.mcu_baisr;
|
|
mcu_tr_temp.mcu_intp_sel = mif.mcu_intp_sel;
|
|
mcu_tr_temp.mcu_nco_pha_clr = mif.mcu_nco_pha_clr;
|
|
mcu_tr_temp.mcu_rz_pha = mif.mcu_rz_pha;
|
|
end: mcureg_out_monitor
|
|
|
|
mcu_tr.push_back(mcu_tr_temp);
|
|
j++;
|
|
//$display("cmd:%0d",cmd_temp[0]);
|
|
//$display("size:%0d",size);
|
|
//$display("mcu_param[0]:%d",mcu_tr_temp.mcu_param[0]);
|
|
//$display("wrmask:%0d",mcu_tr_temp.wrmask);
|
|
end
|
|
|
|
if(cmd_temp[0] & !wif.csn) @(posedge wif.csn);
|
|
|
|
endtask
|
|
|
|
|