SPI_Test/tb/mcureg_tb/mcu_refmodel.sv

285 lines
10 KiB
Systemverilog
Raw Normal View History

2024-06-25 16:41:01 +08:00
//For mcu_regfile, the ROreg: mcu_para/rtimr/icntr/fsir are updated by the inputs
//at this clk_posedge due to dff(inputs->regs)
class mcu_refmodel;
virtual mcureg_if mif;
virtual spi_if wif;
virtual sram_if#(25,32) xif;
//poor-quality register model
bit[31:0] rm[42];
//members to be sent to scoreboard
int rst_error[5];
bit[31:0] dout[$];
mcureg_trans mcuout[$];
function new();
endfunction
extern task do_imitate();
extern task RWreg_write (bit[24:0] addr,bit[32:0] din );
extern task ROreg_update (bit[24:0] addr );
extern task reg_read (bit[24:0] addr );
extern task output_trace (bit[24:0] addr );
endclass : mcu_refmodel
task mcu_refmodel::do_imitate();
int i=0,j=0;
rm[ 0] = 32'h0; //MCUPARAR0
rm[ 1] = 32'h0; //MCUPARAR1
rm[ 2] = 32'h0; //MCUPARAR2
rm[ 3] = 32'h0; //MCUPARAR3
rm[ 4] = 32'h0; //MCURESR0
rm[ 5] = 32'h0; //MCURESR1
rm[ 6] = 32'h0; //MCURESR2
rm[ 7] = 32'h0; //MCURESR3
rm[16] = 32'h0; //CWFR0
rm[17] = 32'h0; //CWFR1
rm[18] = 32'h0; //CWFR2
rm[19] = 32'h0; //CWFR3
rm[20] = 32'h0; //CWPRR
rm[21] = 32'h0; //GAPR0
rm[22] = 32'h0; //GAPR1
rm[23] = 32'h0; //GAPR2
rm[24] = 32'h0; //GAPR3
rm[25] = 32'h0; //GAPR4
rm[26] = 32'h0; //GAPR5
rm[27] = 32'h0; //GAPR6
rm[28] = 32'h0; //GAPR7
rm[29] = 32'h0; //LCPR
rm[30] = 32'h0; //AMPR0
rm[31] = 32'h0; //AMPR1
rm[32] = 32'h0; //AMPR2
rm[33] = 32'h0; //AMPR3
rm[34] = 32'h0; //BIASR0
rm[35] = 32'h0; //BIASR1
rm[36] = 32'h0; //BIASR2
rm[37] = 32'h0; //BIASR3
rm[38] = 32'h0; //RTIMR
rm[39] = 32'h0; //ICNTR
rm[40] = 32'h0; //FSIR
rm[41] = 32'h0; //INTPSELR
fork
while(1) begin: write_reg_RW
@(negedge xif.wren);
RWreg_write(xif.addr,xif.din);
end: write_reg_RW
while(1) begin: update_reg_RO
@(negedge xif.rden);
ROreg_update(xif.addr);
end: update_reg_RO
while(1) begin: read_reg
@(negedge xif.rden);
reg_read(xif.addr);
end: read_reg
while(1) begin: output_port
@(negedge xif.wren);
output_trace(xif.addr);
end: output_port
join
endtask: do_imitate
task mcu_refmodel::RWreg_write(bit[24:0] addr,bit[32:0] din);
bit[31:0] wrmask;
//make mask into 32bit
wrmask = {{8{mif.wrmask[3]}},{8{mif.wrmask[2]}},{8{mif.wrmask[1]}},{8{mif.wrmask[0]}}};
//delay caused by decoder
@(posedge wif.clk);
case(addr[24: 2])
23'h1C0004: rm[ 4] = wrmask ? din : rm[ 4]; //MCURESR0
23'h1C0005: rm[ 5] = wrmask ? din : rm[ 5]; //MCURESR1
23'h1C0006: rm[ 6] = wrmask ? din : rm[ 6]; //MCURESR2
23'h1C0007: rm[ 7] = wrmask ? din : rm[ 7]; //MCURESR3
23'h1C0010: rm[16] = wrmask ? din : rm[16]; //CWFR0
23'h1C0011: rm[17] = wrmask ? din : rm[17]; //CWFR1
23'h1C0012: rm[18] = wrmask ? din : rm[18]; //CWFR2
23'h1C0013: rm[19] = wrmask ? din : rm[19]; //CWFR3
23'h1C0014: rm[20] = wrmask[0 : 0] ? {din[0 : 0],rm[20][31: 1]} : rm[20]; //CWPRR
23'h1C0015: rm[21] = wrmask[31:16] ? {din[31:16],rm[21][31:16]} : rm[21]; //GAPR0
23'h1C0016: rm[22] = wrmask[31:16] ? {din[31:16],rm[22][31:16]} : rm[22]; //GAPR1
23'h1C0017: rm[23] = wrmask[31:16] ? {din[31:16],rm[23][31:16]} : rm[23]; //GAPR2
23'h1C0018: rm[24] = wrmask[31:16] ? {din[31:16],rm[24][31:16]} : rm[24]; //GAPR3
23'h1C0019: rm[25] = wrmask[31:16] ? {din[31:16],rm[25][31:16]} : rm[25]; //GAPR4
23'h1C001a: rm[26] = wrmask[31:16] ? {din[31:16],rm[26][31:16]} : rm[26]; //GAPR5
23'h1C001b: rm[27] = wrmask[31:16] ? {din[31:16],rm[27][31:16]} : rm[27]; //GAPR6
23'h1C001c: rm[28] = wrmask[31:16] ? {din[31:16],rm[28][31:16]} : rm[28]; //GAPR7
23'h1C001d: rm[29] = wrmask[31:16] ? {din[31:16],rm[29][31:16]} : rm[29]; //LCPR
23'h1C001e: rm[30] = wrmask[31:16] ? {din[31:16],rm[30][31:16]} : rm[30]; //AMPR0
23'h1C001f: rm[31] = wrmask[31:16] ? {din[31:16],rm[31][31:16]} : rm[31]; //AMPR1
23'h1C0020: rm[32] = wrmask[31:16] ? {din[31:16],rm[32][31:16]} : rm[32]; //AMPR2
23'h1C0021: rm[33] = wrmask[31:16] ? {din[31:16],rm[33][31:16]} : rm[33]; //AMPR3
23'h1C0022: rm[34] = wrmask[31:16] ? {din[31:16],rm[34][31:16]} : rm[34]; //BIASR0
23'h1C0023: rm[35] = wrmask[31:16] ? {din[31:16],rm[35][31:16]} : rm[35]; //BIASR1
23'h1C0024: rm[36] = wrmask[31:16] ? {din[31:16],rm[36][31:16]} : rm[36]; //BIASR2
23'h1C0025: rm[37] = wrmask[31:16] ? {din[31:16],rm[37][31:16]} : rm[37]; //BIASR3
23'h1C0029: rm[41] = wrmask[1 : 0] ? {rm[37][31:2 ],din[1 : 0]} : rm[41]; //INTPSELR
endcase
@(posedge wif.clk);
case(addr[24: 2])
23'h04_0014: rm[12] = 32'b0;
endcase
/* $display("mask:%h",wrmask);
$display("addr:%0h",addr);
$display("rm[%d]:%h",addr[15:2],rm[addr[15: 2]]);
$display("din:%h",din);//*/
endtask: RWreg_write
task mcu_refmodel::ROreg_update(bit[24:0] addr);
//@(posedge wif.clk);
rm[ 0] = mif.mcu_param[0]; //MCUPARAR0
rm[ 1] = mif.mcu_param[1]; //MCUPARAR1
rm[ 2] = mif.mcu_param[2]; //MCUPARAR2
rm[ 3] = mif.mcu_param[3]; //MCUPARAR3
rm[38] = mif.run_time ; //RTIMR
rm[39] = mif.instr_num ; //ICNTR
rm[40] = {rm[32][31:2],mif.fb_st_info[1:0]}; //FSIR
endtask: ROreg_update
task mcu_refmodel::reg_read(bit[24:0] addr);
//delay caused be decoder
//@(posedge wif.clk);
case(addr[24: 2])
23'h1C0000: dout.push_back(rm[ 0]); //MCUPARAR0
23'h1C0001: dout.push_back(rm[ 1]); //MCUPARAR1
23'h1C0002: dout.push_back(rm[ 2]); //MCUPARAR2
23'h1C0003: dout.push_back(rm[ 3]); //MCUPARAR3
23'h1C0004: dout.push_back(rm[ 4]); //MCURESR0
23'h1C0005: dout.push_back(rm[ 5]); //MCURESR1
23'h1C0006: dout.push_back(rm[ 6]); //MCURESR2
23'h1C0007: dout.push_back(rm[ 7]); //MCURESR3
23'h1C0008: dout.push_back(32'b0) ;
23'h1C0010: dout.push_back(rm[16]); //CWFR0
23'h1C0011: dout.push_back(rm[17]); //CWFR1
23'h1C0012: dout.push_back(rm[18]); //CWFR2
23'h1C0013: dout.push_back(rm[19]); //CWFR3
23'h1C0014: dout.push_back(rm[20]); //CWPRR
23'h1C0015: dout.push_back(rm[21]); //GAPR0
23'h1C0016: dout.push_back(rm[22]); //GAPR1
23'h1C0017: dout.push_back(rm[23]); //GAPR2
23'h1C0018: dout.push_back(rm[24]); //GAPR3
23'h1C0019: dout.push_back(rm[25]); //GAPR4
23'h1C001a: dout.push_back(rm[26]); //GAPR5
23'h1C001b: dout.push_back(rm[27]); //GAPR6
23'h1C001c: dout.push_back(rm[28]); //GAPR7
23'h1C001d: dout.push_back(rm[29]); //LCPR
23'h1C001e: dout.push_back(rm[30]); //AMPR0
23'h1C001f: dout.push_back(rm[31]); //AMPR1
23'h1C0020: dout.push_back(rm[32]); //AMPR2
23'h1C0021: dout.push_back(rm[33]); //AMPR3
23'h1C0022: dout.push_back(rm[34]); //BIASR0
23'h1C0023: dout.push_back(rm[35]); //BIASR1
23'h1C0024: dout.push_back(rm[36]); //BIASR2
23'h1C0025: dout.push_back(rm[37]); //BIASR3
23'h1C0026: dout.push_back(rm[38]); //RTIMR
23'h1C0027: dout.push_back(rm[39]); //ICNTR
23'h1C0028: dout.push_back(rm[40]); //FSIR
23'h1C0029: dout.push_back(rm[41]); //INTPSELR
23'h1C002a: dout.push_back(32'b0) ;
endcase
// $display("dout:%h",dout[$]);
endtask: reg_read
task mcu_refmodel::output_trace(bit[24:0] addr);
mcureg_trans tr_temp;
//delay caused by decoder
@(posedge wif.clk);
@(negedge wif.clk);
tr_temp = new();
if(addr[24:20] == 5'h7)
begin
tr_temp.mcu_result[0] = rm[ 4] ; //MCURESR0
tr_temp.mcu_result[1] = rm[ 5] ; //MCURESR1
tr_temp.mcu_result[2] = rm[ 6] ; //MCURESR2
tr_temp.mcu_result[3] = rm[ 7] ; //MCURESR3
tr_temp.mcu_cwfr[0] = rm[16] ; //CWFR0
tr_temp.mcu_cwfr[1] = rm[17] ; //CWFR1
tr_temp.mcu_cwfr[2] = rm[18] ; //CWFR2
tr_temp.mcu_cwfr[3] = rm[19] ; //CWFR3
tr_temp.mcu_nco_pha_clr = rm[20][0 : 0]; //CWPRR
tr_temp.mcu_gapr[0] = rm[21][31:16]; //GAPR0
tr_temp.mcu_gapr[1] = rm[22][31:16]; //GAPR1
tr_temp.mcu_gapr[2] = rm[23][31:16]; //GAPR2
tr_temp.mcu_gapr[3] = rm[24][31:16]; //GAPR3
tr_temp.mcu_gapr[4] = rm[25][31:16]; //GAPR4
tr_temp.mcu_gapr[5] = rm[26][31:16]; //GAPR5
tr_temp.mcu_gapr[6] = rm[27][31:16]; //GAPR6
tr_temp.mcu_gapr[7] = rm[28][31:16]; //GAPR7
tr_temp.mcu_rz_pha = rm[29][15: 0]; //LCPR
tr_temp.mcu_ampr[0] = rm[30][31:16]; //AMPR0
tr_temp.mcu_ampr[1] = rm[31][31:16]; //AMPR1
tr_temp.mcu_ampr[2] = rm[32][31:16]; //AMPR2
tr_temp.mcu_ampr[3] = rm[33][31:16]; //AMPR3
tr_temp.mcu_baisr[0] = rm[34][31:16]; //BIASR0
tr_temp.mcu_baisr[1] = rm[35][31:16]; //BIASR1
tr_temp.mcu_baisr[2] = rm[36][31:16]; //BIASR2
tr_temp.mcu_baisr[3] = rm[37][31:16]; //BIASR3
tr_temp.mcu_intp_sel = rm[38][1 : 0]; //INTPSELR
mcuout.push_back(tr_temp);
end
//$display("addr:%0h",addr);
//$display("rm:",rm);
//$display("din:%h",din);
endtask: output_trace