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.

5 kuukautta sitten
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. class driver extends uvm_driver #(wrap_txn);
  2. `uvm_component_utils(driver)
  3. virtual axi_if vif;
  4. wrap_txn txn;
  5. function new(string name ="driver",uvm_component parent);
  6. suoer.new(name,parent);
  7. endfunction
  8. function void build_phase(uvm_phase phase);
  9. super.build_phase(phase);
  10. txn = wrap_txn::type_id::create("txn",this);
  11. if(!uvm_config_db #(axi_if)::get(this,"","vif",vif))
  12. `uvm_error("build phase","driver virtual interface failed")
  13. endfunction
  14. task run_phase(uvm_phase phase);
  15. forever
  16. begin
  17. seq_item_port.get_next_item(txn);
  18. drive_logic(txn);
  19. seq_item_port.item_done();
  20. end
  21. endtask
  22. task drve_logic(wrap_txn txn);
  23. begin
  24. `uvm_info("AXI_DRIVER",$sformatf("driver started"),UVM_LOW);
  25. @(vif.drv_cb);
  26. vif.arst<=1;
  27. @(vif.drv_cb);
  28. vif.arst<=0;
  29. if(wr_rd <= 1)
  30. begin
  31. vif.awid <= txn.awid;
  32. vif.awaddr<= txn.awaddr;
  33. vif.awburst <= txn.awburst;
  34. vif.awsize <= txn.awsize;
  35. vif.awlen <= txn.awlen;
  36. vif.awlock <= txn.awlen;
  37. vif.awprot <= txn.awprot;
  38. vif.awcache<= txn.awcache;
  39. vif.awvalid <= 1;
  40. wait(vif.drv_cb.awready == 1);
  41. vif.awvalid <= 0;
  42. @(vif.drv_cb);
  43. for(int i =1;i<=vif.awlen+1;i++)
  44. begin
  45. vif.wid <= txn.wid;
  46. vif.wdata<= txn.wdata.pop_front();
  47. vif.wstrb <= txn.wstrb;
  48. vif.awvalid <= 1;
  49. if(i == vif.awlen+1)
  50. vif.wlast <= txn.wlast;
  51. else
  52. vif.wlast <= 0;
  53. wait(vif.wready == 1);
  54. vif.wvalid <= 0;
  55. end
  56. @(vif.drv_cb);
  57. vif.bid <= txn.bid;
  58. vif.bresp <= txn.bresp;
  59. vif.bvalid <= 1;
  60. wait(vif.bready == 1);
  61. vif.bvalid <= 0;
  62. end
  63. else
  64. begin
  65. vif.arid <= txn.arid;
  66. vif.araddr<= txn.araddr;
  67. vif.arburst <= txn.arburst;
  68. vif.arsize <= txn.arsize;
  69. vif.arlen <= txn.arlen;
  70. vif.arlock <= txn.arlen;
  71. vif.arprot <= txn.arprot;
  72. vif.arcache<= txn.arcache;
  73. vif.arvalid <= 1;
  74. wait(vif.drv_cb.arready == 1);
  75. vif.arvalid <= 0;
  76. @(vif.drv_cb);
  77. end
  78. end
  79. endtask