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.

64 lines
1.4 KiB

  1. class axi_drv extends uvm_driver#(seq_item);
  2. `uvm_component_utils(axi_drv)
  3. virtual intf vif;
  4. seq_item txn;
  5. bit[7:0] temp [][];
  6. function new(string name="axi_drv",uvm_component parent);
  7. super.new(name,parent);
  8. endfunction
  9. function void build_phase(uvm_phase phase);
  10. super.build_phase(phase);
  11. txn=seq_item::type_id::create("txn",this);
  12. if(!uvm_config_db#(virtual intf)::get(this,"","vif",vif)
  13. `uvm_error("build_phase",$sformatf("failed to get confg_db"))
  14. endfunction
  15. task run_phase();
  16. forever begin
  17. seq_item_port.get(txn);
  18. drive(txn);
  19. seq_item_port.item_done();
  20. end
  21. endtask
  22. task drive(seq_item txn);
  23. @(posedge vif.clk)
  24. vif.rst<=1;
  25. repeat(2)@(posedge vif.clk)
  26. vif.rst<=0;
  27. @(posedge vif.clk)
  28. if(txn.write)
  29. begin
  30. vif.awddr<=txn.awaddr;
  31. vif.awlen <= txn.awlen;
  32. vif.awsize<=txn.awsize;
  33. vif.awburst<=txn.awburst;
  34. vif.awlock<=txn.awlock;
  35. vif.awid<=txn.awid;
  36. vif.awvalid<=1;
  37. wait(vif.awready)
  38. @(posedge vif.clk)
  39. vif.awvalid<=0;
  40. @(posedge vif.clk)
  41. for(int i=0;i<trans.awlength+1;i++)
  42. begin
  43. for(int j=0;j<2**trans.awsize;j++)
  44. begin
  45. temp[i][j*8+:8]<= trans.wdata[i][j];
  46. if(i=trans.awlength-1)
  47. trans.wlast<=1;
  48. else
  49. trans.wlast<=0;
  50. end
  51. end
  52. vif.wdata<=temp;
  53. endtask
  54. endclass