| # Qemu Vector Testing and Debugging |
| |
| 1. [Qemu Setup](#qemu-setup) |
| 1. [Build steps:](#build-steps) |
| 2. [Start Qemu](#start-qemu) |
| 3. [Exiting Qemu](#exiting-qemu) |
| 2. [Running GDB](#running-gdb) |
| 1. [Use the following command to run GDB](#use-the-following-command-to-run-gdb) |
| 3. [GDBGUI Setup](#gdbgui-setup) |
| 1. [Installing gdbgui](#installing-gdbgui) |
| 2. [Running gdbgui](#running-gdbgui) |
| 3. [gdbgui window](#gdbgui-window) |
| 4. [GDB Usage](#gdb-usage) |
| 1. [Some Useful GDB instructions](#some-useful-gdb-instructions) |
| 5. [Aliases for convenience](#aliases-for-convenience) |
| 6. [Advanced Usage](#advanced-usage) |
| 1. [Debugging Qemu](#debugging-qemu) |
| |
| ## Qemu Setup |
| |
| ### Build steps: |
| |
| ``` |
| source build/setup.sh |
| m tools |
| m qemu |
| ``` |
| |
| ### Start Qemu |
| |
| Use the following command to start qemu with debugging: |
| |
| ``` |
| qemu-system-riscv32 -M opentitan -kernel $ROOTDIR/out/shodan/build-out/sw_shodan/device/examples/hello_vector/hello_vector_sim_verilator.elf -bios $ROOTDIR/out/shodan/build-bin/sw/device/boot_rom/boot_rom_fpga_nexysvideo.elf -nographic -cpu rv32,x-v=true,vlen=512,vext_spec=v1.0 -s -S |
| ``` |
| |
| Notes on above command: |
| |
| - `-s` - starts the gdb server |
| - `-S` - waits on execution for a client to connect |
| |
| The above commands can be omitted to run qemu without starting a gdb server. |
| |
| ### Exiting Qemu |
| |
| To exit qemu, in the same teriminal, press `Ctrl-a` then `Ctrl-x`. |
| |
| ## Running GDB |
| |
| ### Use the following command to run GDB |
| |
| Run GDB to create a gdb session in the CLI: |
| |
| ``` |
| $ROOTDIR/cache/toolchain_vp/bin/riscv32-unknown-elf-gdb $ROOTDIR/out/shodan/build-bin/sw/device/examples/hello_vector/hello_vector_sim_verilator.elf --eval-command "target remote :1234" |
| ``` |
| |
| ## GDBGUI Setup |
| |
| ### Installing gdbgui |
| |
| `python3 -m pip install gdbgui` |
| |
| ### Running gdbgui |
| |
| Use the following command to begin gdbgui: |
| |
| ``` |
| export PURE_PYTHON=1; gdbgui -g "$ROOTDIR/out/host/toolchain_vp/bin/riscv32-unknown-elf-gdb $ROOTDIR/out/shodan/build-bin/sw/device/examples/hello_vector/hello_vector_sim_verilator.elf --eval-command \"target remote :1234\"" |
| ``` |
| |
| ### gdbgui window |
| |
| lower left window takes conventional gdb commands. |
| |
| To start, set up a breakpoint (e.g. `b main`), then hit continue (`c`) |
| |
| ![image of gdbgui](./gdbgui.png) |
| |
| ## GDB Usage |
| |
| With one of the gdb methods working, you can now step through and check |
| register contents. |
| |
| ### Some Useful GDB instructions |
| |
| - `break main` (or `b main` for short) - makes a breakpoint at the main, more |
| info [here](https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_27.html) |
| - `continue` (or `c` for short) - runs until breakpoint |
| - `step` (or `s` for short) - runs one more line, will "step into" subroutines |
| - `next` (or `n` for short) - runs one more line, will "step over" subroutines |
| - `info reg` - print all registers |
| - `info reg a1` - print scalar register a1 |
| - `info vector` - print all vector registers and vector csr's |
| |
| ## Aliases for convenience |
| |
| First source `build/setup.sh` to set up the enviroment in the respective |
| terminal, and then these aliases can speed up the workflow: |
| |
| ``` |
| alias run_gdb="$ROOTDIR/cache/toolchain_vp/bin/riscv32-unknown-elf-gdb $ROOTDIR/out/shodan/build-bin/sw/device/examples/hello_vector/hello_vector_sim_verilator.elf --eval-command \"target remote :1234\"" |
| alias run_gdb_gui="export PURE_PYTHON=1; gdbgui -g '$ROOTDIR/cache/toolchain_vp/bin/riscv32-unknown-elf-gdb $ROOTDIR/out/shodan/build-bin/sw/device/examples/hello_vector/hello_vector_sim_verilator.elf --eval-command \"target remote :1234\"'" |
| alias run_qemu="qemu-system-riscv32 -M opentitan -kernel $ROOTDIR/out/shodan/build-out/sw_shodan/device/examples/hello_vector/hello_vector_sim_verilator.elf -bios $ROOTDIR/out/shodan/build-bin/sw/device/boot_rom/boot_rom_fpga_nexysvideo.elf -nographic -cpu rv32,x-v=true,vlen=512,vext_spec=v1.0 -s -S" |
| ``` |
| |
| ## Advanced Usage |
| |
| ### Debugging Qemu |
| |
| ``` |
| gdb --eval-command "b helper_vsetvl" --eval-command "run" --args qemu-system-riscv32 -s -S -nographic -cpu rv32,x-v=true,vlen=512,vext_spec=v1.0,s=true,mmu=true -M opentitan -kernel out/shodan/build-out/sw_shodan/device/examples/hello_vector/hello_vector_sim_verilator.elf -bios out/shodan/build-bin/sw/device/boot_rom/boot_rom_fpga_nexysvideo.elf -nographic |
| ``` |
| |
| Above starts up qemu with the debugger and breaks the simulator on the |
| `vsetvl` instruction so that you can check the state of the cpu. |
| |
| This may be useful when debugging qemu itself. |