Debugging Using TracerV

FireSim can provide a cycle-by-cycle trace of the CPU’s architectural state over the course of execution. This can be useful for profiling or debugging. The tracing functionality is provided by the TracerV widget.

Building a Design with TracerV

In all FireChip designs TracerV is generated by default. Other targets can enable it by attaching a TracerV Bridge to the RISC-V trace port of one-or-more cores.

Enabling Tracing at Runtime

To improve simulation preformance, FireSim does not collect data from the TracerV Bridge by default. To enable collection, modify the tracing section to your config_runtime.ini.

[tracing]
enable=yes

Now when you run a workload, a trace output file will be placed in the sim_slot_<slot #> directory on the F1 instance under the name TRACEFILE.

Setting a TracerV Trigger

Tracing the entirety of a long-running job like a Linux-based workload can generate a pretty large image, and you may only care about the state within a certain timeframe. Therefore, FireSim allows you to specify a trigger condition for starting and stopping trace data collection. FireSim currently provides three possible trigger conditions: * Simulation cycles: Specify a start cycle and end cycle, based on the simulation cycle count * Program Counter (PC) value: Specify a program counter value to start collection, and a program counter value in which to end collection. * Instruction value: Specify an instruction value upon which to start data collection, and an instruction value in which to end collection. This method is particularly valuable for setting the trigger from within the target software under evaluation, by using custom “NOP” instructions. As such, one may use the

By default, TracerV does not use a trigger, hence data collection starts at cycle 0 and ends at the last cycle of the simulation. To change this, modify the following under the “tracing” section of your config_runtime.ini. Use the selector field to choose the type of trigger, and there use the start and end fields to select the start and end values for the trigger.

[tracing]
#trigger selector
#0 = no trigger
#1 = cycle count trigger
#2 = program counter trigger
#3 = instruction trigger
selector=1
start=XXXX
end=YYYY

Interpreting the Trace Result