You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.6 KiB

  1. `uvm_analysis_imp_decl(_master)
  2. `uvm_analysis_imp_decl(_slave)
  3. class axi_scoreboard extends uvm_scoreboard;
  4. `uvm_component_utils(axi_scoreboard)
  5. // Components
  6. uvm_analysis_imp_master#(axi_transaction#(D_WIDTH, A_WIDTH), axi_scoreboard) m_ap_imp;
  7. uvm_analysis_imp_slave#(axi_transaction#(D_WIDTH, A_WIDTH), axi_scoreboard) s_ap_imp;
  8. // Variables
  9. axi_transaction#(D_WIDTH, A_WIDTH) m_wtrans, m_rtrans, s_wtrans, s_rtrans;
  10. bit [1:0] w_rcvd, r_rcvd;
  11. int passCnt, failCnt;
  12. function new(string name, uvm_component parent);
  13. super.new(name, parent);
  14. endfunction //new()
  15. function void write_master(axi_transaction#(D_WIDTH, A_WIDTH) trans);
  16. if(trans.id[8]) begin
  17. m_rtrans = trans;
  18. r_rcvd[0] = 1;
  19. end
  20. else begin
  21. m_wtrans = trans;
  22. w_rcvd[0] = 1;
  23. end
  24. check();
  25. endfunction
  26. function void write_slave(axi_transaction#(D_WIDTH, A_WIDTH) trans);
  27. if(trans.id[8]) begin
  28. s_rtrans = trans;
  29. r_rcvd[1] = 1;
  30. end
  31. else begin
  32. s_wtrans = trans;
  33. w_rcvd[1] = 1;
  34. end
  35. check();
  36. endfunction
  37. function void check();
  38. if(w_rcvd == 2'b11) begin
  39. if(m_wtrans.compare(s_wtrans)) begin
  40. `uvm_info("SCB", $sformatf("ID %0d: PASSED", m_wtrans.id), UVM_NONE)
  41. passCnt++;
  42. end
  43. else begin
  44. `uvm_error("SCB", $sformatf("ID %0d: FAILED", m_wtrans.id))
  45. failCnt++;
  46. end
  47. w_rcvd = 2'b00;
  48. end
  49. if(r_rcvd == 2'b11) begin
  50. if(m_rtrans.compare(s_rtrans)) begin
  51. `uvm_info("SCB", $sformatf("ID %0d: PASSED", m_rtrans.id), UVM_NONE)
  52. passCnt++;
  53. end
  54. else begin
  55. `uvm_error("SCB", $sformatf("ID %0d: FAILED", m_rtrans.id))
  56. failCnt++;
  57. end
  58. r_rcvd = 2'b00;
  59. end
  60. endfunction
  61. // Function: build_phase
  62. extern function void build_phase(uvm_phase phase);
  63. endclass //axi_scoreboard extends uvm_scoreboard
  64. function void axi_scoreboard::build_phase(uvm_phase phase);
  65. /* note: Do not call super.build_phase() from any class that is extended from an UVM base class! */
  66. /* For more information see UVM Cookbook v1800.2 p.503 */
  67. //super.build_phase(phase);
  68. m_ap_imp = new("m_ap_imp", this);
  69. s_ap_imp = new("s_ap_imp", this);
  70. endfunction: build_phase