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

212 строки
3.2 KiB

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