Mega Vitis Notes - barawn/verilog-library-barawn GitHub Wiki

Much like Petalinux, Vitis is massively underdocumented. So keeping a list of all the random bugs and crap here!

Random Errors Seen

  • If a board powers on but shows up with only "dummy_dap_0" it basically means the processor isn't running (it hasn't finished its boot ROM). Xilinx tries to point you in lots of complicated directions, but basically you need to check power supplies and check that the PS clock is running (On an HTG-ZRF and its derivatives, you have to program the clock first before you can boot).

  • If you try to load a Hello World program through Vitis (or any program really) and it just hangs at the FSBL (giving a "timeout" or some such) - the DDR settings are probably wrong. If you just try to proceed through the FSBL blindly it'll try to write into the DDR and everything will go to hell because it actually wasn't set up right.

Rapid Testing

If you don't need to mess with the PL logic, it's faster to just redownload stuff yourself in xsct.

  • Select processor using targets command
  • rst -processor -clear-registers
  • dow <app.elf> (where <app.elf> is the name of the application)

Mucking with the Boot Mode

When debugging it's usually easiest to start out with JTAG boot mode forced, because in that mode at power on you can always access the PS easily. Then what you do is force a new boot mode, and reset.

If you search for this, you'll find lots of cryptic random hex character commands that should be entered in xsct (mwr 0xff5e0200 0xe100). "mwr/mrd" are memory write/read commands, and "0xFF5E0200" is BOOT_MODE_USER. The "100" at the bottom sets the "use_alt" bit, and then the "e" above it sets the boot mode. So the magic values here are

  • mwr 0xff5e0200 0x0100 : JTAG boot
  • mwr 0xff5e0200 0x1100 : 24-bit QSPI (QSPI under 256Mb)
  • mwr 0xff5e0200 0x2100 : 32-bit QSPI (QSPI equal or over 256Mb)
  • mwr 0xff5e0200 0x3100 : boot from SD0 using SD 2.0
  • mwr 0xff5e0200 0x4100 : boot from NAND
  • mwr 0xff5e0200 0x5100 : boot from SD1 using SD 2.0
  • mwr 0xff5e0200 0x6100 : boot from eMMC
  • mwr 0xff5e0200 0x7100 : boot from USB
  • mwr 0xff5e0200 0x8100 : boot from dedicated processor JTAG using MIO[29:26]
  • mwr 0xff5e0200 0x9100 : boot from dedicated processor JTAG using MIO[15:12]
  • mwr 0xff5e0200 0xe100 : boot from SD1 using SD 3.0 with level shifter

Note that "SD1 LS" is not "low speed," it's "level shift."

If you are in a different boot mode other than JTAG, you can still force a new boot mode - however, you need to reset the MultiBoot system first via:

  • mwr 0xffca0010 0x0 : reset MultiBoot to ZERO

After running the mwr command(s), rst -system will kick things through the BootROM with the new configuration. Note that xsct wants to be targeting the PSU when it does this, so you connect, then target the PSU.

If your new boot target actually worked, you will see a Reset Catch immediately after rst -system, because the boot process successfully found a configuration and then attempted to start the boot process, triggering the Reset at the debugger. You can then execute con (continue) to have the boot process continue.

⚠️ **GitHub.com Fallback** ⚠️