Applicability of this chapter to configurations:
Configuration |
Implementation |
---|---|
CV32A60AX |
Performance counters included |
CV32A60X |
No performance counters |
CV64A6_MMU |
No performance counters |
CSR performance counters control
CVA6 implements performance counters according to the RISC-V Privileged Specification, version 1.11 (see Hardware Performance Monitor, Section 3.1.10). The performance counters are placed inside the Control and Status Registers(CSRs) and can be accessed with the CSRRW(I)
and CSRRS/C(I)
instructions.
CVA6 implements the standard 64-bit clock cycle counter mcycle
, the retired instruction counter minstret
as well as the six generic 64-bit event counters mhpm_counter_3
to mhpm_counter_8
including their upper 32 bits counterparts mhpm_counter_3h
to mhpm_counter_8h
. The corresponding event selectors mhpm_event_3
to mhpm_event_8
are implemented for the selection of the source of events. The unavailable counters (mhpm_counter_9(h)
to mhpm_counter_31(h)
) and event selector (mhpm_event_9
to mhpm_event_31
) always read 0.
The mcountinhibit
CSR is used to individually inhibit the incrementing of the counters. The read-only shadows of the counters are also implemented as cycle
, instret
and hpmcountern
. The mcycle
and minstret
counters are always available but the mhpmcounter
are optional and can be configured through the parameter PERF_COUNTER_EN
. The supervisor and user access of performance counters are allowed through enabling of mcounteren
and scounteren
CSRs.
Event Selector
The event selector CSRs mhpm_event_3
to mhpm_event_8
controls which of the events are counted by the six generic event counters mhpm_counter_3
to mhpm_counter_8
respectively.
The five least significant bit(LSB) of the event selector CSRs are written to select the event that one needs to count from a particular generic event counter. Thus, we can count six different events at a time using the six generic counters.
Each of the six generic performance counters is able to monitor events from one of these sources:
Event ID |
Event Name |
Description |
---|---|---|
1 |
L1 I-Cache Misses |
Number of misses in L1 I-Cache |
2 |
L1 D-Cache Misses |
Number of misses in L1 D-Cache |
3 |
ITLB Misses |
Number of misses in ITLB |
4 |
DTLB Misses |
Number of misses in DTLB |
5 |
Load Accesses |
Number of data memory loads |
6 |
Store Accesses |
Number of data memory stores |
7 |
Exceptions |
Valid Exceptions encountered |
8 |
Exception Handler Returns |
Return from an exception |
9 |
Branch Instructions |
Number of branch instructions encountered |
10 |
Branch Mispredicts |
Number of branch mispredictions |
11 |
Branch Exceptions |
Number of valid branch exceptions |
12 |
Call |
Number of call instructions |
13 |
Return |
Number of return instructions |
14 |
MSB Full |
Scoreboard is full |
15 |
Instruction Fetch Empty |
Number of invalid instructions in IF |
16 |
L1 I-Cache Accesses |
Number of accesses to Instruction Cache |
17 |
L1 D-Cache Accesses |
Number of accesses to Data Cache |
18 |
L1 Cache Line Eviction |
Number of Data Cache line eviction |
19 |
ITLB Flush |
Number of ITLB Flushes |
20 |
Integer Instructions |
Number of Integer instructions |
21 |
Floating Point Instructions |
Number of Floating point instructions |
22 |
Pipeline Stall |
Number of cycles the pipeline is stalled during read operands |
23-31 |
Reserved |
Reserved |
Controlling the counters from software
All performance counters are enabled after reset. The mcountinhibit
CSR at address 0x320
controls which of the performance counters increment as described in the RISC-V Privileged Specification, version 1.11 (see Machine Counter-Inhibit CSR, Section 3.1.12). For instance, bit 0 is set to 0 for mcycle(h)
to increment as usual, bit 2 for minstrert(h)
and bit X for event counter mhpmcounterX(h).
The lower 32 bits of all counters can be accessed through the base register, whereas the upper 32 bits are accessed through the h-register.