Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

125 строки
3.2 KiB

  1. class axi_drv extends uvm_driver#(axi_trans);
  2. `uvm_component_utils(axi_drv)
  3. virtual axi_if vif;
  4. axi_trans tnx;
  5. function new(string name="axi_drv",uvm_component parent);
  6. super.new(name,parent);
  7. endfunction
  8. function void build_phase(uvm_phase phase);
  9. super.build_phase(phase);
  10. if(!uvm_config_db#(virtual axi_if)::get(this,"","vif",vif))
  11. `uvm_error("build_phase","driver virtual interface failed");
  12. endfunction
  13. task run_phase(uvm_phase phase);
  14. `uvm_info("UVM_DRIVER",$sformatf("driver main phase ended"),UVM_LOW);
  15. forever
  16. begin
  17. seq_item_port.get_next_item(tnx);
  18. drive(tnx);
  19. seq_item_port.item_done();
  20. end
  21. endtask
  22. task driver();
  23. begin
  24. axi_write_address();
  25. axi_write_data();
  26. axi_write_resp();
  27. axi_read_address();
  28. axi_read_data();
  29. end
  30. endtask
  31. task axi_write_addr(axi_trans txn);
  32. $display("start of drive_awaddr");
  33. vif.drv_cb.AWVALID <= 1;
  34. vif.drv_cb.AWADDR <= txn.AWADDR;
  35. vif.drv_cb.AWSIZE <= txn.AWSIZE;
  36. vif.drv_cb.AWID <= txn.AWID;
  37. vif.drv_cb.AWLEN <= txn.AWLEN;
  38. vif.drv_cb.AWBURST <= txn.AWBURST;
  39. @(vif.drv_cb);
  40. wait(vif.drv_cb.AWREADY)
  41. vif.drv_cb.AWVALID <= 0;
  42. repeat
  43. @(vif.drv_cb);
  44. $display("end of drive_awaddr");
  45. endtask
  46. task axi_write_data(axi_trans txn);
  47. $display("start of drive_wdata");
  48. foreach(txn.WDATA[i])
  49. begin
  50. vif.drv_cb.WVALID <= 1;
  51. vif.drv_cb.WDATA <= txn.WDATA[i];
  52. vif.drv_cb.WSTRB <= txn.WSTRB[i];
  53. vif.drv_cb.WID <= txn.WID;
  54. if(i==(txn.AWLEN))
  55. vif.drv_cb.WLAST <= 1;
  56. else
  57. vif.drv_cb.WLAST <= 0;
  58. @(vif.drv_cb);
  59. wait(vif.drv_cb.WREADY)
  60. vif.drv_cb.WVALID <= 0;
  61. vif.drv_cb.WLAST <= 0;
  62. repeat
  63. @(vif.drv_cb);
  64. end
  65. $display("end of drive_wdata");
  66. endtask
  67. task axi_write_resp(axi_trans txn);
  68. $display("start of drive_bresp");
  69. foreach(tnx.)
  70. vif.drv_cb.BREADY<=1;
  71. @(vif.drv_cb)
  72. wait(vif.drv_cb.BVALID)
  73. vif.drv_cb.BREADY<=0;
  74. repeat
  75. @(vif.drv_cb);
  76. $display("end of drive_bresp");
  77. endtask
  78. /* task drive(axi_trans trans);
  79. begin
  80. `uvm_info("UVM_DRIVER",$sformatf("driver run driver task entered"),UVM_LOW);
  81. @(this.vif.drv_cb);
  82. `uvm_info("UVM_DRIVER",$sformatf("driver run drive task ended"),UVM_LOW);
  83. end
  84. endtask
  85. endclass*/