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.

axi_driver.sv.txt 2.9 KiB

4 kuukautta sitten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. class axi_driver extends uvm_driver;
  2. `uvm_component_utils(axi_driver)
  3. seq_item s;
  4. virtual interface vif;
  5. int lower_boundary;
  6. int upper_boundary;
  7. function new(string name="driver",uvm_component parent);
  8. super.new(name,parent);
  9. endfunction
  10. function void build_phase(uvm_component phase);
  11. super.build_phase(phase);
  12. if(!uvm_config_db(virtual intf)::get(this," ","vif",vif);
  13. `uvm_fatal("driver interface failed");
  14. endfunction
  15. task run_phase(uvm_phase phase);
  16. forever
  17. begin
  18. s = seq_item::type_id::create("s");
  19. seq_item_port.get_next_item(s);
  20. drive_logic(s);
  21. seq_item_port.item_done();
  22. end
  23. endtask
  24. task drive_logic();
  25. reset();
  26. fork
  27. write_address();
  28. write_data();
  29. write_response();
  30. read_address();
  31. read_data();
  32. join
  33. endtask
  34. task reset();
  35. @(posedge vif.clk)
  36. vif.awid <= 0;
  37. vif.awaddr <= 0;
  38. vif.awlen <= 0;
  39. vif.awsize <= 0;
  40. vif.awburst <= 0;
  41. vif.awvalid <= 0;
  42. vif.awready<=0
  43. vif.wid <= 0;
  44. vif.wdata <= 0;
  45. vif.wstrobe <= 0;
  46. vif.wlast <= 0;
  47. vif.wvalid <= 0;
  48. vif.wready<=0;
  49. vif.bid <= 0;
  50. vif.bresp <= 0;
  51. vif.bvalid <=0;
  52. vif.bready <=0;
  53. vif.arid <= 0;
  54. vif.araddress <= 0;
  55. vif.arlen <= 0;
  56. vif.arsize <= 0;
  57. vif.arburst <= 0;
  58. vif.arvalid <= 0;
  59. vif.arready<=0
  60. vif.rid <= 0;
  61. vif.rdata <= 0;
  62. vif.rlast <= 0;
  63. vif.rvalid <= 0;
  64. vif.rready<=0;
  65. endtask
  66. task write_address();
  67. @(posedge vif.clk)
  68. if(wr_rd==1)
  69. vif.awid <= s.awid;
  70. vif.awaddr <= s.awaddr;
  71. if(awburst==2'b01)
  72. awaddr<=awaddr+(2**awsize);
  73. if(awburst==2'b10)
  74. begin
  75. lower_boundary<=(awaddr%((awlen+1)(2**awsize)))*((awlen+1)(2**awsize));
  76. upper_boundary<=lower_boundary+((awlen+1)(2**awsize));
  77. end
  78. vif.awlen <= s.awlen;
  79. vif.awsize <= s.awsize;
  80. vif.awburst <= s.awburst;
  81. vif.awvalid <= 1;
  82. @(posedge vif.clk)
  83. wait(vif.awready)
  84. vif.awvalid <= 0;
  85. endtask
  86. task write_data();
  87. @(posedge vif.clk)
  88. vif.wid <= s.wid;
  89. vif.wdata <= s.wdata[i];
  90. vif.wstrobe <= s.wstrobe[i];
  91. vif.wlast <= s.wlast;
  92. vif.wvalid <= 1;
  93. for(int i=0;i<awlen+1;i=i+1)
  94. begin
  95. if(i==awlen+1)
  96. vif.wlast <= 1;
  97. @(posedge vif.clk)
  98. wait(vif.wready)
  99. vif.wvalid<=0;
  100. vif.wlast <= 0;
  101. end
  102. endtask
  103. task write_response();
  104. @(posedge vif.clk)
  105. vif.bid <= s.bid;
  106. vif.bresp <= s.bresp;
  107. vif.bvalid <= 1;
  108. @(posedge vif.clk)
  109. wait(vif.bready)
  110. vif.bvalid<=0;
  111. endtask
  112. task read_address();
  113. @(posedge vif.clk)
  114. if(wr_rd==0)
  115. vif.arid <= s.arid;
  116. vif.araddr <= s.araddr;
  117. if(arburst==2'b01)
  118. araddr<=araddr+(2**arsize);
  119. if(arburst==2'b10)
  120. begin
  121. lower_boundary<=(araddr%((arlen+1)(2**arsize)))*((arlen+1)(2**arsize));
  122. upper_boundary<=lower_boundary+((arlen+1)(2**arsize));
  123. end
  124. vif.arlen <= s.arlen;
  125. vif.arsize <= s.arsize;
  126. vif.arburst <= s.arburst;
  127. vif.arvalid <= 1;
  128. @(posedge vif.clk)
  129. wait(vif.arready)
  130. vif.arvalid <= 0;
  131. endtask
  132. task read_data();
  133. @(posedge vif.clk)
  134. vif.rid <= s.rid;
  135. vif.rdata <= s.rdata;
  136. vif.rlast <= s.rlast;
  137. vif.rresp <= s.rresp;
  138. vif.rvalid <= 1;
  139. for(int i=0;i<=arlen+1;i=i+1)
  140. begin
  141. if(i==arlen+1)
  142. vif.rlast <= 1;
  143. @(posedge vif.clk)
  144. wait(vif.rready)
  145. vif.rvalid<=0;
  146. vif.rlast <= 0;
  147. end
  148. endtask
  149. endclass