Sleep Unit
Source File: rtl/cv32e40s_sleep_unit.sv
The Sleep Unit contains and controls the instantiated clock gate, see Clock Gating Cell, that gates clk_i
and produces a gated clock
for use by the other modules inside CV32E40S. The Sleep Unit is the only place in which clk_i
itself is used; all
other modules use the gated version of clk_i
.
The clock gating in the Sleep Unit is impacted by the following:
rst_ni
fetch_enable_i
wfi instruction
wfe instruction
Table 13 describes the Sleep Unit interface.
Signal |
Direction |
Description |
---|---|---|
|
output |
Core is sleeping because
of a wfi or wfe instruction. If
|
|
input |
Wake-up signal for custom wfe instruction. Positive level sensitive. See WFE for details. |
Startup behavior
clk_i
is internally gated off (while signaling core_sleep_o
= 0) during CV32E40S startup:
clk_i
is internally gated off duringrst_ni
assertion
clk_i
is internally gated off fromrst_ni
deassertion untilfetch_enable_i
= 1
After initial assertion of fetch_enable_i
, the fetch_enable_i
signal is ignored until after a next reset assertion.
WFI
The wfi instruction can under certain conditions be used to enter sleep mode awaiting a locally enabled interrupt to become pending. The operation of wfi is unaffected by the global interrupt bits in mstatus.
A wfi will not enter sleep mode, but will be executed as a regular nop, if any of the following conditions apply:
debug_req_i
= 1 or a debug request is pendingThe core is in debug mode
The core is performing single stepping (debug)
The core has a trigger match (debug)
If a wfi causes sleep mode entry, then core_sleep_o
is set to 1 and clk_i
is gated off internally. clk_i
is
allowed to be gated off externally as well in this scenario. A wake-up can be triggered by any of the following:
A locally enabled interrupt is pending
A debug request is pending
Core is in debug mode
Upon wake-up core_sleep_o
is set to 0, clk_i
will no longer be gated internally, must not be gated off externally, and
instruction execution resumes.
If one of the above wake-up conditions coincides with the wfi instruction, then sleep mode is not entered and core_sleep_o
will not become 1.
Figure 11 shows an example waveform for sleep mode entry because of a wfi instruction.
WFE
The custom wfe instruction behaves exactly as the wfi instruction, except that a wake-up can additionally be triggered
by asserting wu_wfe_i
.
The wfe instruction is encoded as a custom SYSTEM instruction with opcode 0x8C00_0073
.