blob: 9ac070c5cfd854f6fe6e17b73b28ffb99c60e35a [file] [log] [blame] [view] [edit]
# OTBNSim - OTBN Simulation Software
`OTBNSim` class represents a simulator that models the whole OTBN block.
Therefore it includes abstract models for the the state of the core, its memory modules, and also the register modules.
It has methods for starting the execution, cycle-accurate simulation tracing, and for injecting errors and reacting to those errors with a secure wipe.
As explained in the overall [OTBN DV documentation](../README.md), this simulator is driven essentially from the SystemVerilog model of the OTBN module.
The simulator works in a step-by-step fashion and it has multiple methods to apply external stimuli to OTBN.
In a typical run without errors, the ISS does the following:
1. Decode the program on the path given by `iss_wrapper.cc` by the `decode_file` method in `decode.py`.
2. Load the decoded program to a local list in `sim.py`.
3. With each `step` command from the SystemVerilog side, update the simulated state of the core (`state.py`), registers (`wsr.py`, `csr.py` and `gpr.py`) and data memory (`dmem.py`).
4. Once the step is done, pass the generated trace to `iss_wrapper.cc`, which to then passes it on to `OTBNTraceChecker`.
## Co-Simulation with RTL
For co-simulation of RTL and ISS, the `otbn_tracer` module logs state changes of the RTL, and the ISS logs state changes of the Python model.
Trace entries from the simulated core (aka. from RTL) appear as a result of DPI callbacks while ISS trace entries appear in the trace checker through `ISSWrapper` using `OnIssTrace` method after sending a step command to `OTBNSim`.
To check correct behaviour, the two separate logs generated by the model and the RTL are compared.
For more information about how OTBN RTL produces traces see the [Tracer README](../tracer/README.md).
To see the C++ program that compares both traces, check the method `otbn_trace_checker.cc` in `../model/otbn_trace_entry`.