90 lines
1.7 KiB
Systemverilog
90 lines
1.7 KiB
Systemverilog
|
//For ram_regfile
|
||
|
class ram_refmodel;
|
||
|
|
||
|
virtual spi_if wif;
|
||
|
virtual sram_if#(25,32) xif;
|
||
|
|
||
|
int base_addr;
|
||
|
int sel;
|
||
|
//poor-quality register model
|
||
|
bit [31:0] rm1[8192];
|
||
|
bit [31:0] rm2[ 64];
|
||
|
bit [31:0] rm3[1024];
|
||
|
|
||
|
//members to be sent to scoreboard
|
||
|
int rst_error[5];
|
||
|
bit[31:0] dout[$];
|
||
|
spi_trans ramout[$];
|
||
|
|
||
|
function new();
|
||
|
|
||
|
endfunction
|
||
|
extern task do_imitate();
|
||
|
extern task RWreg_write (bit[24:0] addr,bit[32:0] din);
|
||
|
extern task reg_read (bit[24:0] addr );
|
||
|
|
||
|
endclass : ram_refmodel
|
||
|
|
||
|
task ram_refmodel::do_imitate();
|
||
|
|
||
|
int i=0,j=0;
|
||
|
|
||
|
|
||
|
fork
|
||
|
|
||
|
|
||
|
while(1) begin: write_reg_RW
|
||
|
|
||
|
@(negedge xif.wren);
|
||
|
|
||
|
RWreg_write(xif.addr,xif.din);
|
||
|
|
||
|
end: write_reg_RW
|
||
|
|
||
|
|
||
|
while(1) begin: read_reg
|
||
|
|
||
|
@(negedge xif.rden);
|
||
|
// repeat(3) @(posedge xif.clk);
|
||
|
|
||
|
reg_read(xif.addr);
|
||
|
|
||
|
end: read_reg
|
||
|
|
||
|
join
|
||
|
|
||
|
endtask: do_imitate
|
||
|
|
||
|
task ram_refmodel::RWreg_write(bit[24:0] addr,bit[32:0] din);
|
||
|
|
||
|
@(posedge wif.clk);
|
||
|
|
||
|
if(addr[24:20] == base_addr) begin
|
||
|
case(sel)
|
||
|
1:rm1[addr[15:2]] = din;
|
||
|
2:rm2[addr[15:2]] = din;
|
||
|
3:rm3[addr[15:2]] = din;
|
||
|
endcase
|
||
|
end
|
||
|
//$display("addr:%0h",addr);
|
||
|
//$display("rm[%d]:%h",addr[15:2],rm2[addr[15:2]]);
|
||
|
//$display("din:%h",din);
|
||
|
|
||
|
|
||
|
endtask: RWreg_write
|
||
|
|
||
|
task ram_refmodel::reg_read(bit[24:0] addr);
|
||
|
|
||
|
@(posedge wif.clk);
|
||
|
|
||
|
if(addr[24:20] == base_addr) begin
|
||
|
case(sel)
|
||
|
1:dout.push_back(rm1[ addr[14:2]]);
|
||
|
2:dout.push_back(rm2[ addr[14:2]]);
|
||
|
3:dout.push_back(rm3[ addr[14:2]]);
|
||
|
endcase
|
||
|
|
||
|
end
|
||
|
// $display("dout:%h",dout[$]);
|
||
|
endtask: reg_read
|