|
- 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
|