# 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
```

