Step 2: Launching Emulation with XSIM Waveform GUI - Step 2: Launching Emulation with XSIM Waveform GUI - 2025.2 English - XD100

Vitis Tutorials: AI Engine Development (XD100)

Document ID
XD100
Release Date
2026-03-27
Version
2025.2 English

After the building and packaging of the design is complete, you can run hardware emulation on your design. Make sure that launch_hw_emu.sh is in the sw directory.

  1. To launch emulation with the XSIM Waveform GUI, run the following command.

    ./launch_hw_emu.sh -g -aie-sim-options ../aiesimulator_output/aiesim_options.txt
    

    OR

    make run_emu
    

    OR

    You can include more options during emulation launch to view transactions logs:

    To view all the transactions generated by PS (QEMU) to either PL/AIE, set the env variable ENABLE_RP_LOGS=true. You can view the logs at sim/behav_waveform/xsim/rp_log.txt.

    NOTE: You cannot view the PS to DDR transactions here as QEMU has a backdoor direct connection into DDR buffer.

    To capture AIE transaction logs generated at runtime, set the env variable ENABLE_AIE_DBG_TRACE. You can view the logs created in the folder aie_log/ for example, sw/sim/behav_waveform/xsim/aie_log/S00_AXI.log file. This helps to debug the AIE systemC models only and contains transaction information per interface at each simulation cycle.

    At launch emulation, you can pass -xtlm-aximm-log switch. This logs all the transactions generated from CIPS to AIE or PL captured in xsc_report.log file, for example, sw/sim/behav_waveform/xsim/xsc_report.log.

    ./launch_hw_emu.sh -g -aie-sim-options ../aiesimulator_output/aiesim_options.txt -xtlm-aximm-log
    

    The terminal shows the following.

    Starting QEMU
    - Press <Ctrl-a h> for help
    Waiting for QEMU to start.
    running directly on console
    QEMU started. qemu_pid=3208
    Waiting for PMU to start.
    qemu-system-aarch64: -chardev socket,path=./qemu-rport-_pmc@0,server,id=ps-pmc-rp: info: QEMU waiting for connection on: disconnected:unix:./qemu-rport-_pmc@0,server
    PMC started. pmc_pid=3243
    qemu-system-aarch64: -chardev socket,id=pl-rp,host=127.0.0.1,port=7043,server: info: QEMU waiting for connection on: disconnected:tcp:127.0.0.1:7043,server
    XSIM started. xsim_pid=3300
    

    This shows QEMU starting and launching XSIM. The QEMU and XSIM are linked together, meaning closing one closes the other. The use of the -g flag opens up the XSIM Waveform GUI as shown in the following image with two config files (.wcfg and Untitled1).

    XSIM GUI Startup Default

    You can keep any of the one file (preferably close .wcfg file) to continue adding signals or creating wave groups for waveform analysis.

    XSIM GUI Startup

    In this view, you can select the signals you want to watch from the Scope and Objects views.

  2. In the Tcl Console, at the bottom of the view, run the following command.

    source ../../../../tcl/add_waveforms.tcl
    

    The add_waveforms.tcl file removes any default signals provided by the simulation environment, and adds in all the signals you want to view. There are some signals that are important to have such as: NoC, DDR memory, PL Kernel, and CIPS signals. Your design interacts with these components. Tracing signal changes from CIPS to the NoC to/from DDR memory, and then to your design is helpful in debugging data transfer issues. This file contains the following.

    ## Remove all waveforms before adding new ones
    remove_wave -of [get_wave_config] [get_waves -of [get_wave_config] -regexp ".*"]
    
    ## Set the appropriate paths based upon the platform being used
    set scope_path "/vitis_design_wrapper_sim_wrapper/vitis_design_wrapper_i/vitis_design_i"
    
    ## Create a wave group called CIPS and add all signals for the CIPS_0 to it
    set CIPS [add_wave_group CIPS]
    set cips_intf [get_objects -r $scope_path/CIPS_0/* -filter {type==proto_inst}]
    add_wave -into $CIPS $cips_intf
    
    ## Create a wave group called NOISE and add all signals of the random_noise_1 to it
    set NOISE [add_wave_group NOISE]
    set noise_intf [get_objects -r $scope_path/random_noise_1/* -filter {type==proto_inst}]
    add_wave -into $NOISE $noise_intf
    
    ## Create a wave group called S2MM and add all signals of the S2MM kernel to it
    set S2MM [add_wave_group S2MM]
    set s2mm_intf [get_objects -r $scope_path/s2mm_1/* -filter {type==proto_inst}]
    add_wave -into $S2MM $s2mm_intf
    
    ## Create a wave group called CIPS_NOC and all signals of the CIPS NoC to it
    set CIPS_NOC [add_wave_group CIPS_NOC]
    set cips_intf [get_objects -r $scope_path/cips_noc/* -filter {type==proto_inst}]
    add_wave -into $CIPS_NOC $cips_intf
    
    ## Create a wave group called DDR4 and all signals to/from DDR4
    set DDR4 [add_wave_group DDR4]
    set ddr4_intf [get_objects -r $scope_path/noc_ddr4/* -filter {type==proto_inst}]
    add_wave -into $DDR4 $ddr4_intf
    
    ## Create a wave group called AIENGINE and all signals of the AI Engine block to it
    set AIENGINE [add_wave_group AIENGINE]
    set aie_intf [get_objects -r $scope_path/ai_engine_0/* -filter {type==proto_inst}]
    add_wave -into $AIENGINE $aie_intf
    

    NOTE: This file can be executed automatically from the launch_hw_emu.sh command by using the -user-pre-sim-script add_waveforms.tcl.

    IMPORTANT: Add all the signals you need before starting emulation. If after starting emulation, you pause it, and add more signals, there will not be any data for the new signals.

    You will see a waveform view as shown in the following figure.

    XSIM with new signals

  3. Expand the all signal groups in the view to get the following view.

    Expanded signals

  4. The tutorial design runs quickly. You cannot view anything meaningful on this small scale.

    Adjust the scale to 100 µs.

    Proper Scale

    TIP: You can adjust the scale to fit your needs as emulation is running.

NOTE: For more information about this simulator view and how to use it, refer to the UG900 Vivado Design Suite User Guide: Logic Simulation.