blob: c5d9f4627bcdc915dd693d442086966aca600724 [file] [log] [blame] [view]
# Trace Generation
Methods available in the Shodan repo for generating traces from Spike,
and Renode.
[TOC]
## Trace Generation with Wrapper Script
The `test_runner.py` script currently supports both trace generation in both **Spike** and **Renode**.
### Spike trace generation with `test_runner.py`
1. cd to the root shodan directory and run:
```sh
source build/setup.sh
```
2. (optionally) run `m springbok` to create potential elf targets
3. Run trace with the `test_runner.py` script and save trace to file:
```sh
TEST_RUNNER="${ROOTDIR}/sw/vec/scripts/test_runner.py"
ELF_FILE="${ROOTDIR}/out/springbok/rvv/softrvv/tests/softrvv_vxor_test.elf"
SPIKE_PATH="${ROOTDIR}/out/host/spike/bin/spike"
OUTPUT_FILE="spike_trace_output.txt"
"${TEST_RUNNER}" "spike" \
"${ELF_FILE}" \
"--spike-path" "${SPIKE_PATH}" \
"--timeout=30" \
"--trace-output" "${OUTPUT_FILE}"
```
### Renode trace generation with `test_runner.py`
```sh
TEST_RUNNER="${ROOTDIR}/sw/vec/scripts/test_runner.py"
ELF_FILE="${ROOTDIR}/out/springbok/rvv/softrvv/tests/softrvv_vxor_test.elf"
RENODE_PATH="${ROOTDIR}/out/host/renode/renode"
OUTPUT_FILE="renode_trace_output.txt"
"${TEST_RUNNER}" "renode" \
"${ELF_FILE}" \
"--renode-path" "${RENODE_PATH}" \
"--quick_test" \
"--timeout=30" \
"--trace-output" "${OUTPUT_FILE}"
```
## Direct Trace Generation
This section provides examples for setting up trace generation, and
command line options for **Spike** and **Renode**.
### Direct Spike Trace Generation
#### Quickly Get Spike Trace With Springbok Defaults
To run a direct spike trace with the defaults for springbok, run:
```sh
ELF_FILE="${ROOTDIR}/out/springbok/rvv/softrvv/tests/softrvv_vxor_test.elf"
spike_sim_springbok "${ELF_FILE}"
```
Trace file will be saved to /tmp/spike_trace.txt
#### Granular Direct Spike Trace Generation
This section describes flags in depth for more granular trace generation.
The following example shows trace generation for a softrvv vxor test script,
and how to adjust each of the flag values:
```sh
ELF_FILE="${ROOTDIR}/out/springbok/rvv/softrvv/tests/softrvv_vxor_test.elf"
LOG_FILE="spike_trace_output.txt"
"${OUT}/host/spike/bin/spike" \
-m0x34000000:0x1000000 \
--pc=0x34000000 \
--log="${LOG_FILE}" \
-l \
"${ELF_FILE}"
```
Sample output:
```sh
core 0: 0x00001000 (0x00000297) auipc t0, 0x0
core 0: 0x00001004 (0x02028593) addi a1, t0, 32
core 0: 0x00001008 (0xf1402573) csrr a0, mhartid
core 0: 0x0000100c (0x0182a283) lw t0, 24(t0)
core 0: 0x00001010 (0x00028067) jr t0
core 0: >>>> _boot_address
core 0: 0x32000000 (0x0080006f) j pc + 0x8
core 0: >>>> _start
core 0: 0x32000008 (0x02400117) auipc sp, 0x2400
core 0: 0x3200000c (0xfb810113) addi sp, sp, -72
```
*Notes on Spike Flags:*
- The elf-file __must__ be the last argument
- Omitting the `--log` flag but keeping the `-l` flag sends trace to console's stderr instead of to a file.
- add `-d` to to interactively run the trace
- add `--log-commits` to add register value changes woven between the trace:
Sample output (recall that `t0` is register `x5`, and `a1` is `x11`):
```sh
core 0: 0x00001000 (0x00000297) auipc t0, 0x0
core 0: 3 0x00001000 (0x00000297) x 5 0x00001000
core 0: 0x00001004 (0x02028593) addi a1, t0, 32
core 0: 3 0x00001004 (0x02028593) x11 0x00001020
```
- we use the `-m` flag as `-m<TCM>:<TCM LENGTH>` or more generally from the spike documentation:
```
-m<a:m,b:n,...> Provide memory regions of size m and n bytes
at base addresses a and b (with 4 KiB alignment)
```
## Trace Analysis
### Number of Instructions
These commands assume the TCM starts at 0x34000000, may need to s/0x34/0x80/ for 0x8000000 TCM Starting address.
#### Spike
```sh
cat spike_trace_output.txt | awk '/_start/,/_finish/' | grep "0: 0x34" | wc -l
```
#### Renode
```sh
renode_trace_output.txt | wc -l
```
### PC for Trace Analysis
SystemC trace output contains the 8 digit PC in hex (without the '0x' prefix).
These commands reformat the raw output trace from Spike and Renode for
comparison with the SystemC output trace, located at:
```sh
$ROOTDIR/out/springbok/systemc/sim/simulations/trace.dat
```
#### Spike
```sh
cat spike_trace.txt | awk '/_start/,/_finish/' | sed 's/.*: 0x\([0-9a-fA-F]\{8\}\).*/\1/g' | egrep "^34" > spike_trace_pc.txt
```
#### Renode
```sh
cat renode_trace.txt | awk -F":" '{print $1}' | tr "[:upper:]" "[:lower:]" > renode_trace_pc.txt
```