// APB Bus Interface interface apb_interface; logic clk; logic rstn; logic [31:0] Addr; logic [31:0] Write_Data; logic RNW; logic Valid; logic Ready; logic [31:0] Read_Data; logic Error; endinterface: apb_interface // APB Bus Sequence Item Class class apb_seq_item extends uvm_sequence_item; `uvm_object_utils(apb_seq_item) // Request fields rand logic [31:0] addr; rand logic [31:0] write_data; rand bit read_not_write; rand int delay; // Response fields bit error; logic [31:0] read_data; endclass: apb_seq_item // APB Bus Driver Class class apb_bus_driver extends uvm_driver #(apb_seq_item); `uvm_component_utils(apb_bus_driver) apb_seq_item req; virtual apb_interface apb_if; function new (string name, uvm_component parent); super.new(name, parent); endfunction: new task run_phase (uvm_phase phase); apb_if.Valid <= 0; apb_if.RNW <= 0; // Out of Reset @(posedge apb_if.rstn); // Pin Level Transfer forever begin seq_item_port.get_next_item(req); repeat(req.delay) begin @(posedge apb_if.clk); end apb_if.Valid <= 1; apb_if.Addr <= req.addr; apb_if.RNW <= req.read_not_write; if (req.read_not_write == 0) begin apb_if.Write_Data <= req.write_data; end while(apb_if.Ready != 1) begin @(posedge apb_if.clk); end // At the end of pin level bus transaction // Copy response data into the req related fields if (req.read_not_write == 1) begin req.read_data <= apb_if.Read_Data; end req.error <= apb_if.Error; apb_if.Valid <= 0; seq_item_port.item_done(); end endtask: run_phase endclass: apb_bus_driver // APB Bus Sequence class apb_bus_seq extends uvm_sequence #(apb_seq_item) `uvm_object_utils(apb_bus_seq) function new(string name); super.new(name); endfunction: new // No. of iterations rand int iti = 30 apb_seq_item req; task body(); req = apb_seq_item::type_id::create("req", this); repeat(iti) begin start_item(req); assert (!req.randomize() with {addr inside {[32`h1000_0000:32`h1000_001C]};}) begin `uvm_error("Body", "Randomization Error"); end finish_item(req); `uvm_info ("Response Fields", $sformatf("Read Data = %h", req.read_data), UVM_LOW) end endtask: body endclass: apb_bus_seq
Sunday, October 30, 2016
UVM APB Driver Example.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment