Axi Verification Ip V1.1: Logicore Ip Product Guide
Axi Verification Ip V1.1: Logicore Ip Product Guide
Axi Verification Ip V1.1: Logicore Ip Product Guide
Chapter 1: Overview
Feature Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Licensing and Ordering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Appendix E: Debugging
Finding Help on Xilinx.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
The AXI VIP core supports three versions of the Supported User
AXI4, AXI4-Lite, AXI3
Interfaces
AXI protocol (AXI3, AXI4, and AXI4-Lite).
Resources N/A
timing and drives the content on the interface. Tested Design Flows(2)(3)
Design Entry Vivado® Design Suite
For supported simulators, see the
Features Simulation(4)
Xilinx Design Tools: Release Notes Guide.
Synthesis Vivado Synthesis
• Supports all protocol data widths, address Support
widths, transfer types, and responses Release Notes
and Known Master Answer Record: 68234
• Transaction-level protocol checking (burst Issues
type, length, size, lock type, and cache All Vivado IP
Master Vivado IP Change Logs: 72775
type) Change Logs
Xilinx Support web page
• Arm®-based protocol transaction level
checker for tools that support assertion Notes:
property [Ref 1] 1. For a complete list of supported devices, see the Vivado IP
catalog.
2. For the supported versions of third-party tools, see the
• Behavioral SystemVerilog Syntax Xilinx Design Tools: Release Notes Guide.
• SystemVerilog class-based API 3. This IP does not deliver VIP for Zynq PS. It only delivers the
VIP core for AXI3, AXI4, and AXI4-Lite interfaces.
• Synthesizes to nets and constant tie-offs 4. To take advantage of the full features of this IP, it requires
simulators supporting advanced simulation capabilities.
5. The AXI VIP can only act as a protocol checker when
contained within a VHDL hierarchy.
6. To use the virtual part of the AXI Verification IP, it must be in
a Verilog hierarchy.
7. Do not import two different revisions/versions of the
axi_vip packages. This causes elaboration failures.
8. All AXI VIP and parents to the AXI VIP must be upgraded to
the latest version.
Overview
The Xilinx® LogiCORE™ AXI Verification IP (VIP) core is used in the following manner:
Figure 1-1 shows the AXI master VIP which generates AXI commands and write payload and
sends it to the AXI system.
X-Ref Target - Figure 1-1
M_AXI
SystemVerilog Interface AXI Protocol Checker
X18492-121316
Figure 1-2 shows the AXI slave VIP which responds to the AXI commands and generates
read payload and write responses.
X-Ref Target - Figure 1-2
S_AXI
SystemVerilog Interface AXI Protocol Checker
X18493-121316
Figure 1-3 shows the AXI pass-through VIP which protocol checks all AXI transactions that
pass through it. The IP can be configured to behave in the following modes:
• Monitor only
• Master
• Slave
The AXI protocol checker does not exist in the synthesized netlist.
X-Ref Target - Figure 1-3
S_AXI M_AXI
SystemVerilog Interface AXI Protocol Checker
X18494-121316
IMPORTANT: When using the Vivado ® simulator, the AXI Protocol Checker IP [Ref 4] is used in place of
the Arm AMBA Assertions.
Feature Summary
• Supports AXI3, AXI4, or AXI4-Lite interface
• Configurable as an AXI master, AXI slave, and in pass-through mode
• Configurable simulation messaging
• Provides simulation AXI protocol checking
Applications
The AXI VIP is for verification and system engineers who want to:
Information about other Xilinx LogiCORE IP modules is available at the Xilinx Intellectual
Property page. For information about pricing and availability of other Xilinx LogiCORE IP
modules and tools, contact your local Xilinx sales representative.
Product Specification
The AXI VIP core supports the AXI3, AXI4, and AXI4-Lite protocols.
Standards
The AXI interfaces conform to the Arm ® Advanced Microcontroller Bus Architecture
(AMBA ®) AXI version 4 specification [Ref 2], including the AXI4-Lite control register
interface subset.
Performance
The AXI VIP core synthesizes to wires and does not impact performance.
User Parameters
Table 2-1 shows the AXI VIP core user parameters.
Type: long
Value range: 0..1024
AWUSER_WIDTH 0 Width of the *_axi_awuser
AXI4LITE: 0
READ_ONLY: 0
Type: long
Value range: 0..1024
ARUSER_WIDTH 0 Width of the *_axi_aruser
AXI4LITE: 0
WRITE_ONLY: 0
Type: long
Value range: 0..1024
WUSER_WIDTH 0 Width of the *_axi_wuser
AXI4LITE: 0
READ_ONLY: 0
Type: long
Value range: 0..1024
BUSER_WIDTH 0 Width of the *_axi_buser
AXI4LITE: 0
READ_ONLY: 0
Type: long
Value range: 0..1024
RUSER_WIDTH 0 Width of the *_axi_ruser
AXI4LITE: 0
WRITE_ONLY: 0
Specifies whether the VIP supports burst
Type: long transactions with a size smaller than the native
NARROW (1) Value range: 0,1 1 data width of the interface. When the Protocol
AXI4LITE: 0 is AXI4LITE or HAS_WSTRB is 0,
SUPPORTS_NARROW must be 0.
Notes:
1. SUPPORTS_NARROW is treated as SUPPORTS_NARROW_BURST in Vivado IP integrator.
Port Descriptions
Table 2-2 shows the AXI VIP independent port descriptions.
Table 2-3 lists the interface signals for the AXI VIP core in master or pass-through mode.
The m_axi_aw*, m_axi_w*, and m_axi_b* signals are not shown on the port list when
the READ_WRITE MODE parameter is READ_ONLY. The m_axi_ar* and m_axi_r* signals
are not shown on the port list when the READ_WRITE MODE parameter is WRITE_ONLY. See
the AXI specification for port definitions.
Table 2-4 lists the interface signals for the AXI VIP core when it has been configured to be
in slave or pass-through mode.
AW/W/B
X18495-121316
AW/W/B
X18496-121316
AW/W/B AW/W/B
AXI Pass-Through
AXI Master System AXI Slave System
AR/R VIP AR/R
X18497-121316
Clocking
This section is not applicable for this IP core.
Resets
The AXI VIP requires one active-Low reset, aresetn. The reset is synchronous to aclk. The
reset is optional based on HAS_ARESETN.
• Vivado Design Suite User Guide: Designing IP Subsystems using IP Integrator (UG994)
[Ref 5]
• Vivado Design Suite User Guide: Designing with IP (UG896) [Ref 6]
• Vivado Design Suite User Guide: Getting Started (UG910) [Ref 7]
• Vivado Design Suite User Guide: Logic Simulation (UG900) [Ref 8]
If you are customizing and generating the core in the Vivado IP integrator, see the Vivado
Design Suite User Guide: Designing IP Subsystems using IP Integrator (UG994) [Ref 5] for
detailed information. IP integrator might auto-compute certain configuration values when
validating or generating the design. To check whether the values do change, see the
description of the parameter in this chapter. To view the parameter value, run the
validate_bd_design command in the Tcl console.
You can customize the IP for use in your design by specifying values for the various
parameters associated with the IP core using the following steps:
For details, see the Vivado Design Suite User Guide: Designing with IP (UG896) [Ref 6] and
the Vivado Design Suite User Guide: Getting Started (UG910) [Ref 7].
Note: Figures in this chapter are an illustration of the Vivado Integrated Design Environment (IDE).
The layout depicted here might vary from the current version.
Figure 4-1 shows the AXI VIP Vivado IDE Basic Settings tab configuration screen.
X-Ref Target - Figure 4-1
• Component Name – The component name is used as the base name of output files
generated for the module. Names must begin with a letter and must be composed
from characters: a to z, 0 to 9 and "_".
• Interface Mode – Controls the mode of protocol to be configured as master, slave, or
pass-through.
• Protocol – Selects the specific AXI protocol.
• Read or Write Mode – Enables the AXI read or write mode.
• Address Width – Selects the address width. Default at 32.
• Data Width – Selects the data width. Default at 32.
• ID Width – Selects the ID width. Default at 0.
• User Signal Widths – Selects the width for each user signal. Default at 0.
Figure 4-2 shows the AXI VIP Vivado IDE Advanced Settings tab configuration screen. For
more information on the user parameters, see Table 2-1.
X-Ref Target - Figure 4-2
User Parameters
For the relationship between the fields in the Vivado IDE and the User Parameters (which
can be viewed in the Tcl Console), see Table 2-1.
Output Generation
For details, see the Vivado Design Suite User Guide: Designing with IP (UG896) [Ref 6].
IP Sources
The IP sources are held in the subdirectories of the <ip_source_dir>.
Table 4-2: IP Sources
Name Description
hdl/*.sv AXI VIP source files.
AXI VIP generated top-level file for synthesis. Optional, generated if
synth/<component_name>.sv
synthesis target selected.
AXI VIP generated top-level file for simulation. Optional, generated
sim/<component_name>.sv
if simulation target selected.
X18577-121316
The AXI VIP uses similar naming and structures as the Universal Verification Methodology
(UVM) for core design. It is coded in SystemVerilog. The AXI VIP is comprised of two parts.
One is instanced like other traditional IP (modules in the static/physical world) and the
second part is used in the dynamic world in your verification environment. The AXI VIP is an
IP which has a static world connected to the dynamic world with a virtual interface. The
virtual interface is the only mechanism that can bridge the dynamic world of objects with
the static world of modules and interfaces.
• User environment
• Master agent
• AXI master VIP
The user environment and master agent are in the dynamic world while the AXI master VIP
is in the static world. The user environment communicates with the master agent and the
master agent communicates with the AXI VIP interface though a virtual interface. The
master agent has four class members:
For more information about the master agent, see Appendix D, AXI VIP Agent and Flow
Methodology.
Test Bench
User Environment
Master Agent
Monitor
Virtual Interface
Interface
Static World
AXI System
X18578-121316
Figure 4-5 shows how a write transaction is constructed and sent to the AXI VIP interface.
The user environment first declares a variable of the transaction type and then requests the
Master Write Driver for a handle to a new transaction. During the create_transaction,
the Master Write Driver sets properties on the transaction based on the physical
configuration of the AXI VIP.
Using the handle, the user environment sets up the members of the transaction by either
filling in using access methods or randomization. Once the transaction has been
configured, the transaction is passed back to the Master Write Driver which sends it to the
AXI VIP through a virtual interface and the AXI VIP interface pins start to wiggle. The read
transaction flow follows a similar process, except using the Master Read Driver as the source
of the handle to the transaction.
X18579-121316
• User environment
• Slave agent without a memory model
• AXI slave VIP
The user environment and slave agent are in the dynamic world, while the AXI slave VIP is
in the static world. The user environment communicates with the slave agent and the slave
agent communicates with the AXI VIP interface though a virtual interface. The slave agent
without a memory model has four class members.
For more information about the slave agent, see Appendix D, AXI VIP Agent and Flow
Methodology.
Test Bench
User Environment
Slave Agent
Monitor
Virtual Interface
Interface
Static World
AXI System
X18580-121316
Figure 4-7 shows how a write response transaction is constructed and sent to the AXI VIP
interface. The user environment first declares a variable of the transaction type which is
used by the user environment to manage the transaction. The user environment then calls
get_wr_reactive which blocks until a write transaction has been received by the Slave
Write Driver.
The Slave Write Driver waits until it receives a write command, and then it returns the
handle to the transaction. The user environment fills in the response portion of the
transaction by either randomization or member functions of the transaction class. The Slave
Write Driver then sends it to the AXI VIP interface through a virtual interface and the AXI VIP
interface related pins start to wiggle. The read response transaction flow follows a similar
process.
X18581-121316
DATA_WIDTH
2(ADDR_WIDTH – log2(DATA_WIDTH/8)) - 1
X18984-092718
IMPORTANT: This memory has no support for built-in system tasks such as readmemh. You can use the
backdoor_memory_write to write all of the file information into the memory. Reset has no effect on
memory content.
• User environment
• Slave agent with a memory model
• AXI slave VIP
The user environment and slave agent are in the dynamic world, while the AXI slave VIP is
in the static world. The user environment communicates with the slave agent and the slave
agent communicates with the AXI VIP interface though a virtual interface. The slave agent
with a memory model has five class members:
For more information about the slave agent with memory model, see Appendix D, AXI VIP
Agent and Flow Methodology.
Different from the AXI slave VIP, the AXI slave simple memory VIP does not need the user
environment to create and fill in write/read reactive transaction since all these are being
done in the slave memory agent. Refer to the Multiple Simulation Sets in Chapter 6 for its
usage.
Test Bench
Pass-Through Agent Master Agent Slave Agent Pass-Through Agent Dynamic World
DUT
Static World
Interface
Interface
AXI Pass-Through AXI System AXI Pass-Through
AXI Master IP AXI Slave IP
VIP VIP
X18582-121316
1. Create a bd design and add the VIP like other IPs into the design.
2. After connection and validation checks for the IP integrator design, click the Simulation
Settings, set up the tool, and then click Run Simulation. Figure 4-10 shows the Mentor
Graphics Questa Advanced Simulator results. After the hierarchy is identified, it is used
in the SystemVerilog test bench to drive the AXI VIP APIs.
After the AXI VIP is instantiated in the IP integrator design and its hierarchy path found, the
next step is using the AXI VIP in the test bench. See Chapter 5, Example Design.
Required Constraints
This section is not applicable for this IP core.
Clock Frequencies
This section is not applicable for this IP core.
Clock Management
This section is not applicable for this IP core.
Clock Placement
This section is not applicable for this IP core.
Banking
This section is not applicable for this IP core.
Transceiver Placement
This section is not applicable for this IP core.
Simulation
For comprehensive information about Vivado simulation components, as well as
information about using supported third-party tools, see the Vivado Design Suite User
Guide: Logic Simulation (UG900) [Ref 8].
IMPORTANT: For cores targeting 7 series or Zynq-7000 devices, UNIFAST libraries are not supported.
Xilinx IP is tested and qualified with UNISIM libraries only.
Example Design
This chapter contains information about the example design provided in the Vivado®
Design Suite.
IMPORTANT: The example design of this IP is customized to the IP configuration. The intent of this
example design is to demonstrate how to use the AXI VIP. The AXI VIP can only act as a protocol
checker when contained within a VHDL hierarchy. Do not import two different revision/versions of the
axi_vip packages. This will cause elaboration failures. All AXI VIP and parents to the AXI VIP must be
upgraded to the latest version.
Overview
Figure 5-1 shows the AXI VIP example design.
X-Ref Target - Figure 5-1
This section describes the example tests used to demonstrate the abilities of the AXI VIP
core. Example tests are delivered in SystemVerilog.
When the core example design is open, the example files are delivered in a standard path
test bench and bd design are under directory imports. The packages are under the directory
example.srcs/sources_1/bd/ex_sim/ipshared.
The AXI master VIP creates write/read transactions and sends them to the AXI pass-through
VIP. The AXI pass-through VIP receives transactions from the AXI master VIP and sends them
to the AXI slave VIP. The AXI slave VIP receives transactions from the AXI pass-through VIP,
generates write/read responses, and sends the responses back to the AXI pass-through VIP
and then back to AXI master VIP.
Monitors for the AXI VIP (master, pass-through, and slave) are always on and collect all of
the information from the interfaces. The monitors convert the interface information back to
the transaction level and sends it to the scoreboard. Two scoreboards are built in the test
bench which performs self-checking for the AXI master VIP against the AXI pass-through
VIP and the AXI slave VIP against the AXI pass-through VIP.
The AXI VIP core is not fully autonomous. If tests are written using the APIs, there are
different methods from the user environment to set up the transaction. It is possible that
the AXI protocol can be accidentally violated. The member functions of the transaction class
performs quick protocol and configuration checks. Xilinx recommends the use of
transaction randomization and constraints for generating generic transactions.
Furthermore, it is possible to further modify a transaction after it was originally generated
through a randomization.
When the AXI VIP is configured in pass-through mode, it has the ability to be a passive
monitor or it can take control of the interface. The AXI VIP can change to be a master
driving a downstream slave or a slave responding to the master. This process can be done
during a simulation at any time and then changed back to pass-through mode according to
your preference.
When it is switched to runtime master mode, it behaves exactly as an AXI master VIP. When
it is switched to runtime slave mode, it behaves exactly as an AXI slave VIP.
IMPORTANT: Ensure all transactions have completed before switching modes. Examples of how to wait
for the transactions to finish can be found in the example design.
Test Bench
This chapter contains information about the test bench for the example design provided in
the Vivado ® Design Suite.
To open the example design either from the Vivado IP catalog or Vivado IP integrator
design, follow these steps:
In both scenarios, a new project with the example design is created. The example design has
the master, pass-through, and slave VIP connected directly to each other as shown in
Figure 5-1. The configuration of the example design matches the original VIP configuration.
The AXI VIP example design in the 2018.3 release has simulation sets listed in Table 6-1. The
sim_all_config is a comprehensive simulation set. See the AXI VIP Example Test Bench
and Test section for a list of features. It shows different examples of how to use the AXI VIP
in a complex method.
For ease of use, 10 additional simulation sets with simple codes are also included in the
example design. Naming of these 10 simulation sets:
sim_<basic or adv>_mst_<mode>__pt_<mode>__slv_<mode>
° In passive mode, pass-through VIP is in run-time master mode while master VIP is
not active.
• For Slave VIP, it can be in mem, passive, or combo mode.
° In passive mode, pass-through VIP is in run-time slave mode while slave VIP is not
active.
° In combo mode, it means slave VIP does not have a memory model.
• For Pass-through VIP, it can be in mst, slv, passive, or mem mode.
° In slv mode, pass-through VIP is in run-time slave mode without a memory model.
° In mem mode, pass-through VIP is in run-time slave mode with a memory model.
For the 10 simulation set test benches, it includes three files which are generic_tb,
master stimulus, and slave stimulus.
• The generic_tb performs a simple self-checking of the master side (can be AXI
master VIP or AXI pass-through VIP in runtime master mode) against the slave side (can
be AXI slave VIP or AXI pass-through VIP in runtime slave mode).
• Master stimulus is generated by the AXI master VIP or AXI pass-through VIP in the
runtime master mode.
• Slave stimulus is generated by the AXI slave VIP or AXI pass-through VIP in the runtime
slave mode with/without the memory model. The slave mem stimulus file is included
and you can access the file to check the AXI slave VIP with the memory model.
The difference between basic and advanced simulation sets is that the basic simulation set
shows the code snippets which are needed in the test bench to use the AXI VIP. Advanced
simulation set adds more APIs such as user-configured READY signals which are optional.
For more information, see the example design in the Vivado Design Suite and for usage of
APIs, see the AXI VIP API Documentation [Ref 12].
1. To generate a transaction for the AXI master VIP, see the mst_stimulus.sv from any
of the 10 simulation sets in Table 6-1.
2. To generate a transaction response for a basic AXI slave VIP, see the
slv_basic_stimulus.sv from any of the 10 simulation sets in Table 6-1. For
memory model requirements, see the mem_basic_stimulus.sv.
3. To generate a transaction response for an advanced AXI slave VIP, see the
slv_stimulus.sv from any of the 10 simulation sets in Table 6-1. For memory model
requirements, see the mem_stimulus.sv.
4. To generate a transaction for the AXI pass-through VIP, see the
passthrough_mst_stimulus.sv from any of the simulation sets in Table 6-1.
5. To generate a transaction response for a basic AXI pass-through VIP, see the
passthrough_slv_basic_stimulus.sv from any of the simulation sets in
Table 6-1. For memory model requirements, see the
passthrough_mem_basic_stimulus.sv.
6. To generate a transaction response for an advanced AXI pass-through VIP, see the
passthrough_slv_stimulus.sv from any of the simulation sets in Table 6-1. For
memory model requirements, see the passthrough_mem_stimulus.sv.
7. When you open the AXI VIP example design under the Sources window, it shows 11
simulation sets. You can choose any simulation sets and run simulation or view the
source codes of each test bench.
Figure 6-1 to Figure 6-3 show the basic, advanced, and all configured simulation sets for
AXI VIP.
X-Ref Target - Figure 6-1
sim_basic_mst_passive_pt_mst_slv_comb
Testbench
passthrough_mst_stimulus.sv slv_basic_stimulus.sv
sim_basic_mst_active_pt_slv_slv_passive
Testbench
Pass-Through VIP
Slave VIP
Master VIP (Runtime Slave without
(Passive)
Memory Model)
mst_stimulus.sv passthrough_slv_basic_stimulus.sv
sim_basic_mst_active_pt_mem_slv_passive
Testbench
Pass-Through VIP
Slave VIP
Master VIP (Runtime Slave with
(Passive)
Memory Model)
mst_stimulus.sv passthrough_mem_basic_stimulus.sv
sim_basic_mst_active_pt_passive_slv_mem
Testbench
mst_stimulus.sv mem_basic_stimulus.sv
sim_basic_mst_active_pt_passive_slv_comb
Testbench
mst_stimulus.sv slv_basic_stimulus.sv
X18985-033017
sim_adv_mst_passive_pt_mst_slv_comb
Testbench
passthrough_mst_stimulus.sv slv_stimulus.sv
sim_adv_mst_active_pt_slv_slv_passive
Testbench
Pass-Through VIP
Slave VIP
Master VIP (Runtime Slave without
(Passive)
Memory Model)
mst_stimulus.sv passthrough_slv_stimulus.sv
sim_adv_mst_active_pt_mem_slv_passive
Testbench
Pass-Through VIP
Slave VIP
Master VIP (Runtime Slave with
(Passive)
Memory Model)
mst_stimulus.sv passthrough_mem_stimulus.sv
sim_adv_mst_active_pt_passive_slv_mem
Testbench
mst_stimulus.sv mem_stimulus.sv
sim_adv_mst_active_pt_passive_slv_comb
Testbench
mst_stimulus.sv slv_stimulus.sv
X18986-033017
Slave VIP
Master VIP Pass-Through VIP
(Without Memory Model)
X18988-050719
1. Create module test bench as all other standard SystemVerilog test benches.
module testbench();
…
endmodule
3. Declare agents. One agent for one AXI VIP has to be declared. Depending on the AXI VIP
interface mode, different typedef class should be called for declaration of the agent.
Table 6-2: Declare Agents
Name Description
<component_name>_mst_t Master VIP
<component_name>_slv_t Slave VIP without memory model
<component_name>_slv_mem_t Slave VIP with memory model
<component_name>_passthrough_t Pass-through VIP without memory model
<component_name>_passthrough_mem_t Pass-through VIP with memory model
4. Create a new for the agent and pass the hierarchy path of IF correctly into the new
function. Before the agent is set to new, run the simulation with an empty test bench to
find the hierarchy path of the AXI VIP instance. A message like this shows up and then
puts the path into a new function (see Figure 4-10).
agent = new("my VIP agent", <hierarchy_path>.IF);
Start Agent
For the VIP to start running, start agent has to be called. The following shows how the
master, slave, and pass-through VIPs start to run.
mst_agent.start_master();
Then, generate the transaction. For more information about how to generate transaction,
see the Vivado example design simset and look for mst_stimulus.sv.
slv_agent.start_slave();
Switch AXI pass-through VIP into the runtime slave mode. The <hierarchy_path> can be
found in step 4 and then start the slave agent.
<hierarchy_path>.set_slave_mode();
passthrough_agent.start_slave();
For more information, see the Vivado example design simset and look for
passthrough_slv_basic_stimulus.sv/passthrough_slv_stimulus.sv.
Switch AXI pass-through VIP into the runtime master mode. The <hierarchy_path> can
be found in step 4 and then start the master agent.
<hierarchy_path>.set_master_mode();
passthrough_agent.start_master();
Create transaction. For more information, see the Vivado example design simset and look
for passthrough_mst_stimulus.sv.
Default is in pass-through mode. If you want to switch back to the pass-through mode from
the master/slave mode, you have to call API set_passthrough_mode. The
<hierarchy_path> can be found in step 4 and then start the pass-through agent.
<hierarchy_path>.set_passthrough_mode();.
As described above, APIs used to switch pass-through VIP into the runtime master, runtime
slave, and runtime pass-through modes are set_master_mode, set_slave_mode, and
set_passthrough_mode.
The following shows a list of related parameters and type definitions used in the AXI VIP:
IMPORTANT: You have to call stop_master when pass-through VIP switches from the runtime
master mode to the other mode. Similarly, you have to call stop_slave when pass-through VIP
switches from runtime slave mode to the other mode. For more information, see the example design in
Vivado. The start_master and start_slave of the pass-through VIP agent cannot be called at the
same time. When the pass-through VIP is switching from the runtime master mode to the runtime slave
mode, the stop_master has to be called. Vice versa, stop_slave has to be called.
The best technique is to place the read response which is shown in the example design
simset sim_all_config. The procedure is shown here:
1. In the read driver of the slave agent, use the get_rd_reactive to receive the read
command,
2. Fill in the transaction read data information and send it back to the AXI slave VIP
interface. Because both the get_rd_reactive and send are blocking, they have to be
included in the initial and forever blocks without any blocking events. See the following
code example:
//slave VIP agent gets read transaction cmd information, fill in data information and
send it back to Slave VIP interface
initial begin
forever begin
slv_agent.rd_driver.get_rd_reactive(rd_reactive);
fill_payload(rd_reactive);
fill_ruser(rd_reactive);
fill_beat_delay(rd_reactive);
slv_agent.rd_driver.send(rd_reactive);
end
end
• Receiving it through the read driver of the master agent (see the
driver_rd_data_method_one and driver_rd_data_method_two in the
*mst_stimulus.sv file).
• Obtaining it through the monitor of the VIP (see the
monitor_rd_data_method_one and monitor_rd_data_method_two in the
*exdes_generic.sv file).
If the cmd type is XIL_AXI_WRITE in the monitor transaction, use the get_data_beat
and get_data_block to obtain the write data. The monitor_rd_data_method_one
shows how to receive the data beat through the monitor transaction. The
monitor_rd_data_method_two shows how to receive the data block through the
monitor transaction.
1. Use the read driver in the master agent to create a read transaction handle.
2. Randomize the read transaction. If you want to generate a specific read command, use
the APIs in the axi_transaction class to set the address, burst length, etc. or
randomize the transaction with specific values.
3. Set the driver_return_item_policy of the read transaction to be any of the
following values:
XIL_AXI_PAYLOAD_RETURN or XIL_AXI_CMD_PAYLOAD_RETURN
The is not always the RDATA representation. If the data width is 32 bits and the transaction
is subsize burst (1B in this example), only the last byte of get_data_beat is valid. This is
very different from the Physical Bus.
Note: The API get_data_block: get_data_block returns 4K bytes of the payload for the
transaction. This is not always the RDATA representation. If the data width is 32 bits and the
transaction is subsize burst (1B in this example), it aligns the significant bytes to the lower bytes and
set the unused bytes to zeros.
task driver_rd_data_method_one();
axi_transaction rd_transaction;
xil_axi_data_beat mtestDataBeat[];
rd_transaction = agent.rd_driver.create_transaction("read transaction with
randomization");
RD_TRANSACTION_FAIL_1a:assert(rd_transaction.randomize());
rd_transaction.set_driver_return_item_policy(XIL_AXI_PAYLOAD_RETURN);
agent.rd_driver.send(rd_transaction);
agent.rd_driver.wait_rsp(rd_transaction);
mtestDataBeat = new[rd_transaction.get_len()+1];
for( xil_axi_uint beat=0; beat<rd_transaction.get_len()+1; beat++) begin
mtestDataBeat[beat] = rd_transaction.get_data_beat(beat);
// $display("Read data from Driver: beat index %d, Data beat %h ", beat,
mtestDataBeat[beat]);
end
endtask
task driver_rd_data_method_two();
axi_transaction rd_transaction;
bit[8*4096-1:0] data_block;
rd_transaction = agent.rd_driver.create_transaction("read transaction with
randomization");
RD_TRANSACTION_FAIL_1a:assert(rd_transaction.randomize());
rd_transaction.set_driver_return_item_policy(XIL_AXI_PAYLOAD_RETURN);
agent.rd_driver.send(rd_transaction);
agent.rd_driver.wait_rsp(rd_transaction);
data_block = rd_transaction.get_data_block();
// $display("Read data from Driver: Block Data %h ", data_block);
endtask
For more information, see the simset sim_adv_mst_active_* in the Vivado example
design.
Transaction Examples
There are different methods of configuring the transaction after it is created. In the example
design, sim_all_config, three methods are shown for write and read transactions.
Method 1 is to fully randomize the transaction after it is being created. Method 2 is similar
to AXI BFM WRITE_BURST and READ_BURST for migration purpose. Method 3 shows how to
use the APIs to set the transaction.
1. Create the transaction from the write driver of the master agent.
2. Randomize the transaction.
3. Send the transaction from the master agent write driver.
IMPORTANT: The API sent here is non-blocking. By default, the driver does not return transaction
information. If you want to receive transaction information back, the API,
set_driver_return_item, can be called and the related driver_return_item_policy can be
called here.
This methods shows how to use the APIs to set the command and data of the write
transaction.
1. Create the transaction from the read driver of the master agent.
2. Randomize the transaction.
3. Send the transaction from the master agent read driver.
IMPORTANT: The API sent here is non-blocking. If you want to receive transaction information back,
the driver return item policy needs to be set here.
This methods shows how to use the APIs to set the command and data of the read
transaction.
Issue Capability
For the axi_vip slave and axi_vip master, you have the capability to program how many
threads of write/read transactions it can accept at the same time. By default, the maximum
number of VIP is set at 25. To accept or send more transactions, use the following sample
codes to set at 40 transactions. Also, ensure the <your_slv_agent> in the code is the
right agent in your design.
write transaction:
<your_slv_agent>.slv_wr_driver.seq_item_port.set_max_item_cnt(40);
read transaction:
<your_slv_agent>.slv_rd_driver.seq_item_port.set_max_item_cnt(40);
write transaction:
<your_slv_agent>.mst_wr_driver.seq_item_port.set_max_item_cnt(40);
read transaction:
<your_slv_agent>.mst_rd_driver.seq_item_port.set_max_item_cnt(40);
write transaction:
<your_slv_agent>.slv_wr_driver.seq_item_port.set_max_item_cnt(40);
read transaction:
<your_slv_agent>.slv_rd_driver.seq_item_port.set_max_item_cnt(40);
write transaction:
<your_slv_agent>.mst_wr_driver.seq_item_port.set_max_item_cnt(40);
read transaction:
<your_slv_agent>.mst_rd_driver.seq_item_port.set_max_item_cnt(40);
Upgrading
axi_vip_v1_1_top APIs
This appendix contains information about the axi_vip_v1_1_top APIs. These APIs can be
called through the following code. The set_passthrough_mode, set_master_mode,
and set_slave_mode are used to switch the pass-though VIP into different runtime
modes. Other APIs are used for assertion purposes. An example would be
set_passthrough_mode.
<hierarchy_path>.set_passthrough_mode()
For <hierarchy_path>, see Figure 4-10 in Chapter 4, Design Flow Steps and AXI
Pass-Through VIP, page 48.
set_passthrough_mode
function void set_passthrough_mode()
Sets AXI VIP passthrough into run time passthrough mode
set_master_mode
function void set_master_mode()
Sets AXI VIP passthrough into run time master mode
set_slave_mode
function void set_slave_mode()
Sets AXI VIP passthrough into run time slave mode
set_xilinx_slave_ready_check
function void set_xilinx_slave_ready_check()
Sets xilinx_slave_ready_check_enable of IF to be 1
clr_xilinx_slave_ready_check
function void clr_xilinx_slave_ready_check()
Sets xilinx_slave_ready_check_enable of IF to be 0
set_max_aw_wait_cycles
function void set_max_aw_wait_cycles(
input integer unsigned new_num)
Sets max_aw_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_max_ar_wait_cycles
function void set_max_ar_wait_cycles(
input integer unsigned new_num)
Sets max_ar_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_max_r_wait_cycles
function void set_max_r_wait_cycles(
input integer unsigned new_num)
set_max_b_wait_cycles
function void set_max_b_wait_cycles(
input integer unsigned new_num)
Sets max_b_wait_cycles of PC (Arm Protocol Checker), not available in Vivado
Simulator.
set_max_w_wait_cycles
function void set_max_w_wait_cycles(
input integer unsigned new_num)
Sets max_w_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_max_wlast_wait_cycles
function void set_max_wlast_wait_cycles(
input integer unsigned new_num)
Sets max_wlast_to_awvalid_wait_cycles of PC(Arm Protocol Checker), not available in
Vivado Simulator.
set_max_rtransfer_wait_cycles
Sets max_rtransfer_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_max_wtransfer_wait_cycles
Sets max_wtransfer_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_max_wlcmd_wait_cycles
function void set_max_wlcmd_wait_cycles(
input integer unsigned new_num)
Sets max_wlcmd_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_aw_wait_cycles
function integer unsigned get_max_aw_wait_cycles()
Returns max_aw_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_ar_wait_cycles
function integer unsigned get_max_ar_wait_cycles()
Returns max_ar_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_r_wait_cycles
function integer unsigned get_max_r_wait_cycles()
Returns max_r_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_b_wait_cycles
function integer unsigned get_max_b_wait_cycles()
Returns max_b_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_w_wait_cycles
function integer unsigned get_max_w_wait_cycles()
Returns max_w_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
get_max_wlast_wait_cycles
function integer unsigned get_max_wlast_wait_cycles()
Returns max_wlast_to_awvalid_wait_cycles of PC(Arm Protocol Checker), not available
in Vivado Simulator.
get_max_rtransfer_wait_cycles
Returns max_rtransfer_wait_cycles of PC(Arm Protocol Checker), not available in
Vivado Simulator.
get_max_wtransfer_wait_cycles
Returns max_wtransfer_wait_cycles of PC(Arm Protocol Checker), not available in
Vivado Simulator.
get_max_wlcmd_wait_cycles
function integer unsigned get_max_wlcmd_wait_cycles()
Returns max_wlcmd_wait_cycles of PC(Arm Protocol Checker), not available in Vivado
Simulator.
set_fatal_to_warnings
function void set_fatal_to_warnings()
Sets fatal_to_warnings of PC(Arm Protocol Checker) to be 1, not available in Vivado
Simulator.
clr_fatal_to_warnings
function void clr_fatal_to_warnings()
Sets fatal_to_warnings of PC(Arm Protocol Checker) to be 0, not available in Vivado
Simulator.
1. In Vivado IP integrator BD design, replace BFM with AXI VIP and configure the AXI VIP.
If the old BFM is AXI4 in slave mode, for example, set up the AXI VIP protocol to AXI4
and the interface mode to slave.
2. In the test bench, remove all BFM related tasks and add the following codes:
Because it is for migration purpose, no pass-through agent is declared since BFM did
not support pass-through mode.
° Start agent:
- If AXI VIP is in master mode:
mst_agent.start_master();
User Environment
Virtual Interface
AXI Interface
X18585-121316
AXI Monitor
• Monitors all five AXI channels: AW, AR, R, W, and B.
• It has seven analysis ports which you can select to use. By default, only
item_collect_port is ON, all other ports are OFF. You can use the API,
set_enabled, in each analysis port to switch ON the port. They include:
Table D-1: Analysis Ports
Name Description
Collects both write/read transaction information and converts to
item_collect_port
axi_monitor_transaction.
axi_cmd_port Collects both write/read channel information and converts to xil_axi_cmd_beat.
axi_rd_cmd_port Collects read address channel information and converts to xil_axi_cmd_beat.
axi_wr_cmd_port Collects write address channel information and converts to xil_axi_cmd_beat.
axi_bresp_port Collects write response channel information and coverts to xil_axi_resp_beat.
axi_wr_beat_port Collects write data channel information and converts to xil_axi_wr_beat.
axi_rd_beat_port Collects read data channel information and converts to xil_axi_read_beat.
• Collects and reorders R Channel beats and returns a completed transaction when the
RLAST is accepted.
• Collects and reorders B Channel response and returns a completed transaction when
the B channel is accepted.
• Transaction based protocol checking.
No
Yes
Assert WVALID
Yes
Assert WLAST
Address Insertion Delay
(Transaction)
Assert AWVALID
Last Write Beat
Accepted
X18586-033017
1. Driver asks for the next transaction through a get_next_item. This is a blocking get.
2. The user environment creates a single transaction. The transaction contains the
following:
° XIL_AXI_CMD_RETURN
° XIL_AXI_CMD_WLAST_RETURN
° XIL_AXI_WLAST_RETURN
° XIL_AXI_PAYLOAD_RETURN
° XIL_AXI_CMD_PAYLOAD_RETURN
° XIL_AXI_CMD_WLAST_PAYLOAD_RETURN
° XIL_AXI_WLAST_PAYLOAD_RETURN
6. The user environment receives the completed transaction if the driver return item policy
is not XIL_NO_RETURN.
X-Ref Target - Figure D-3
6
User Environment
2
3
1 5
X18587-121316
GET
Address Insertion
Delay (Transaction)
Assert ARVALID
Address Accepted
X18588-033017
1. Driver asks for the next transaction through a get_next_item. This is a blocking get.
2. The user environment creates a single transaction. The transaction contains the
following:
6
User Environment
2
3
1 5
X18589-121316
Initialize Current
Initial BREADY
BREADY
Configuration
Configuration
BREADY
Configuration
Queue
If not empty, replace
current BREADY
configuration.
GET BREADY
Configuration
Process Current
BREADY Configuration
Assert BREADY
Response Accepted
X18590-033017
Initialize Current
Initial RREADY
RREADY
Configuration
Configuration
RREADY
Configuration
Queue
If not empty, replace
current RREADY
configuration.
GET RREADY
Configuration
Process Current
RREADY Configuration
Assert RREADY
Response Accepted
RLAST
No
Asserted
X18591-033017
User Environment
Virtual Interface
AXI Interface
X18592-121316
AXI Monitor
• Monitors all five AXI channels: AW, AR, R, W, and B.
• Collects and reorders R Channel beats and returns a completed transaction when the
RLAST is accepted.
• Collects and reorders B Channel response and returns a completed transaction when
the B channel is accepted.
• Transaction-based protocol checking.
FIFO
FIFO
Reactive Put to
User Environment
GET
BRESP
Response Delay
(Transaction Property)
Assert BVALID
Response Accepted
Response Channel
Done
X18593-040517
Both the address and data channels have their READY responses configured independently
from the user environment. Only the response channel, B, relies on communication with the
user environment to make forward progress. The transaction flows through the write agent
in the following steps:
1. Master write response driver performs a blocking get to the user environment through
a get_next_item. Because the command has not yet been received, the user
environment must wait until the command has been received from the master.
2. The user environment performs a blocking get, get_next_item, on the reactive port
of the driver.
3. The driver at this time can accept the incoming beats of WDATA and AWADDR and
places them in a holding structure.
4. Only after the slave driver receives the complete AWADDR phase and the WDATA phase,
it transfers the command object through the reactive port to the user environment.
5. The user environment determines the correct response to the request and puts the
complete transaction on the REQUEST port of the driver. The transaction has:
° Command Information – AWADDR, AWLEN, AWSIZE, AWID, etc. From the original
command passed to the user environment.
8
User Environment
2 5
1 4 7
3 6
X18594-121316
Initialize Current
Initial AWREADY
AWREADY
Configuration
Configuration
AWREADY
Configuration
Queue
If not empty, replace
current AWREADY
configuration.
GET AWREADY
Configuration
Process Current
AWREADY
Configuration
Assert AWREADY
Address Accepted
X18595-040517
Initialize Current
Initial WREADY
WREADY
Configuration
Configuration
WREADY
Configuration
Queue
If not empty, replace
current WREADY
configuration.
GET WREADY
Configuration
Process Current
WREADY Configuration
Assert WREADY
WLAST
No
Asserted
X18596-040517
FIFO
Reactive Put to
User Environment
GET
Assert RVALID
Yes
Assert RLAST
X18597-040517
The address channel has its READY responses configured through the user environment.
The data channel relies on the user environment for timing and payload generation. The
transaction flows through the read agent in the following steps:
1. Master read response driver performs a blocking get to the user environment through a
get_next_item. Because the command has not yet been received the user
environment must wait until the command has been received from the master.
2. The user environment performs a blocking get, get_next_item, on the reactive port
of the driver.
3. The slave driver waits for an ARADDR command.
4. Only after the slave driver receives the completion ARADDR phase, it transfers the
command object through the reactive port to the sequencer. The command information
consists of the Command Information field with ARADDR, ARLEN, ARSIZE, ARID, etc.
5. The user environment creates a single transaction. The transaction contains the
following:
Initialize Current
Initial ARREADY
ARREADY
Configuration
Configuration
ARREADY
Configuration
Queue
If not empty, replace
current ARREADY
configuration.
GET ARREADY
Configuration
Process Current
ARREADY
Configuration
Assert ARREADY
Address Accepted
X18598-040517
User Environment
AXI Monitor Master Write Driver Master Read Driver Slave Write Driver Slave Read Driver
Virtual Interface
AXI Interface
X18599-121316
AXI Monitor
The same features for both master/slave agent monitors.
READY Generation
READY signals of write command channel, write data channel, write response channel, read
command channel, and read data channel are generated independently from other
attributes. The axi_ready_gen is the class used for READY generation.
The control of the READY signal is set in the DRIVER of the given AGENT. For masters these
are:
• RREADY
• BREADY
• AWREADY
• ARREADY
• WREADY
To control the generation of the READY signal there are two main configurations, however,
to simplify the programming model these might be presented as different configurations.
low_time high_time
*VALID
*READY
A B
X18603-031517
Note: The *READY does not drop until the specified number of cycles has occurred. The policy
repeats until the channel is given a different policy.
Figure D-17 shows that following event A, there is a delay of low_time ACLKs, then READY
is asserted. After high_time cycles of ACLK, READY is deasserted and the counter restarts
at A.
X-Ref Target - Figure D-17
low_time high_time
*READY
A B
X18601-031517
Note: There is a built-in watchdog that triggers after the event_cycle_count_reset cycles and
the programmed number of events has not been satisfied. This terminates that part of the policy. The
policy repeats until the channel is given a different policy.
The value of low_time can range from 0 to 256 cycles. The READY remains asserted for N
channel accept events, where N can be from 1 to N beats. This allows you to assert a READY
after some number of cycles and keep it asserted indefinitely or for some number of events.
When attempting to model a self-draining FIFO, an event cycle count time reset is provided.
This allows you to configure the READY to be deasserted after some number of events,
unless the event cycle count time has expired. In this case, the event count resets and the
READY remains asserted for N more events.
Figure D-18 shows that following event A, there is a delay of low_time ACLKs, then the
READY is asserted. It remains asserted for events E1 to E4 then deasserts since the event
count is satisfied. The algorithm then restarts at A.
X-Ref Target - Figure D-18
low_time
*READY
A E1 E2 E3 E4
Event Counter
X18600-031517
GEN_AFTER_VALID_SINGLE/RAND_AFTER_VALID_SINGLE
This policy is active when *VALID is detected to be asserted. When enabled, it drives the
*READY Low for low_time and then asserts the *READY until one handshake has been
detected. The policy repeats until the channel is given a different policy.
X-Ref Target - Figure D-19
low_time high_time
*VALID
*READY
A B
X18603-031517
GEN_AFTER_VALID_EVENTS/RAND_AFTER_VALID_EVENTS
This policy is active when *VALID is detected to be asserted. When enabled, it drives the
*READY Low for low_time and then drives the *READY High until either event_count
handshakes have been received OR event_count_reset number of cycles have passed.
The policy repeats until the channel is given a different policy.
delta1
*VALID
*READY
A E1 E2 E3 E4
Event Counter
X18602-121316
GEN_AFTER_VALID_OSC/RAND_AFTER_VALID_OSC
This policy is active when the *VALID is detected to be asserted. When enabled, it drives the
*READY Low for low_time and then drives the *READY High for high_time. The policy
repeats until the channel is given a different policy.
X-Ref Target - Figure D-21
low_time high_time
*VALID
*READY
A B
X18603-031517
GEN_NO_BACKPRESSURE
This policy generates a ready signal staying asserted and does not change until the driver
detects a policy change.
GEN_RANDOM
This policy randomly generates different policies including low_time, high_time, and
event_count. When used, it randomly selects a new policy when the previous policy has
completed.
This uses the minimum/maximum pairs for generating the value of the low_time,
high_time, and event_count values.
Debugging
This appendix includes details about resources available on the Xilinx ® Support website
and debugging tools.
Documentation
This product guide is the main document associated with the AXI VIP. This guide, along with
documentation related to all products that aid in the design process, can be found on the
Xilinx Support web page or by using the Xilinx Documentation Navigator.
Download the Xilinx Documentation Navigator from the Downloads page. For more
information about this tool and the features available, open the online help after
installation.
Answer Records
Answer Records include information about commonly encountered problems, helpful
information on how to resolve these problems, and any known issues with a Xilinx product.
Answer Records are created and maintained daily ensuring that users have access to the
most accurate information available.
Answer Records for this core can be located by using the Search Support box on the main
Xilinx support web page. To maximize your search results, use proper keywords such as
• Product name
• Tool message(s)
• Summary of the issue encountered
A filter search is available after results are returned to further target the results.
AR: 68234
Technical Support
Xilinx provides technical support at the Xilinx Support web page for this LogiCORE™ IP
product when used as described in the product documentation. Xilinx cannot guarantee
timing, functionality, or support if you do any of the following:
• Implement the solution in devices that are not defined in the documentation.
• Customize the solution beyond that allowed in the product documentation.
• Change any section of the design labeled DO NOT MODIFY.
To contact Xilinx Technical Support, navigate to the Xilinx Support web page.
Xilinx Resources
For support resources such as Answers, Documentation, Downloads, and Forums, see
Xilinx Support.
• From the Vivado® IDE, select Help > Documentation and Tutorials.
• On Windows, select Start > All Programs > Xilinx Design Tools > DocNav.
• At the Linux command prompt, enter docnav.
Xilinx Design Hubs provide links to documentation organized by design tasks and other
topics, which you can use to learn key concepts and address frequently asked questions. To
access the Design Hubs:
• In the Xilinx Documentation Navigator, click the Design Hubs View tab.
• On the Xilinx website, see the Design Hubs page.
Note: For more information on Documentation Navigator, see the Documentation Navigator page
on the Xilinx website.
References
These documents provide supplemental material useful with this product guide:
1. Arm® AMBA ® 4 AXI4, AXI4-Lite, and AXI4-Stream Protocol Assertions User Guide
(DUI0534B)
2. Instructions on how to download the Arm AMBA AXI specifications are at Arm AMBA
Specifications. See the:
Revision History
The following table shows the revision history for this document.