Initial commit
* Bare skeleton implementation of everything * Testbench builds with Verilator * Test runs
This commit is contained in:
88
tb/axi_agent.sv
Normal file
88
tb/axi_agent.sv
Normal file
@@ -0,0 +1,88 @@
|
||||
// ----------------------------------------------------------------------
|
||||
// Agent to operate AXI transactions
|
||||
// This agent includes a driver, monitor, and sequencer for AXI transactions
|
||||
// ----------------------------------------------------------------------
|
||||
typedef axi_sequencer;
|
||||
|
||||
class axi_agent extends uvm_agent;
|
||||
agent_type_t agent_type;
|
||||
virtual `AXI_INTF.MANAGER m_if;
|
||||
virtual `AXI_INTF.SUBORDINATE s_if;
|
||||
|
||||
// Declare the sequencer and driver
|
||||
axi_sequencer sequencer;
|
||||
axi_driver driver;
|
||||
axi_monitor monitor;
|
||||
|
||||
`uvm_component_utils_begin(axi_agent)
|
||||
`uvm_field_enum(agent_type_t, agent_type, UVM_DEFAULT)
|
||||
`uvm_component_utils_end
|
||||
|
||||
// --------------------------------------------------
|
||||
// Constructor
|
||||
function new(string name = "axi_agent", uvm_component parent = null);
|
||||
super.new(name, parent);
|
||||
endfunction
|
||||
|
||||
// --------------------------------------------------
|
||||
// Set agent type
|
||||
function void set_agent_type(agent_type_t atype);
|
||||
agent_type = atype;
|
||||
`uvm_info("set_agent_type", $sformatf("Agent type set to %s", agent_type.name()), UVM_LOW)
|
||||
endfunction
|
||||
|
||||
// --------------------------------------------------
|
||||
// Build phase
|
||||
virtual function void build_phase(uvm_phase phase);
|
||||
sequencer = axi_sequencer::type_id::create("sequencer", this);
|
||||
driver = axi_driver::type_id::create("driver", this);
|
||||
monitor = axi_monitor::type_id::create("monitor", this);
|
||||
|
||||
// Propagete the agent type to driver and monitor
|
||||
driver.set_agent_type(agent_type);
|
||||
monitor.set_agent_type(agent_type);
|
||||
|
||||
if (agent_type == MANAGER) begin
|
||||
if (!uvm_config_db#(virtual `AXI_INTF.MANAGER)::get(this, "", "axi_dvr_vif", m_if)) begin
|
||||
`uvm_fatal("axi_agent", "AXI agent MANAGER interface not configured")
|
||||
end
|
||||
`uvm_info("axi_agent", $sformatf("Using AXI agent MANAGER interface: axi_dvr_vif"), UVM_LOW)
|
||||
end else begin // if (agent_type == SUBORDINATE) begin
|
||||
if (!uvm_config_db#(virtual `AXI_INTF.SUBORDINATE)::get(this, "", "axi_dvr_vif", s_if)) begin
|
||||
`uvm_fatal("axi_agent", "AXI agent SUBORDINATE interface not configured")
|
||||
end
|
||||
`uvm_info("axi_agent", $sformatf("Using AXI agent SUBORDINATE interface: axi_dvr_vif"), UVM_LOW)
|
||||
end
|
||||
|
||||
driver.set_virtual_intefaces(m_if, s_if);
|
||||
monitor.set_virtual_intefaces(m_if, s_if);
|
||||
endfunction
|
||||
|
||||
// --------------------------------------------------
|
||||
// Connect phase
|
||||
virtual function void connect_phase(uvm_phase phase);
|
||||
// Connect the driver to the sequencer
|
||||
driver.seq_item_port.connect(sequencer.seq_item_export);
|
||||
driver.rsp_port.connect(sequencer.rsp_export);
|
||||
// Connect the monitor to the sequencer
|
||||
// driver.rsp_port.connect(monitor.rsp_export);
|
||||
endfunction
|
||||
|
||||
// --------------------------------------------------
|
||||
// Run phase
|
||||
virtual function void run_phase(uvm_phase phase);
|
||||
`uvm_info("axi_agent", $sformatf("Running AXI agent: %s as %s",
|
||||
get_full_name(), agent_type.name()), UVM_LOW)
|
||||
endfunction
|
||||
endclass : axi_agent
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
class axi_sequencer extends uvm_sequencer;
|
||||
|
||||
`uvm_component_utils(axi_sequencer)
|
||||
|
||||
// Constructor
|
||||
function new(string name, uvm_component parent);
|
||||
super.new(name, parent);
|
||||
endfunction
|
||||
endclass : axi_sequencer
|
Reference in New Issue
Block a user