blob: 620f4118667ddb1438570280d565df3ced724aec [file] [log] [blame] [view]
# 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.