| @@ -0,0 +1,106 @@ | |||||
| class axi_coverage extends uvm_subscriber#(sequence_item); | |||||
| `uvm_component_utils(axi_coverage) | |||||
| sequence_item txn; | |||||
| // Coverpoints for low power interface signals | |||||
| covergroup t1; | |||||
| coverpoint CSYSACK; | |||||
| coverpoint CSYSREQ; | |||||
| coverpoint CACTIVE; | |||||
| // Cross coverage between low power interface signals | |||||
| cross low_power_cross = {CSYSACK, CSYSREQ, CACTIVE}; | |||||
| endgroup | |||||
| //t2 | |||||
| covergroup t2; | |||||
| coverpoint awid{ bins ids[] =[1:16]};} | |||||
| coverpoint awlen{ bins len _values[] ={[1:16]};} | |||||
| cp1: coverpoint awsize | |||||
| cp2: coverpoint awaddr { 2^0 to 2^31;} | |||||
| cp3:coverpoint awburst{ bins busttype[] = [0:3];} | |||||
| endgroup | |||||
| //t3 | |||||
| covergroup t3; | |||||
| coverpoint awlen { bins len_values[] = {[0:16], [17:32], [33:48], [49:64]}; } | |||||
| coverpoint wlast; | |||||
| // Coverpoints for read data coverpoint arlen { bins len_values[] = {[0:15]}; } | |||||
| coverpoint rlast; // Cross coverage between write and read data | |||||
| cross w_r_data_cross = {awlen, arlen, wlast, rlast}; | |||||
| endgroup | |||||
| //t4 | |||||
| covergroup t4; | |||||
| coverpoint awid{ bins ids[] =[1:16]};} | |||||
| coverpoint awlen{ bins len _values[] ={[1:16]};} | |||||
| cp1: coverpoint awsize | |||||
| cp2: coverpoint awaddr { 2^0 to 2^31;} | |||||
| cp3:coverpoint awburst{ bins busttype[] = [0:3];} | |||||
| // Coverpoints for address signals | |||||
| coverpoint awaddr { bins addr_range[] = {[0:255], [256:511], [512:767], [768:1023]}; | |||||
| bins addr_alignment[] = {[0], [4], [8], [12], [16], [20], [24], [28], [32]}; } | |||||
| coverpoint araddr { bins addr_range[] = {[0:255], [256:511], [512:767], [768:1023]}; | |||||
| bins addr_alignment[] = {[0], [4], [8], [12], [16], [20], [24], [28], [32]}; } | |||||
| // Cross coverage between awaddr and araddr | |||||
| cross aw_ar_address_cross = {awaddr, araddr}; | |||||
| endgroup | |||||
| //t5 | |||||
| covergroup t5; | |||||
| // Coverpoints for read address | |||||
| coverpoint araddr { bins addr_range[] = {[0:255], [256:511], [512:767], [768:1023]}; | |||||
| bins addr_alignment[] = {[0], [4], [8], [12], [16], [20], [24], [28], [32]}; } | |||||
| // Cross coverage between read address and burst length | |||||
| cross araddr_arlen_cross = {araddr, arlen}; | |||||
| endgroup | |||||
| //t6 | |||||
| covergroup t6; | |||||
| // Coverpoints for read data | |||||
| coverpoint rdata { bins data_values[] = {[0:255], [256:511], [512:767], [768:1023]}; } | |||||
| coverpoint rvalid; | |||||
| // Cross coverage between read data and response | |||||
| cross rdata_rresp_cross = {rdata, rresp}; | |||||
| cross rdata_rvalid_cross = {rdata, rvalid}; | |||||
| endgroup | |||||
| //t7 | |||||
| covergroup t7; | |||||
| // Coverpoints for low power interface signals | |||||
| coverpoint CSYSACK; | |||||
| coverpoint CSYSREQ; | |||||
| coverpoint CACTIVE; | |||||
| // Cross coverage between low power interface signals | |||||
| cross low_power_cross = {CSYSACK, CSYSREQ, CACTIVE}; | |||||
| endgroup | |||||
| //t8 | |||||
| covergroup t8; | |||||
| // Coverpoints for address signals | |||||
| coverpoint awaddr { bins addr_range[] = {[0:255], [256:511], [512:767], [768:1023]}; | |||||
| bins addr_alignment[] = {[0], [4], [8], [12], [16], [20], [24], [28], [32]}; } | |||||
| coverpoint araddr { bins addr_range[] = {[0:255], [256:511], [512:767], [768:1023]}; | |||||
| bins addr_alignment[] = {[0], [4], [8], [12], [16], [20], [24], [28], [32]}; } | |||||
| // Cross coverage between awaddr and araddr | |||||
| cross aw_ar_address_cross = {awaddr, araddr}; | |||||
| // Coverpoints for write response | |||||
| coverpoint bresp { bins resp_values[] = {[0:1], [2]}; } | |||||
| // Coverpoints for read response | |||||
| coverpoint rresp { bins resp_values[] = {[0:1], [2]}; } | |||||
| // Cross coverage between write and read responses | |||||
| cross b_r_resp_cross = {bresp, rresp}; | |||||
| endgroup | |||||
| function new(string name, uvm_component parent); | |||||
| t1=new(); | |||||
| t2=new(); | |||||
| t3=new(); | |||||
| t4=new(); | |||||
| t5=new(); | |||||
| t8=new(); | |||||
| endfunction | |||||
| endclass | |||||
| @@ -0,0 +1,25 @@ | |||||
| //env | |||||
| class env extends uvm_env; | |||||
| `uvm_component_utils(env) | |||||
| agent agnt; | |||||
| scoreboard sb; | |||||
| function new(string name="env", uvm_component parent); | |||||
| super.new(name, parent); | |||||
| endfunction | |||||
| function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| agnt = agent::type_id::create("agnt", this); | |||||
| sb = scoreboard::type_id::create("sb",this); | |||||
| endfunction | |||||
| function void connect_phase(uvm_phase phase); | |||||
| super.connect_phase(phase); | |||||
| //connecting montor and scoreboard usig analysis port | |||||
| agnt.mon.mon_port.connect(sb.sb_imp_port); | |||||
| endfunction | |||||
| endclass | |||||
| @@ -0,0 +1,144 @@ | |||||
| //driver | |||||
| class driver extends uvm_driver #(packet); | |||||
| `uvm_component_utils(driver) | |||||
| virtual axi_if vif; | |||||
| packet pkt; | |||||
| function new(string name="driver", uvm_component parent=null); | |||||
| super.new(name, parent); | |||||
| endfunction | |||||
| virtual function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| pkt=packet::type_id::create("pkt"); | |||||
| if(!uvm_config_db#(virtual axi_if)::get(this,"","vif",vif)) | |||||
| `uvm_error("drv","Unable to access Interface"); | |||||
| endfunction | |||||
| task reset_dut(); | |||||
| repeat (2) begin | |||||
| //write address channel | |||||
| vif.awvalid <= 0; | |||||
| vif.awready <= 0; | |||||
| vif.awid <= 0; | |||||
| vif.awlen <= 0; | |||||
| vif.awsize <= 0; | |||||
| vif.awaddr <= 0; | |||||
| vif.awburst <= 0; | |||||
| //write data channel (w) | |||||
| vif.wvalid <= 0; | |||||
| vif.wready <= 0; | |||||
| vif.wid <= 0; | |||||
| vif.wdata <= 0; | |||||
| vif.wstrb <= 0; | |||||
| vif.wlast <= 0; | |||||
| //write response channel (b) | |||||
| vif.bready <= 0; | |||||
| vif.bvalid <= 0; | |||||
| vif.bid <= 0; | |||||
| vif.bresp <= 0; | |||||
| ///////////////read address channel (ar) | |||||
| vif.arvalid <= 0; | |||||
| vif.arready <= 0; | |||||
| vif.arid <= 0; | |||||
| vif.arlen <= 0; | |||||
| vif.arsize <= 0; | |||||
| vif.araddr <= 0; | |||||
| vif.arburst <= 0; | |||||
| /////////// read data channel (r) | |||||
| vif.rvalid <= 0; | |||||
| vif.rready <= 0; | |||||
| vif.rid <= 0; | |||||
| vif.rdata <= 0; | |||||
| vif.rstrb <= 0; | |||||
| vif.rlast <= 0; | |||||
| vif.rresp <= 0; | |||||
| //1 clk delay | |||||
| @(posedge vif.clk); | |||||
| `uvm_info(get_type_name(),"*** Reset Applied by driver ***",UVM_MEDIUM) | |||||
| end | |||||
| endtask | |||||
| task write(); | |||||
| if(pkt.op==WRITE) | |||||
| begin | |||||
| //write address channel | |||||
| vif.awvalid <= pkt.awvalid ; | |||||
| vif.awready <= pkt.awready ; | |||||
| vif.awid <= pkt.awid ; | |||||
| vif.awlen <= pkt.awlen ; | |||||
| vif.awsize <= pkt.awsize ; | |||||
| vif.awaddr <= pkt.awaddr ; | |||||
| vif.awburst <= pkt.awburst ; | |||||
| //write data channel (w) | |||||
| vif.wvalid <= pkt.wvalid ; | |||||
| vif.wready <= pkt.wready ; | |||||
| vif.wid <= pkt.wid ; | |||||
| vif.wdata <= pkt.wdata ; | |||||
| vif.wstrb <= pkt.wstrb ; | |||||
| vif.wlast <= pkt.wlast ; | |||||
| //write response channel (b) | |||||
| vif.bready <= pkt.bready ; | |||||
| vif.bvalid <= pkt.bvalid ; | |||||
| vif.bid <= pkt.bid ; | |||||
| //1 clk delay | |||||
| @(posedge vif.clk); | |||||
| `uvm_info(get_type_name(),"*** write signals are drived to DUT ***",UVM_MEDIUM) | |||||
| vif.bresp <= pkt.bresp ; end | |||||
| endtask | |||||
| task read(); | |||||
| if(pkt.op == READ)begin | |||||
| ///////////////read address channar) | |||||
| vif.arvalid <= pkt.arvalid ; | |||||
| vif.arready <= pkt.arready ; | |||||
| vif.arid <= pkt.arid ; | |||||
| vif.arlen <= pkt.arlen ; | |||||
| vif.arsize <= pkt.arsize ; | |||||
| vif.araddr <= pkt.araddr ; | |||||
| vif.arburst <= pkt.arburst ; | |||||
| /////////// read data channel (r) | |||||
| vif.rvalid <= pkt.rvalid ; | |||||
| vif.rready <= pkt.rready ; | |||||
| vif.rid <= pkt.rid ; | |||||
| vif.rdata <= pkt.rdata ; | |||||
| vif.rstrb <= pkt.rstrb ; | |||||
| vif.rlast <= pkt.rlast ; | |||||
| vif.rresp <= pkt.rresp ; | |||||
| //1 clk delay | |||||
| @(posedge vif.clk); | |||||
| `uvm_info(get_type_name(),"*** read signals are drived to DUT ***",UVM_MEDIUM) | |||||
| end | |||||
| endtask | |||||
| virtual task run_phase(uvm_phase phase); | |||||
| reset_dut(); | |||||
| forever begin | |||||
| seq_item_port.get_next_item(pkt); | |||||
| `uvm_info(get_type_name(),"*** Driver Received the transaction by sequencer ***",UVM_MEDIUM) | |||||
| if(pkt.op==RESET) begin | |||||
| reset_dut(); | |||||
| end | |||||
| //Write operation support | |||||
| else if(pkt.op == WRITE) begin | |||||
| write(); | |||||
| `uvm_info(get_type_name(),"*** WRITE packet is received in driver ***",UVM_MEDIUM) | |||||
| end | |||||
| else if(pkt.op == READ) begin | |||||
| read(); | |||||
| `uvm_info(get_type_name(),"*** READ packet is received in driver ***",UVM_MEDIUM) | |||||
| end | |||||
| //put read drive logic here | |||||
| seq_item_port.item_done(); | |||||
| end | |||||
| endtask | |||||
| endclass | |||||
| @@ -0,0 +1,96 @@ | |||||
| //Base test | |||||
| class base_test extends uvm_test; | |||||
| `uvm_component_utils(base_test) | |||||
| env e; | |||||
| reset_sequence reset_seq; | |||||
| // read_sequence read_seq; | |||||
| // write_sequence write_seq; | |||||
| // write_read_sequence write_read_seq; | |||||
| // multi_write_multi_read_sequence multi_write_multi_read_seq; | |||||
| // slaveerr_sequence slaveerr_seq; | |||||
| function new(string name="test", uvm_component parent); | |||||
| super.new(name, parent); | |||||
| endfunction | |||||
| virtual function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| e = env::type_id::create("e", this); | |||||
| reset_seq=reset_sequence::type_id::create("reset_seq"); | |||||
| // read_seq=read_sequence::type_id::create("read_seq"); | |||||
| // write_seq=write_sequence::type_id::create("write_seq"); | |||||
| // write_read_seq=write_read_sequence::type_id::create("write_read_seq"); | |||||
| //multi_write_multi_read_seq=multi_write_multi_read_sequence::type_id::create("multi_write_multi_read_seq"); | |||||
| // slaveerr_seq=slaveerr_sequence::type_id::create("slaveerr_seq"); | |||||
| endfunction | |||||
| virtual function void start_of_simulation_phase(uvm_phase phase); | |||||
| super.start_of_simulation_phase(phase); | |||||
| uvm_top.print_topology(); | |||||
| endfunction | |||||
| virtual function void report_phase(uvm_phase phase); | |||||
| uvm_report_server svr; | |||||
| super.report_phase(phase); | |||||
| svr = uvm_report_server::get_server(); | |||||
| if(svr.get_severity_count(UVM_FATAL)+svr.get_severity_count(UVM_ERROR)>0) begin | |||||
| `uvm_info(get_type_name(), "---------------------------------------", UVM_NONE) | |||||
| `uvm_info(get_type_name(), "---- TEST FAIL ----", UVM_NONE) | |||||
| `uvm_info(get_type_name(), "---------------------------------------", UVM_NONE) | |||||
| end | |||||
| else begin | |||||
| `uvm_info(get_type_name(), "---------------------------------------", UVM_NONE) | |||||
| `uvm_info(get_type_name(), "---- TEST PASS ----", UVM_NONE) | |||||
| `uvm_info(get_type_name(), "---------------------------------------", UVM_NONE) | |||||
| end | |||||
| endfunction | |||||
| endclass | |||||
| //multi write read test | |||||
| class multi_write_multi_read_test extends base_test; | |||||
| `uvm_component_utils(multi_write_multi_read_test) | |||||
| function new(string name="multi_write_multi_read_test", uvm_component parent); | |||||
| super.new(name, parent); | |||||
| endfunction | |||||
| virtual function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| endfunction | |||||
| virtual task run_phase(uvm_phase phase); | |||||
| phase.raise_objection(this); | |||||
| `uvm_info(get_type_name(), "*** Starting test ***", UVM_MEDIUM) | |||||
| reset_seq.start(e.agnt.sqr); | |||||
| `uvm_info(get_type_name(), "*** Ended test ***", UVM_MEDIUM) | |||||
| phase.drop_objection(this); | |||||
| endtask | |||||
| endclass | |||||
| /* | |||||
| //slave error test | |||||
| class slaveerr_test extends base_test; | |||||
| `uvm_component_utils(slaveerr_test) | |||||
| function new(string name="slaveerr_test", uvm_component parent); | |||||
| super.new(name, parent); | |||||
| endfunction | |||||
| virtual function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| endfunction | |||||
| virtual task run_phase(uvm_phase phase); | |||||
| phase.raise_objection(this); | |||||
| `uvm_info(get_type_name(), "*** Starting test ***", UVM_MEDIUM) | |||||
| slaveerr_seq.start(e.agnt.sqr); | |||||
| `uvm_info(get_type_name(), "*** Ended test ***", UVM_MEDIUM) | |||||
| phase.drop_objection(this); | |||||
| endtask | |||||
| endclass | |||||
| */ | |||||
| @@ -0,0 +1,81 @@ | |||||
| `include "uvm_macros.svh" | |||||
| import uvm_pkg::*; | |||||
| import my_pkg::*; | |||||
| `include "design.sv" | |||||
| `include "pkg.sv" | |||||
| `include "axi_sequence_item.sv" | |||||
| `include "axi_sequence.sv" | |||||
| `include "axi_sequencer.sv" | |||||
| `include "axi_env.sv" | |||||
| `include "axi_interface.sv" | |||||
| `include "axi_driver.sv" | |||||
| `include "axi_test.sv" | |||||
| `include "axi_agent.sv" | |||||
| module top; | |||||
| //interface instance | |||||
| axi_if vif (); | |||||
| //connecting dut signals with interface and gloable signals | |||||
| axi_slave dut(.clk(vif.clk), | |||||
| .resetn(vif.resetn), | |||||
| ///////////////////write address channel | |||||
| .awvalid(vif.awvalid), | |||||
| .awready(vif.awready), | |||||
| .awid(vif.awid), | |||||
| .awlen(vif.awlen), | |||||
| .awsize(vif.awsize), | |||||
| .awaddr(vif.awaddr), | |||||
| .awburst(vif.awburst), | |||||
| /////////////////////write data channel | |||||
| .wvalid(vif.wvalid), | |||||
| .wready(vif.wready), | |||||
| .wid(vif.wid), | |||||
| .wdata(vif.wdata), | |||||
| .wstrb(vif.wstrb), | |||||
| .wlast(vif.wlast), | |||||
| ///////////////write response channel | |||||
| .bready(vif.bready), | |||||
| .bvalid(vif.bvalid), | |||||
| .bid(vif.bid), | |||||
| .bresp(vif.bresp), | |||||
| ////////////// read address channel | |||||
| .arready(vif.arready), | |||||
| .arid(vif.arid), | |||||
| .araddr(vif.araddr), | |||||
| .arlen(vif.arlen), | |||||
| .arsize(vif.arsize), | |||||
| .arburst(vif.arburst), | |||||
| .arvalid(vif.arvalid), | |||||
| ///////////////////read data channel | |||||
| .rid(vif.rid), | |||||
| .rdata(vif.rdata), | |||||
| .rresp(vif.rresp), | |||||
| .rlast(vif.rlast), | |||||
| .rvalid(vif.rvalid), | |||||
| .rready(vif.rready)); | |||||
| initial begin | |||||
| vif.clk <= 0; | |||||
| vif.resetn <=0; | |||||
| end | |||||
| initial begin | |||||
| #10 | |||||
| vif.resetn <=1; | |||||
| end | |||||
| //clock generator | |||||
| always #5 vif.clk <= ~vif.clk; | |||||
| initial begin | |||||
| //pass interface to lower hierarchy | |||||
| uvm_config_db#(virtual axi_if)::set(null, "*", "vif", vif); | |||||
| run_test("give test name please");// need to write UVM_test name | |||||
| end | |||||
| initial begin | |||||
| $dumpfile("dump.vcd"); | |||||
| $dumpvars; | |||||
| end | |||||
| endmodule | |||||
| @@ -0,0 +1,19 @@ | |||||
| package my_pkg; | |||||
| //axi_if vif(); | |||||
| typedef enum bit [1:0] {awidle = 2'b00, awstart = 2'b01, awreadys = 2'b10} awstate_type; | |||||
| awstate_type awstate, awnext_state; | |||||
| typedef enum bit [2:0] {widle = 0, wstart = 1, wreadys = 2, wvalids = 3, waddr_dec = 4} wstate_type; | |||||
| wstate_type wstate, wnext_state; | |||||
| typedef enum bit [2:0] {ridle = 0, rstart = 1, rwait = 2, rvalids = 3, rerror = 4} rstate_type; | |||||
| rstate_type rstate, rnext_state; | |||||
| typedef enum bit [1:0] {aridle = 0, arstart = 1, arreadys = 2} arstate_type; | |||||
| arstate_type arstate, arnext_state; | |||||
| typedef enum bit [1:0] {bidle = 0, bdetect_last = 1, bstart = 2, bwait = 3} bstate_type; | |||||
| bstate_type bstate,bnext_state; | |||||
| endpackage | |||||