|
@@ -0,0 +1,330 @@ |
|
|
|
|
|
class scoreboard extends uvm_scoreboard; |
|
|
|
|
|
|
|
|
|
|
|
`uvm_component_utils(scoreboard) |
|
|
|
|
|
|
|
|
|
|
|
env_config m_cfg; |
|
|
|
|
|
|
|
|
|
|
|
uvm_tlm_analysis_fifo #(master_xtn) mas_fifo[][]; |
|
|
|
|
|
uvm_tlm_analysis_fifo #(slave_xtn) slv_fifo[][]; |
|
|
|
|
|
|
|
|
|
|
|
master_xtn write_address; |
|
|
|
|
|
slave_xtn write_address_1; |
|
|
|
|
|
master_xtn write_address_1_1; |
|
|
|
|
|
|
|
|
|
|
|
master_xtn write_data; |
|
|
|
|
|
slave_xtn write_data_1; |
|
|
|
|
|
master_xtn write_data_1_1; |
|
|
|
|
|
|
|
|
|
|
|
slave_xtn write_response; |
|
|
|
|
|
master_xtn write_response_1; |
|
|
|
|
|
master_xtn write_response_1_1; |
|
|
|
|
|
|
|
|
|
|
|
master_xtn read_address; |
|
|
|
|
|
slave_xtn read_address_1; |
|
|
|
|
|
master_xtn read_address_1_1; |
|
|
|
|
|
|
|
|
|
|
|
master_xtn read_data_response; |
|
|
|
|
|
slave_xtn read_data_response_1; |
|
|
|
|
|
master_xtn read_data_response_1_1; |
|
|
|
|
|
|
|
|
|
|
|
extern function new (string name = "scoreboard",uvm_component parent); |
|
|
|
|
|
extern function void build_phase (uvm_phase phase); |
|
|
|
|
|
extern task run_phase (uvm_phase phase); |
|
|
|
|
|
extern task compare_write_address(); |
|
|
|
|
|
extern task compare_write_data(); |
|
|
|
|
|
extern task compare_write_response(); |
|
|
|
|
|
extern task compare_read_address(); |
|
|
|
|
|
extern task compare_read_data_response (); |
|
|
|
|
|
|
|
|
|
|
|
extern function void report_phase (uvm_phase phase); |
|
|
|
|
|
int success [bit [3:0]]; |
|
|
|
|
|
|
|
|
|
|
|
int channel_1; |
|
|
|
|
|
|
|
|
|
|
|
endclass |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////// NEW FUNCTION |
|
|
|
|
|
|
|
|
|
|
|
function scoreboard::new (string name = "scoreboard",uvm_component parent); |
|
|
|
|
|
|
|
|
|
|
|
super.new (name,parent); |
|
|
|
|
|
write_address_cov = new(); |
|
|
|
|
|
write_data_cov = new(); |
|
|
|
|
|
write_data_cov_2 = new(); |
|
|
|
|
|
write_response_cov = new(); |
|
|
|
|
|
read_address_cov = new(); |
|
|
|
|
|
read_data_response_cov = new(); |
|
|
|
|
|
read_data_response_cov_2 = new(); |
|
|
|
|
|
|
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////// BUILD PHASE |
|
|
|
|
|
|
|
|
|
|
|
function void scoreboard::build_phase (uvm_phase phase); |
|
|
|
|
|
|
|
|
|
|
|
super.build_phase(phase); |
|
|
|
|
|
|
|
|
|
|
|
run_test19: |
|
|
|
|
|
if(!uvm_config_db #(env_config)::get(this,"","env_config",m_cfg)) |
|
|
|
|
|
`uvm_fatal ("SCOREBOADR","\n\n\t\t\t\tGETTING DATABASE FAILED\n\n") |
|
|
|
|
|
|
|
|
|
|
|
mas_fifo = new [m_cfg.no_of_mas_top_agts * m_cfg.no_of_mas_agts]; |
|
|
|
|
|
|
|
|
|
|
|
foreach(mas_fifo[i]) |
|
|
|
|
|
begin |
|
|
|
|
|
mas_fifo[i] = new[5]; |
|
|
|
|
|
|
|
|
|
|
|
run_test19: |
|
|
|
|
|
for (int j = 0;j < 5;j++) |
|
|
|
|
|
mas_fifo[i][j] = new ($sformatf("mas_fifo[%0d][%0d]",i,j),this); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
slv_fifo = new [m_cfg.no_of_slv_top_agts * m_cfg.no_of_slv_agts]; |
|
|
|
|
|
|
|
|
|
|
|
foreach(slv_fifo[i]) |
|
|
|
|
|
begin |
|
|
|
|
|
slv_fifo[i] = new[5]; |
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0;j < 5;j++) |
|
|
|
|
|
slv_fifo[i][j] = new ($sformatf("slv_fifo[%0d][%0d]",i,j),this); |
|
|
|
|
|
end |
|
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// RUN PHASE |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::run_phase (uvm_phase phase); |
|
|
|
|
|
|
|
|
|
|
|
fork |
|
|
|
|
|
forever |
|
|
|
|
|
begin |
|
|
|
|
|
mas_fifo[0][0].get (write_address); |
|
|
|
|
|
slv_fifo[0][0].get (write_address_1); |
|
|
|
|
|
compare_write_address(); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
forever |
|
|
|
|
|
run_test19: |
|
|
|
|
|
begin |
|
|
|
|
|
mas_fifo[0][1].get (write_data); |
|
|
|
|
|
slv_fifo[0][1].get (write_data_1); |
|
|
|
|
|
compare_write_data(); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
forever |
|
|
|
|
|
begin |
|
|
|
|
|
mas_fifo[0][2].get (write_response_1); |
|
|
|
|
|
slv_fifo[0][2].get (write_response); |
|
|
|
|
|
compare_write_response(); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
run_test19: |
|
|
|
|
|
forever |
|
|
|
|
|
begin |
|
|
|
|
|
mas_fifo[0][3].get (read_address); |
|
|
|
|
|
slv_fifo[0][3].get (read_address_1); |
|
|
|
|
|
compare_read_address(); |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
forever |
|
|
|
|
|
begin |
|
|
|
|
|
run_test19: |
|
|
|
|
|
mas_fifo[0][4].get (read_data_response); |
|
|
|
|
|
slv_fifo[0][4].get (read_data_response_1); |
|
|
|
|
|
compare_read_data_response (); |
|
|
|
|
|
end |
|
|
|
|
|
join |
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// COMPARE WRITE ADDRESS |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::compare_write_address(); |
|
|
|
|
|
|
|
|
|
|
|
write_address_1_1 = master_xtn::type_id::create ("write_address_compare"); |
|
|
|
|
|
|
|
|
|
|
|
write_address_1_1.awid = write_address_1.awid; |
|
|
|
|
|
write_address_1_1.awaddr = write_address_1.awaddr; |
|
|
|
|
|
write_address_1_1.awlen = write_address_1.awlen; |
|
|
|
|
|
write_address_1_1.awsize = write_address_1.awsize; |
|
|
|
|
|
write_address_1_1.awburst = write_address_1.awburst; |
|
|
|
|
|
|
|
|
|
|
|
write_address.control = 1; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE ADDRESS fROM MASTER MONITOR \n %s",write_address.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_address_1_1.control = 1; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE ADDRESS fROM SLAVE MONITOR \n %s",write_address_1_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_address_1_1.control_1 = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (write_address_1_1.compare (write_address)) |
|
|
|
|
|
begin |
|
|
|
|
|
write_address_cov.sample(); |
|
|
|
|
|
|
|
|
|
|
|
success[write_address.awid][1:0] = 1; |
|
|
|
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
success[write_address.awid][1:0] = 2; |
|
|
|
|
|
|
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// COMPARE WRITE DATA |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::compare_write_data(); |
|
|
|
|
|
|
|
|
|
|
|
write_data_1_1 = master_xtn::type_id::create ("write_data_compare"); |
|
|
|
|
|
|
|
|
|
|
|
write_data_1_1.wid = write_data_1.wid; |
|
|
|
|
|
|
|
|
|
|
|
foreach (write_data_1.wdata[i]) |
|
|
|
|
|
write_data_1_1.wdata[i] = write_data_1.wdata[i]; |
|
|
|
|
|
|
|
|
|
|
|
foreach (write_data_1.wstrobe[i]) |
|
|
|
|
|
write_data_1_1.wstrobe[i] = write_data_1.wstrobe[i]; |
|
|
|
|
|
|
|
|
|
|
|
write_data.control = 2; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE DATA fROM MASTER MONITOR \n %s",write_data.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_data_1_1.control = 2; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE DATA fROM SLAVE MONITOR \n %s",write_data_1_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_data_1_1.control_1 = 2; |
|
|
|
|
|
|
|
|
|
|
|
if (write_data_1_1.compare (write_data)) |
|
|
|
|
|
begin |
|
|
|
|
|
write_data_cov.sample(); |
|
|
|
|
|
|
|
|
|
|
|
foreach (write_data.wstrobe[i]) |
|
|
|
|
|
write_data_cov_2.sample(i); |
|
|
|
|
|
|
|
|
|
|
|
success[write_data.wid][3:2] = 1; |
|
|
|
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
success[write_data.wid][3:2] = 2; |
|
|
|
|
|
|
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// COMPARE WRITE RESPONSE |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::compare_write_response(); |
|
|
|
|
|
|
|
|
|
|
|
write_response_1_1 = master_xtn::type_id::create ("write_response_compare"); |
|
|
|
|
|
|
|
|
|
|
|
write_response_1_1.bid = write_response.bid; |
|
|
|
|
|
|
|
|
|
|
|
write_response_1_1.bresp = write_response.bresp; |
|
|
|
|
|
|
|
|
|
|
|
write_response_1.control = 3; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE RESPONSE fROM MASTER MONITOR \n %s",write_response_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_response_1_1.control = 3; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("WRITE RESPONSE fROM SLAVE MONITOR \n %s",write_response_1_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
write_response_1.control_1 = 3; |
|
|
|
|
|
|
|
|
|
|
|
if (write_response_1.compare (write_response_1_1)) |
|
|
|
|
|
begin |
|
|
|
|
|
write_response_cov.sample(); |
|
|
|
|
|
success[write_response_1.bid][5:4] = 1; |
|
|
|
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
success[write_response_1.bid][5:4] = 2; |
|
|
|
|
|
|
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// COMPARE READ ADDRESS |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::compare_read_address(); |
|
|
|
|
|
|
|
|
|
|
|
read_address_1_1 = master_xtn::type_id::create ("read_address_compare"); |
|
|
|
|
|
|
|
|
|
|
|
read_address_1_1.arid = read_address_1.arid; |
|
|
|
|
|
read_address_1_1.araddr = read_address_1.araddr; |
|
|
|
|
|
read_address_1_1.arlen = read_address_1.arlen; |
|
|
|
|
|
read_address_1_1.arsize = read_address_1.arsize; |
|
|
|
|
|
read_address_1_1.arburst = read_address_1.arburst; |
|
|
|
|
|
|
|
|
|
|
|
read_address.control = 4; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("READ ADDRESS fROM MASTER MONITOR \n %s",read_address.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
read_address_1_1.control = 4; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("READ ADDRESS fROM SLAVE MONITOR \n %s",read_address_1_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
read_address_1_1.control_1 = 4; |
|
|
|
|
|
|
|
|
|
|
|
if (read_address_1_1.compare (read_address)) |
|
|
|
|
|
begin |
|
|
|
|
|
|
|
|
|
|
|
read_address_cov.sample(); |
|
|
|
|
|
success[read_address.arid][7:6] = 1; |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
|
success[read_address.arid][7:6] = 2; |
|
|
|
|
|
|
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////// COMPARE READ DATA AND RESPONSE |
|
|
|
|
|
|
|
|
|
|
|
task scoreboard::compare_read_data_response (); |
|
|
|
|
|
|
|
|
|
|
|
read_data_response_1_1 = master_xtn::type_id::create ("read_data_response_compare"); |
|
|
|
|
|
|
|
|
|
|
|
read_data_response_1_1.rid = read_data_response_1.rid; |
|
|
|
|
|
|
|
|
|
|
|
foreach (read_data_response_1.rdata[i]) |
|
|
|
|
|
read_data_response_1_1.rdata[i] = read_data_response_1.rdata[i]; |
|
|
|
|
|
|
|
|
|
|
|
foreach (read_data_response_1.read_resp[i]) |
|
|
|
|
|
read_data_response_1_1.read_resp[i] = read_data_response_1.read_resp[i]; |
|
|
|
|
|
|
|
|
|
|
|
read_data_response.control = 6; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("READ DATA AND RESPONSE fROM MASTER MONITOR \n %s",read_data_response.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
read_data_response_1_1.control = 6; |
|
|
|
|
|
`uvm_info("SCOREBOARD",$sformatf("READ DATA AND RESPONSE fROM SLAVE MONITOR \n %s",read_data_response_1_1.sprint),UVM_HIGH) |
|
|
|
|
|
|
|
|
|
|
|
read_data_response_1_1.control_1 = 5; |
|
|
|
|
|
|
|
|
|
|
|
if (read_data_response_1_1.compare (read_data_response)) |
|
|
|
|
|
begin |
|
|
|
|
|
read_data_response_cov.sample(); |
|
|
|
|
|
foreach (read_data_response.read_resp[i]) |
|
|
|
|
|
read_data_response_cov_2.sample(i); |
|
|
|
|
|
|
|
|
|
|
|
success[read_data_response.rid][9:8] = 1; |
|
|
|
|
|
end |
|
|
|
|
|
else |
|
|
|
|
|
success[read_data_response.rid][9:8] = 2; |
|
|
|
|
|
|
|
|
|
|
|
endtask |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////// REPORT PHASE |
|
|
|
|
|
|
|
|
|
|
|
function void scoreboard::report_phase (uvm_phase phase); |
|
|
|
|
|
|
|
|
|
|
|
channel_1 = $fopen("Report.txt","a"); |
|
|
|
|
|
|
|
|
|
|
|
$fdisplay (channel_1,"\n\n\t================================================================================================================================================"); |
|
|
|
|
|
|
|
|
|
|
|
$fdisplay (channel_1,"\t\t ID \t ADDRESS \t WRITE_DATA \t WRITE_RESPONSE \t READ_ADDRESS \t READ_DATA and RESPONSE \n"); |
|
|
|
|
|
foreach (success[i]) |
|
|
|
|
|
$fdisplay (channel_1,"\t\t %0d \t %0d \t\t %0d \t\t %0d \t\t\t %0d \t\t %0d \n",i,success[i][1:0],success[i][3:2],success[i][5:4],success[i][7:6],success[i][9:8]); |
|
|
|
|
|
|
|
|
|
|
|
$fdisplay (channel_1,"\n\n\t==============================================================================================================================================="); |
|
|
|
|
|
$fclose(channel_1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$display ("\n\n\t\t\t\t\t\t\t\t REPORT"); |
|
|
|
|
|
$display ("\n\n============================================================================================================================================"); |
|
|
|
|
|
$display ("\n\n\t\t\t\t\t\t 0 ==> TRANSACTION NOT RECIEVED (`~`) \n"); |
|
|
|
|
|
$display ("\t\t\t\t\t 1 ==> TRANSACTION COMPARED SUCCESSFULLY (`_`) \n"); |
|
|
|
|
|
$display ("\t\t\t\t\t 2 ==> TRANSACTION COMPARED BUT NOT MATCHING (-_-) \n"); |
|
|
|
|
|
|
|
|
|
|
|
$display ("\n============================================================================================================================================\n\n"); |
|
|
|
|
|
|
|
|
|
|
|
$display ("\t ID \t ADDRESS \t WRITE_DATA \t WRITE_RESPONSE \t READ_ADDRESS \t READ_DATA and RESPONSE \n"); |
|
|
|
|
|
foreach (success[i]) |
|
|
|
|
|
$display ("\t %0d \t %0d \t\t %0d \t\t %0d \t\t\t %0d \t\t %0d \n",i,success[i][1:0],success[i][3:2],success[i][5:4],success[i][7:6],success[i][9:8]); |
|
|
|
|
|
|
|
|
|
|
|
$display ("\n\n============================================================================================================================================"); |
|
|
|
|
|
|
|
|
|
|
|
endfunction |