缓存
简介
缓存(Cache)是位于 CPU 与主存之间的小容量高速存储器,用于保存最近访问过的指令和数据。由于 CPU 的运算速度远快于外部存储器(如 PSRAM/Flash)的访问速度,Cache 通过局部性原理将热点数据预先缓存在片内,从而大幅减少 CPU 的等待周期,同时降低对外部存储器接口的访问频率,显著提升系统吞吐量和响应速度。
Cache 配置
芯片中每个 CPU 内核均配备独立的指令缓存(I-Cache)和数据缓存(D-Cache),均采用 N 路组相联(N-way Set-Associative) 结构:
Way(路):Cache 被划分为多路,每路存储一份数据。N 路表示同一组中最多可同时保存 N 个不同地址映射的缓存行。
Set(组):地址按组索引,相同组内的多路之间可相互替换,通过替换算法管理。芯片采用 LRU 替换算法。
Cache Line(缓存行):每次从主存搬运数据的最小单位。行越长,一次可预取的连续数据越多;但若访问的数据分散,也会带来更多无效的数据搬运。
默认情况下,芯片读写内存采用如下策略:
读: read-allocate。即 read miss 时,先将读地址按照 Cache Line 大小读取到 Cache 中, CPU 再从 Cache 中读取数据。
写: write-allocate + write-back 。即如果 write hit,CPU 会将数据写到 Cache 中而不写到内存。如果 write miss,会先将写地址按照 Cache Line 大小读取到 Cache 中,CPU 再将数据写到 Cache 中。
备注
用户可以通过修改 MPU 或 MMU 配置来改变对应内存的 Cache 策略。
下表列出了芯片的缓存配置参数:
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KM0 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
备注
关于 KM0 和 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KR4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
备注
关于 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
关于 KR4 Cache 的配置,参考 MCCA 寄存器。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KR4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
备注
关于 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
关于 KR4 Cache 的配置,参考 MCCA 寄存器。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KR4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
DSP |
I-Cache |
32KB |
4 |
128B |
D-Cache |
48KB |
3 |
128B |
备注
关于 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
关于 KR4 Cache 的配置,参考 MCCA 寄存器。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KR4 |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
DSP |
I-Cache |
32KB |
4 |
128B |
D-Cache |
48KB |
3 |
128B |
备注
关于 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
关于 KR4 Cache 的配置,参考 MCCA 寄存器。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4 |
I-Cache |
64KB |
4 |
32B |
D-Cache |
32KB |
4 |
32B |
|
KM0 |
I-Cache |
16KB |
2 |
32B |
D-Cache |
8KB |
2 |
32B |
|
CA32 |
L1 I-Cache |
32KB |
2 |
64B |
L1 D-Cache |
32KB |
4 |
64B |
|
L2 Cache |
256KB |
8 |
64B |
备注
关于 KM0 和 KM4 Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
关于 CA32 Cache 的更多信息,参考 Arm® Cortex®-A32 Processor Technical Reference Manual Revision: r1p0。
CPU |
类型 |
大小 |
Way |
缓存行长度 |
|---|---|---|---|---|
KM4TZ |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
|
KM4NS |
I-Cache |
16KB |
4 |
32B |
D-Cache |
16KB |
4 |
32B |
备注
关于 KM4TZ 和 KM4NS Cache 的更多信息,参考 Arm®v8-M Architecture Reference Manual。
Cache 路限制
在实时性要求严格的场景中,关键代码或数据可能因 Cache 替换算法(如 LRU)被其他访问驱逐出 Cache,导致不可预期的访问延迟抖动。Cache 路限制功能允许开发者将指定地址范围的数据"锁定"到特定的 Cache 路中,使其不会被受限范围外的数据替换,从而为关键任务提供稳定可预期的 Cache 命中率。
不支持。
不支持。
不支持。
不支持。
不支持。
KM4 支持 Cache 路限制功能,可将指定地址范围(受限地址范围)内的数据固定存储在特定的 Cache 路中,该范围之外的数据则存储在其余路中。通过将实时性要求高的关键代码或数据放入受限地址范围,可防止其因普通访问触发 LRU 替换而被驱逐出 Cache。此功能也可用于为 TCM 预留指定数量的 Cache 路。
配置受限地址范围
受限地址范围通过以下寄存器对定义:
ICWRR_BASE~ICWRR_TOP:定义存储在指定 I-Cache 路中的受限地址范围。DCWRR_BASE~DCWRR_TOP:定义存储在指定 D-Cache 路中的受限地址范围。
I-Cache 路分配
指定的 I-Cache 路通过 ACTLR.ICWRR_MODE[1:0] 配置:
ACTLR.ICWRR_MODE[1:0] |
受限范围内的数据 |
受限范围外的数据 |
|---|---|---|
2'b00 |
使用路 0 |
使用路 1、路 2 和路 3 |
2'b01 |
使用路 0 和路 1 |
使用路 2 和路 3 |
2'b10 |
使用路 0、路 1 和路 2 |
使用路 3 |
2'b11 |
使用所有路 |
不使用任何路 |
D-Cache 路分配
指定的 D-Cache 路通过 ACTLR.DCWRR_MODE[1:0] 配置:
ACTLR.DCWRR_MODE[1:0] |
受限范围内的数据 |
受限范围外的数据 |
|---|---|---|
2'b00 |
使用路 0 |
使用路 1、路 2 和路 3 |
2'b01 |
使用路 0 和路 1 |
使用路 2 和路 3 |
2'b10 |
使用路 0、路 1 和路 2 |
使用路 3 |
2'b11 |
使用所有路 |
不使用任何路 |
下图以 D-Cache 为例,展示将 ACTLR.DCWRR_MODE[1:0] 设置为 2'b00 时的路分配效果:受限地址范围内的数据独占路 0,范围外的数据使用路 1 到路 3,路 0 中的数据不会被范围外的访问驱逐。
参考 寄存器 获取更多信息。
不支持。
紧耦合内存 (TCM)
当 Cache 的部分或全部路不再用作缓存时,可通过寄存器配置将其重映射为紧耦合内存(Tightly-Coupled Memory,TCM)地址空间,由 CPU 直接访问。TCM 的访问延迟固定(通常为 0 等待周期),与 Cache 的概率性命中不同,TCM 提供确定性的访问时序,非常适合存放中断服务例程(ISR)、实时控制算法等对执行时序有严格要求的关键代码和数据。
备注
TCM 无法被 CPU 之外的总线 Master(如 DMA)访问。需经其他 Master 的数据不应放置于 TCM。
不支持。
不支持。
不支持。
不支持。
不支持。
Cache 可以被当成紧耦合内存(Tightly-Coupled Memory, TCM)来使用。TCM 是一种低延迟、高速度的静态存储器,物理上直接连接到 CPU,不经过总线矩阵或 Cache 控制器。因此 TCM 每次访问消耗的时钟周期都是固定的而且极低(通常为 0 等待周期),这使得 TCM 非常适合用于存放对实时性要求极高的关键代码和数据。
KM4 Cache 的总内存大小为 96KB,其中 I-Cache 为 64KB,D-Cache 为 32KB。当 Cache 部分或者全部被禁用时,这 96KB 空间可用作 TCM,并被映射到设定的地址。
通过路限制功能,Cache 具有可配置的 1/2/3/4 路组相联。它可以配置为以下组合:
96KB TCM,无 Cache
80KB TCM,0KB D-Cache,16KB I-Cache
64KB TCM,16KB D-Cache,16KB I-Cache
48KB TCM,16KB D-Cache,32KB I-Cache
32KB TCM,16KB D-Cache,48KB I-Cache
16KB TCM,32KB D-Cache,48KB I-Cache
0KB TCM,32KB D-Cache,64KB I-Cache
这些不同的配置为软件提供了灵活性,可以调整并达到最佳系统性能。
SDK 中已默认将 0x0008_0000 配置为 TCM 映射地址的起始地址,不建议用户改动。各配置组合的地址映射如下表所示:
ACTLR.ICWRR_MODE[1:0] |
ACTLR.DCWRR_MODE[1:0] |
Cache |
TCM Mapping Address |
TCM Size |
|---|---|---|---|---|
2'b11 |
2'b11 |
I-Cache 64KB, 4 way (way 0/1/2/3) |
0KB |
|
D-Cache 32KB, 4 way (way 0/1/2/3) |
||||
2'b10 |
2'b11 |
I-Cache 48KB, 3 way (way 0/1/2) |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) |
16KB |
D-Cache 32KB, 4 way (way 0/1/2/3) |
||||
2'b10 |
2'b01 |
I-Cache 48KB, 3 way (way 0/1/2) |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) |
32KB |
D-Cache 16KB, 2 way (way 0/1) |
TCM_DCache: 0x0008_4000 ~ 0x0008_5FFF (way 3) TCM_DCache: 0x0008_6000 ~ 0x0008_7FFF (way 2) |
|||
2'b01 |
2'b01 |
I-Cache 32KB, 2 way (way 0/1) |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) TCM_ICache: 0x0008_8000 ~ 0x0008_BFFF (way 2) |
48KB |
D-Cache 16KB, 2 way (way 0/1) |
TCM_DCache: 0x0008_4000 ~ 0x0008_5FFF (way 3) TCM_DCache: 0x0008_6000 ~ 0x0008_7FFF (way 2) |
|||
2'b00 |
2'b01 |
I-Cache 16KB, 1 way (way 0) |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) TCM_ICache: 0x0008_8000 ~ 0x0008_BFFF (way 2) TCM_ICache: 0x0008_C000 ~ 0x0008_FFFF (way 1) |
64KB |
D-Cache 16KB, 2 way (way 0/1) |
TCM_DCache: 0x0008_4000 ~ 0x0008_5FFF (way 3) TCM_DCache: 0x0008_6000 ~ 0x0008_7FFF (way 2) |
|||
2'b00 |
Cache disabled |
I-Cache 16KB, 1 way (way 0) |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) TCM_ICache: 0x0008_8000 ~ 0x0008_BFFF (way 2) TCM_ICache: 0x0008_C000 ~ 0x0008_FFFF (way 1) |
80KB |
D-Cache disabled |
TCM_DCache: 0x0008_4000 ~ 0x0008_5FFF (way 3) TCM_DCache: 0x0008_6000 ~ 0x0008_7FFF (way 2) TCM_DCache: 0x0009_0000 ~ 0x0009_1FFF (way 1) TCM_DCache: 0x0009_2000 ~ 0x0009_3FFF (way 0) |
|||
Cache disabled |
Cache disabled |
No cache |
TCM_ICache: 0x0008_0000 ~ 0x0008_3FFF (way 3) TCM_ICache: 0x0008_8000 ~ 0x0008_BFFF (way 2) TCM_ICache: 0x0008_C000 ~ 0x0008_FFFF (way 1) TCM_ICache: 0x0009_4000 ~ 0x0009_7FFF (way 0) |
96KB |
No cache |
TCM_DCache: 0x0008_4000 ~ 0x0008_5FFF (way 3) TCM_DCache: 0x0008_6000 ~ 0x0008_7FFF (way 2) TCM_DCache: 0x0009_0000 ~ 0x0009_1FFF (way 1) TCM_DCache: 0x0009_2000 ~ 0x0009_3FFF (way 0) |
KM4 TCM/Cache 共享内存设置流程
KM4 进入安全状态;
调用
ICache_Invalidate()和DCache_CleanInvalidate(0xFFFF_FFFF, 0xFFFF_FFFF),确保 Cache 中的脏数据已写回主存;调用
Cache_Enable(DISABLE)禁用非安全和安全 Cache;将
REG_HSYS_HPLAT_STATUS的HSYS_BIT_SHARE_CACHE_MEM位(0x41000034[12])设置为 1,以启用共享内存;根据应用需求,配置
ACTLR中的ICWRR_MODE和DCWRR_MODE以设置 Cache 使用的路数;将
ICWRR_BASE和DCWRR_BASE设置为 0x0000_0000,将ICWRR_TOP和DCWRR_TOP设置为 0xFFFF_0000(覆盖全部地址空间,使路限制的受限范围匹配所有地址,从而让退出 Cache 的路可被完整映射为 TCM);在
DTCM0_BASE和DTCM0_TOP中设置 TCM 内存映射范围;根据下表重新启用非安全和安全 Cache;
TCM 内存就绪,可供使用。
ICACHE_EN |
DCACHE_EN |
ICWRR_MODE |
DCWRR_MODE |
ICACHE (KB) |
DCACHE (KB) |
DTCM0 BASE |
DTCM0 TOP |
|---|---|---|---|---|---|---|---|
1 |
1 |
2'b11 |
2'b11 |
64 |
32 |
||
1 |
1 |
2'b10 |
2'b11 |
48 |
32 |
0x0008_0000 |
0x0008_3FFF |
1 |
1 |
2'b10 |
2'b01 |
48 |
16 |
0x0008_0000 |
0x0008_7FFF |
1 |
1 |
2'b01 |
2'b01 |
32 |
16 |
0x0008_0000 |
0x0008_BFFF |
1 |
1 |
2'b00 |
2'b01 |
16 |
16 |
0x0008_0000 |
0x0008_FFFF |
1 |
0 |
2'b00 |
16 |
0 |
0x0008_0000 |
0x0009_3FFF |
|
0 |
0 |
0 |
0 |
0x0008_0000 |
0x0009_7FFF |
Cache 可以被当成紧耦合内存(Tightly-Coupled Memory, TCM)来使用。TCM 是一种低延迟、高速度的静态存储器,物理上直接连接到 CPU,不经过总线矩阵或 Cache 控制器。因此 TCM 每次访问消耗的时钟周期都是固定的而且极低(通常为 0 等待周期),这使得 TCM 非常适合用于存放对实时性要求极高的关键代码和数据。
KM4TZ 和 KM4NS 各自配备了 32KB Cache(16KB I-Cache + 16KB D-Cache)。当 Cache 被整体禁用时,其底层空间全部转为 TCM 使用,并映射到固定地址。
TCM 地址映射:
KM4TZ:TCM 地址范围
0x000F_0000~0x000F_7FFF,仅可由 KM4TZ 访问。KM4NS:TCM 地址范围
0x000F_8000~0x000F_FFFF,可由 KM4TZ 和 KM4NS 访问。
备注
各 CPU 的 Cache 只能被 整体 配置为 TCM。
KM4TZ 的配置流程
进入 Secure 状态;
调用
ICache_Invalidate()和DCache_CleanInvalidate(0xFFFF_FFFF, 0xFFFF_FFFF),确保 Cache 中的脏数据已写回主存。调用
Cache_Enable(DISABLE)禁用非安全和安全 Cache;将
REG_LSYS_PLAT_STATUS的LSYS_BIT_KM4TZ_SHARE_CACHE_MEM位(0x4080A2A4[13])设置为 1,以启用共享内存。
KM4NS 的配置流程
调用
ICache_Invalidate()和DCache_CleanInvalidate(0xFFFF_FFFF, 0xFFFF_FFFF),确保 Cache 中的脏数据已写回主存;调用
Cache_Enable(DISABLE)禁用 Cache;将
REG_LSYS_PLAT_STATUS的LSYS_BIT_KM4NS_SHARE_CACHE_MEM位(0x4080A2A4[12])设置为 1,以启用共享内存。
寄存器
各芯片 CPU 的 Cache 相关寄存器映射及字段说明如下。
不支持。
KR4 I-Cache 和 D-Cache 在复位后默认开启。地址的可缓存性可以通过内存管理和缓存属性寄存器 (MCCA) 来确定。MCCA 不是标准的读写 CSR 寄存器,其在 CSR 的地址为 0x7C3。
MCCA
MCCA 仅在机器模式 (M-mode) 下可访问。
位 |
名称 |
访问 |
描述 |
|---|---|---|---|
[31:28] |
CCA7 |
R/W |
CCA_IDX 为 7 的内存属性编码,参考 CCA 编码说明。 |
[27:24] |
CCA6 |
R/W |
CCA_IDX 为 6 的内存属性编码,参考 CCA 编码说明。 |
[23:20] |
CCA5 |
R/W |
CCA_IDX 为 5 的内存属性编码,参考 CCA 编码说明。 |
[19:16] |
CCA4 |
R/W |
CCA_IDX 为 4 的内存属性编码,参考 CCA 编码说明。 |
[15:12] |
CCA3 |
R/W |
CCA_IDX 为 3 的内存属性编码,参考 CCA 编码说明。 |
[11:8] |
CCA2 |
R/W |
CCA_IDX 为 2 的内存属性编码,参考 CCA 编码说明。 |
[7:4] |
CCA1 |
R/W |
CCA_IDX 为 1 的内存属性编码,参考 CCA 编码说明。 |
[3:0] |
CCA0 |
R/W |
CCA_IDX 为 0 的内存属性编码,参考 CCA 编码说明。 |
CCA 编码说明如下表。
CCA 值 |
描述 |
|---|---|
0b0000 |
回写 (Write-back),写分配,读分配 |
0b0001 |
|
0b0010 |
直写 (Write-Through),读分配,无写分配 |
0b0011 |
|
0b1000 |
不可缓存 (Non-cacheable),不可合并 (Non-mergeable) |
0b1010 |
不可缓存,可合并 (Mergeable) |
SDK 中默认缓存属性值如下表。
物理内存地址范围 |
CCA |
复位值 |
Bootloader 设置值 |
|---|---|---|---|
0x0000_0000 ~ 0x1FFF_FFFF |
CCA0 |
0x01 |
0x02 |
0x2000_0000 ~ 0x3FFF_FFFF |
CCA1 |
0x01 |
0x01 |
0x4000_0000 ~ 0x5FFF_FFFF |
CCA2 |
0x01 |
0x08 |
0x6000_0000 ~ 0x7FFF_FFFF |
CCA3 |
0x01 |
0x01 |
0x8000_0000 ~ 0x9FFF_FFFF |
CCA4 |
0x01 |
0x08 |
0xA000_0000 ~ 0xBFFF_FFFF |
CCA5 |
0x08 |
0x08 |
0xC000_0000 ~ 0xDFFF_FFFF |
CCA6 |
0x01 |
0x08 |
0xE000_0000 ~ 0xFFFF_FFFF |
CCA7 |
0x08 |
0x08 |
KR4 没有定义设备内存属性,只能通过 MCCA 设置为“不可缓存、不可合并”属性。
读操作:从不可缓存、不可合并区域读取时,KR4 总是等待读取命令完成后再发出下一条命令(阻塞式读取)。
写操作:向不可缓存、不可合并区域写入时,只要总线接受了写入命令,KR4 即刻发出下一条命令,不等待写入命令实际完成(非阻塞式写入)。若连续发出两条写命令,总线互连只有在前一条写命令完成后才会接受后一条。
警告
KR4 内部会对针对不可缓存、不可合并区域的读写命令顺序进行检查:
如果读取操作与挂起的写入操作处于同一个 32 字节对齐空间内,KR4 将等待写入命令完成后再执行读取,从而保持读/写顺序。
如果读取操作 不在 同一个 32 字节对齐空间内,读取可能会在写入 之前 发生。用户需特别注意此行为。
KR4 I-Cache 和 D-Cache 在复位后默认开启。地址的可缓存性可以通过内存管理和缓存属性寄存器 (MCCA) 来确定。MCCA 不是标准的读写 CSR 寄存器,其在 CSR 的地址为 0x7C3。
MCCA
MCCA 仅在机器模式 (M-mode) 下可访问。
位 |
名称 |
访问 |
描述 |
|---|---|---|---|
[31:28] |
CCA7 |
R/W |
CCA_IDX 为 7 的内存属性编码,参考 CCA 编码说明。 |
[27:24] |
CCA6 |
R/W |
CCA_IDX 为 6 的内存属性编码,参考 CCA 编码说明。 |
[23:20] |
CCA5 |
R/W |
CCA_IDX 为 5 的内存属性编码,参考 CCA 编码说明。 |
[19:16] |
CCA4 |
R/W |
CCA_IDX 为 4 的内存属性编码,参考 CCA 编码说明。 |
[15:12] |
CCA3 |
R/W |
CCA_IDX 为 3 的内存属性编码,参考 CCA 编码说明。 |
[11:8] |
CCA2 |
R/W |
CCA_IDX 为 2 的内存属性编码,参考 CCA 编码说明。 |
[7:4] |
CCA1 |
R/W |
CCA_IDX 为 1 的内存属性编码,参考 CCA 编码说明。 |
[3:0] |
CCA0 |
R/W |
CCA_IDX 为 0 的内存属性编码,参考 CCA 编码说明。 |
CCA 编码说明如下表。
CCA 值 |
描述 |
|---|---|
0b0000 |
回写 (Write-back),写分配,读分配 |
0b0001 |
|
0b0010 |
直写 (Write-Through),读分配,无写分配 |
0b0011 |
|
0b1000 |
不可缓存 (Non-cacheable),不可合并 (Non-mergeable) |
0b1010 |
不可缓存,可合并 (Mergeable) |
SDK 中默认缓存属性值如下表。
物理内存地址范围 |
CCA |
复位值 |
Bootloader 设置值 |
|---|---|---|---|
0x0000_0000 ~ 0x1FFF_FFFF |
CCA0 |
0x01 |
0x02 |
0x2000_0000 ~ 0x3FFF_FFFF |
CCA1 |
0x01 |
0x01 |
0x4000_0000 ~ 0x5FFF_FFFF |
CCA2 |
0x01 |
0x08 |
0x6000_0000 ~ 0x7FFF_FFFF |
CCA3 |
0x01 |
0x01 |
0x8000_0000 ~ 0x9FFF_FFFF |
CCA4 |
0x01 |
0x08 |
0xA000_0000 ~ 0xBFFF_FFFF |
CCA5 |
0x08 |
0x08 |
0xC000_0000 ~ 0xDFFF_FFFF |
CCA6 |
0x01 |
0x08 |
0xE000_0000 ~ 0xFFFF_FFFF |
CCA7 |
0x08 |
0x08 |
KR4 没有定义设备内存属性,只能通过 MCCA 设置为“不可缓存、不可合并”属性。
读操作:从不可缓存、不可合并区域读取时,KR4 总是等待读取命令完成后再发出下一条命令(阻塞式读取)。
写操作:向不可缓存、不可合并区域写入时,只要总线接受了写入命令,KR4 即刻发出下一条命令,不等待写入命令实际完成(非阻塞式写入)。若连续发出两条写命令,总线互连只有在前一条写命令完成后才会接受后一条。
警告
KR4 内部会对针对不可缓存、不可合并区域的读写命令顺序进行检查:
如果读取操作与挂起的写入操作处于同一个 32 字节对齐空间内,KR4 将等待写入命令完成后再执行读取,从而保持读/写顺序。
如果读取操作 不在 同一个 32 字节对齐空间内,读取可能会在写入 之前 发生。用户需特别注意此行为。
KR4 I-Cache 和 D-Cache 在复位后默认开启。地址的可缓存性可以通过内存管理和缓存属性寄存器 (MCCA) 来确定。MCCA 不是标准的读写 CSR 寄存器,其在 CSR 的地址为 0x7C3。
MCCA
MCCA 仅在机器模式 (M-mode) 下可访问。
位 |
名称 |
访问 |
描述 |
|---|---|---|---|
[31:28] |
CCA7 |
R/W |
CCA_IDX 为 7 的内存属性编码,参考 CCA 编码说明。 |
[27:24] |
CCA6 |
R/W |
CCA_IDX 为 6 的内存属性编码,参考 CCA 编码说明。 |
[23:20] |
CCA5 |
R/W |
CCA_IDX 为 5 的内存属性编码,参考 CCA 编码说明。 |
[19:16] |
CCA4 |
R/W |
CCA_IDX 为 4 的内存属性编码,参考 CCA 编码说明。 |
[15:12] |
CCA3 |
R/W |
CCA_IDX 为 3 的内存属性编码,参考 CCA 编码说明。 |
[11:8] |
CCA2 |
R/W |
CCA_IDX 为 2 的内存属性编码,参考 CCA 编码说明。 |
[7:4] |
CCA1 |
R/W |
CCA_IDX 为 1 的内存属性编码,参考 CCA 编码说明。 |
[3:0] |
CCA0 |
R/W |
CCA_IDX 为 0 的内存属性编码,参考 CCA 编码说明。 |
CCA 编码说明如下表。
CCA 值 |
描述 |
|---|---|
0b0000 |
回写 (Write-back),写分配,读分配 |
0b0001 |
|
0b0010 |
直写 (Write-Through),读分配,无写分配 |
0b0011 |
|
0b1000 |
不可缓存 (Non-cacheable),不可合并 (Non-mergeable) |
0b1010 |
不可缓存,可合并 (Mergeable) |
SDK 中默认缓存属性值如下表。
物理内存地址范围 |
CCA |
复位值 |
Bootloader 设置值 |
|---|---|---|---|
0x0000_0000 ~ 0x1FFF_FFFF |
CCA0 |
0x01 |
0x02 |
0x2000_0000 ~ 0x3FFF_FFFF |
CCA1 |
0x01 |
0x01 |
0x4000_0000 ~ 0x5FFF_FFFF |
CCA2 |
0x01 |
0x08 |
0x6000_0000 ~ 0x7FFF_FFFF |
CCA3 |
0x01 |
0x01 |
0x8000_0000 ~ 0x9FFF_FFFF |
CCA4 |
0x01 |
0x08 |
0xA000_0000 ~ 0xBFFF_FFFF |
CCA5 |
0x08 |
0x08 |
0xC000_0000 ~ 0xDFFF_FFFF |
CCA6 |
0x01 |
0x08 |
0xE000_0000 ~ 0xFFFF_FFFF |
CCA7 |
0x08 |
0x08 |
KR4 没有定义设备内存属性,只能通过 MCCA 设置为“不可缓存、不可合并”属性。
读操作:从不可缓存、不可合并区域读取时,KR4 总是等待读取命令完成后再发出下一条命令(阻塞式读取)。
写操作:向不可缓存、不可合并区域写入时,只要总线接受了写入命令,KR4 即刻发出下一条命令,不等待写入命令实际完成(非阻塞式写入)。若连续发出两条写命令,总线互连只有在前一条写命令完成后才会接受后一条。
警告
KR4 内部会对针对不可缓存、不可合并区域的读写命令顺序进行检查:
如果读取操作与挂起的写入操作处于同一个 32 字节对齐空间内,KR4 将等待写入命令完成后再执行读取,从而保持读/写顺序。
如果读取操作 不在 同一个 32 字节对齐空间内,读取可能会在写入 之前 发生。用户需特别注意此行为。
KR4 I-Cache 和 D-Cache 在复位后默认开启。地址的可缓存性可以通过内存管理和缓存属性寄存器 (MCCA) 来确定。MCCA 不是标准的读写 CSR 寄存器,其在 CSR 的地址为 0x7C3。
MCCA
MCCA 仅在机器模式 (M-mode) 下可访问。
位 |
名称 |
访问 |
描述 |
|---|---|---|---|
[31:28] |
CCA7 |
R/W |
CCA_IDX 为 7 的内存属性编码,参考 CCA 编码说明。 |
[27:24] |
CCA6 |
R/W |
CCA_IDX 为 6 的内存属性编码,参考 CCA 编码说明。 |
[23:20] |
CCA5 |
R/W |
CCA_IDX 为 5 的内存属性编码,参考 CCA 编码说明。 |
[19:16] |
CCA4 |
R/W |
CCA_IDX 为 4 的内存属性编码,参考 CCA 编码说明。 |
[15:12] |
CCA3 |
R/W |
CCA_IDX 为 3 的内存属性编码,参考 CCA 编码说明。 |
[11:8] |
CCA2 |
R/W |
CCA_IDX 为 2 的内存属性编码,参考 CCA 编码说明。 |
[7:4] |
CCA1 |
R/W |
CCA_IDX 为 1 的内存属性编码,参考 CCA 编码说明。 |
[3:0] |
CCA0 |
R/W |
CCA_IDX 为 0 的内存属性编码,参考 CCA 编码说明。 |
CCA 编码说明如下表。
CCA 值 |
描述 |
|---|---|
0b0000 |
回写 (Write-back),写分配,读分配 |
0b0001 |
|
0b0010 |
直写 (Write-Through),读分配,无写分配 |
0b0011 |
|
0b1000 |
不可缓存 (Non-cacheable),不可合并 (Non-mergeable) |
0b1010 |
不可缓存,可合并 (Mergeable) |
SDK 中默认缓存属性值如下表。
物理内存地址范围 |
CCA |
复位值 |
Bootloader 设置值 |
|---|---|---|---|
0x0000_0000 ~ 0x1FFF_FFFF |
CCA0 |
0x01 |
0x02 |
0x2000_0000 ~ 0x3FFF_FFFF |
CCA1 |
0x01 |
0x01 |
0x4000_0000 ~ 0x5FFF_FFFF |
CCA2 |
0x01 |
0x08 |
0x6000_0000 ~ 0x7FFF_FFFF |
CCA3 |
0x01 |
0x01 |
0x8000_0000 ~ 0x9FFF_FFFF |
CCA4 |
0x01 |
0x08 |
0xA000_0000 ~ 0xBFFF_FFFF |
CCA5 |
0x08 |
0x08 |
0xC000_0000 ~ 0xDFFF_FFFF |
CCA6 |
0x01 |
0x08 |
0xE000_0000 ~ 0xFFFF_FFFF |
CCA7 |
0x08 |
0x08 |
KR4 没有定义设备内存属性,只能通过 MCCA 设置为“不可缓存、不可合并”属性。
读操作:从不可缓存、不可合并区域读取时,KR4 总是等待读取命令完成后再发出下一条命令(阻塞式读取)。
写操作:向不可缓存、不可合并区域写入时,只要总线接受了写入命令,KR4 即刻发出下一条命令,不等待写入命令实际完成(非阻塞式写入)。若连续发出两条写命令,总线互连只有在前一条写命令完成后才会接受后一条。
警告
KR4 内部会对针对不可缓存、不可合并区域的读写命令顺序进行检查:
如果读取操作与挂起的写入操作处于同一个 32 字节对齐空间内,KR4 将等待写入命令完成后再执行读取,从而保持读/写顺序。
如果读取操作 不在 同一个 32 字节对齐空间内,读取可能会在写入 之前 发生。用户需特别注意此行为。
下表提供了 KM4 缓存寄存器的内存映射。所有寄存器均按 32 位边界寻址。当任何寄存器的物理大小小于 32 位时,32 位边界的上层未使用位为保留位,写入这些位无效,读取这些位返回 0。
Name |
Address offset |
Description |
|---|---|---|
SCB_CLIDR |
0xE000_ED78 |
缓存层级 ID 寄存器 |
SCB_CTR |
0xE000_ED7C |
缓存类型寄存器 |
SCB_CCSIDR |
0xE000_ED80 |
缓存大小 ID 寄存器 |
SCB_CSSELR |
0xE000_ED84 |
缓存大小选择寄存器 |
SCB_ICIALLU |
0xE000_EF50 |
I-Cache 失效至 PoU(所有) |
SCB_ICIMVAU |
0xE000_EF58 |
I-Cache 按 MVA 失效至 PoU |
SCB_DCIMVAC |
0xE000_EF5C |
D-Cache 按 MVA 失效至 PoC |
SCB_DCISW |
0xE000_EF60 |
D-Cache 按组/路失效 |
SCB_DCCMVAU |
0xE000_EF64 |
D-Cache 按 MVA 清理至 PoU |
SCB_DCCMVAC |
0xE000_EF68 |
D-Cache 按 MVA 清理至 PoC |
SCB_DCCSW |
0xE000_EF6C |
D-Cache 按组/路清理 |
SCB_DCCIMVAC |
0xE000_EF70 |
D-Cache 按 MVA 清理并失效至 PoC |
SCB_DCCISW |
0xE000_EF74 |
D-Cache 按组/路清理并失效 |
ACTLR |
0xE000_E008 |
辅助控制寄存器 |
ICWRR_BASE |
0xE004_20A0 |
指令缓存路限制范围基地址寄存器 |
ICWRR_TOP |
0xE004_20A4 |
指令缓存路限制范围顶部地址寄存器 |
DCWRR_BASE |
0xE004_20A8 |
数据缓存路限制范围基地址寄存器 |
DCWRR_TOP |
0xE004_20AC |
数据缓存路限制范围顶部地址寄存器 |
DTCM0_BASE |
0xE004_2060 |
DTCM0 基地址 |
DTCM0_TOP |
0xE004_2064 |
DTCM0 顶部地址 |
SCB_CLIDR
SCB_CLIDR 特性如下:
目的: 识别实现的缓存类型以及缓存的一致性和统一性层级。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只读寄存器,位于 0xE000_ED78。
安全软件可以通过位于 0xE002_ED78 的 CLIDR_NS 访问此寄存器的非安全版本。
位置 0xE002_ED78 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
默认值: 0x4920_0003
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:30 |
ICB |
RO |
内部缓存边界。此字段指示内部域和外部域之间的边界。 该字段的可能值为:
|
29:27 |
LoUU |
RO |
统一单处理器层级。此字段指示缓存层次结构的统一单处理器层级。 |
26:24 |
LoC |
RO |
一致性层级。此字段指示缓存层次结构的一致性层级。 |
23:21 |
LoUIS |
RO |
统一内部共享层级。此字段指示缓存层次结构的统一共享层级。 |
3(m-1)+2:3(m-1) (m = 1 to 7) |
Ctypem |
RO |
缓存类型字段 m。指示在层级 m 实现的缓存类型。 该字段的可能值为:
所有其他值均为保留值。 |
SCB_CTR
SCB_CTR 特性如下:
目的: 提供有关缓存架构的信息。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只读寄存器,位于 0xE000_ED7C。
安全软件可以通过位于 0xE002_ED7C 的 CTR_NS 访问此寄存器的非安全版本。
位置 0xE002_ED7C 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间是 banked 的。
默认值: 0x8303_C003
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:29 |
Format |
RO |
缓存类型寄存器格式。指示是否提供缓存类型信息。 该字段的可能值为:
|
28 |
RSVD |
保留 |
|
27:24 |
CWG |
RO |
缓存回写粒度。由于缓存条目中的内存位置被修改而导致的缓存条目驱逐时,可以被覆盖的内存大小的最大值的字数的对数。 该字段的可能值为:
|
23:20 |
ERG |
RO |
独占保留粒度。加载独占和存储独占指令实现的保留粒度的最大大小的字数的对数。 该字段的可能值为:
|
19:16 |
DminLine |
RO |
数据缓存最小行长度。受 PE 控制的所有数据缓存和统一缓存中最小缓存行的字数(4 字节)的对数。 |
15:4 |
RSVD |
保留 |
|
3:0 |
IminLine |
RO |
指令缓存最小行长度。受 PE 控制的所有指令缓存中最小缓存行的字数的对数。 |
SCB_CCSIDR
CCSIDR 特性如下:
目的: CCSIDR 提供有关当前所选缓存的架构信息。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
如果 CSSELR 指向未实现的缓存,该寄存器的值是 UNKNOWN。
配置: 该寄存器始终被实现。
属性:
32 位只读寄存器,位于 0xE000_ED80。
安全软件可以通过位于 0xE002_ED80 的 CCSIDR_NS 访问此寄存器的非安全版本。
位置 0xE002_ED80 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间是 banked 的。
前言:
提供通过 CSSELR 当前选中的缓存的间接读取访问。这些寄存器中的参数 NumSets、Associativity 和 LineSize 定义了按组/路指令进行缓存维护所需的结构可见参数。它们不保证表示设计的实际微架构特性。您不能基于这些参数对实际缓存大小做出任何推断。
默认值:
KM0: D-Cache 0xF00F_E009, I-Cache 0xE01F_E009
KM4: D-Cache 0xF01F_E019, I-Cache 0xE03F_E019
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31 |
WT |
RO |
直写。指示当前选中的缓存层级是否支持直写。 该位的可能值为:
|
30 |
WB |
RO |
回写。指示当前选中的缓存层级是否支持回写。 该位的可能值为:
|
29 |
RA |
RO |
读分配。指示当前选中的缓存层级是否支持读分配。 该位的可能值为:
|
28 |
WA |
RO |
写分配。指示当前选中的缓存层级是否支持写分配。 该位的可能值为:
|
27:13 |
NumSets |
RO |
组数。指示当前选中的缓存中的组数减 1。因此,值为 0 表示缓存中有 1 组。组数不必是 2 的幂。 |
12:3 |
Associativity |
RO |
相联度。指示缓存相联度减 1。值为 0 表示相联度为 1。相联度不必是 2 的幂。 |
2:0 |
LineSize |
RO |
行大小。指示当前选中的缓存中每行字数的对数减 2。 |
SCB_CSSELR
SCB_CSSELR 特性如下:
目的: 通过指定所需的缓存层级和缓存类型(指令缓存或数据缓存)来选择当前缓存大小 ID 寄存器 CCSIDR。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位读写寄存器,位于 0xE000_ED84。
安全软件可以通过位于 0xE002_ED84 的 CSSELR_NS 访问此寄存器的非安全版本。
位置 0xE002_ED84 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间是 banked 的。
从 Armv8.1-M 开始,当 PE 不在调试状态时,调试器写入此寄存器是否被忽略是由具体实现定义的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:4 |
RSVD |
保留 |
|
3:1 |
Level |
R/W |
缓存层级。选择要识别的缓存层级。允许的值从 0b000 表示第 1 层缓存到 0b110 表示第 7 层缓存。 该字段的可能值为:
|
0 |
InD |
R/W |
指令非数据。选择要识别的是指令缓存还是数据缓存。 该位的可能值为:
|
SCB_ICIALLU
SCB_ICIALLU 特性如下:
目的: 使所有指令缓存失效至 PoU。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF50。
安全软件可以通过位于 0xE002_EF50 的 ICIALLU_NS 访问此寄存器的非安全版本。
位置 0xE002_EF50 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
IGNORED |
WO |
写入此字段的值被忽略。忽略。 |
SCB_ICIMVAU
SCB_ICIMVAU 特性如下:
目的: 按地址使指令缓存行失效至 PoU。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000EF58。
安全软件可以通过位于 0xE002_EF58 的 ICIMVAU_NS 访问此寄存器的非安全版本。位置 0xE002_EF58 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
ADDRESS |
WO |
地址。向此字段写入启动所写地址的维护操作。 |
SCB_DCIMVAC
DCIMVAC 特性如下:
目的: 按地址使数据或统一缓存行失效至 PoC。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF5C。
安全软件可以通过位于 0xE002_EF5C 的 DCIMVAC_NS 访问此寄存器的非安全版本。位置 0xE002_EF5C 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
ADDRESS |
WO |
地址。向此字段写入启动所写地址的维护操作。 |
SCB_DCISW
SCB_DCISW 特性如下:
目的: 按组/路使数据或统一缓存行失效。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF60。
安全软件可以通过位于 0xE002_EF60 的 DCISW_NS 访问此寄存器的非安全版本。
位置 0xE002_EF60 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:4 |
SetWay |
WO |
缓存组/路。包含两个字段:
位[L-1:4]是 RES0。A = Log2(相联度),L = Log2(行长度),B = (L + S),S = Log2(组数)。相联度、行长度(以字节为单位)和组数具有其通常的含义,并且是正在操作的缓存层级的值。 A 和 S 的值向上舍入到下一个整数。 |
3:1 |
Level |
WO |
缓存层级。要操作的缓存层级减 1。 例如,此字段为 0 表示在第 1 层缓存上操作,或为 1 表示在第 2 层缓存上操作。 |
0 |
RSVD |
保留 |
SCB_DCCMVAU
SCB_DCCMVAU 特性如下:
目的: 按地址清理数据或统一缓存行至 PoU。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF64。
安全软件可以通过位于 0xE002_EF64 的 DCCMVAU_NS 访问此寄存器的非安全版本。位置 0xE002_EF64 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
ADDRESS |
WO |
地址。向此字段写入启动所写地址的维护操作。 |
SCB_DCCMVAC
SCB_DCCMVAC 特性如下:
目的: 按地址清理数据或统一缓存行至 PoC。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF68。
安全软件可以通过位于 0xE002_EF68 的 DCCMVAC_NS 访问此寄存器的非安全版本。位置 0xE002_EF68 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
ADDRESS |
WO |
地址。向此字段写入启动所写地址的维护操作。 |
SCB_DCCSW
SCB_DCCSW 特性如下:
目的: 按组/路清理数据或统一缓存行。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF6C。
安全软件可以通过位于 0xE002_EF6C 的 DCCSW_NS 访问此寄存器的非安全版本。
位置 0xE002_EF6C 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:4 |
SetWay |
WO |
缓存组/路。包含两个字段:
位[L-1:4]是 RES0。A = Log2(相联度),L = Log2(行长度),B = (L + S),S = Log2(组数)。相联度、行长度(以字节为单位)和组数具有其通常的含义,并且是正在操作的缓存层级的值。 A 和 S 的值向上舍入到下一个整数。 |
3:1 |
Level |
WO |
缓存层级。要操作的缓存层级减 1。 例如,此字段为 0 表示在第 1 层缓存上操作,或为 1 表示在第 2 层缓存上操作。 |
0 |
RSVD |
保留 |
SCB_DCCIMVAC
SCB_DCCIMVAC 特性如下:
目的: 按地址清理并使数据或统一缓存行失效至 PoC。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF70。
安全软件可以通过位于 0xE002_EF70 的 DCCIMVAC_NS 访问此寄存器的非安全版本。位置 0xE002_EF70 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:0 |
ADDRESS |
WO |
地址。向此字段写入启动所写地址的维护操作。 |
SCB_DCCISW
SCB_DCCISW 特性如下:
目的: 按组/路清理并使数据或统一缓存行失效。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
从 Armv8.1-M 开始,当 DAUTHCTRL_S.UIDAPEN 或 DAUTHCTRL_NS.UIDAPEN 被设置时,该寄存器可以通过非特权 DAP 请求访问。
配置: 该寄存器始终被实现。
属性:
32 位只写寄存器,位于 0xE000_EF74。
安全软件可以通过位于 0xE002_EF74 的 DCCISW_NS 访问此寄存器的非安全版本。
位置 0xE002_EF74 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间不是 banked 的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:4 |
SetWay |
WO |
缓存组/路。包含两个字段:
位[L-1:4]是 RES0。A = Log2(相联度),L = Log2(行长度),B = (L + S),S = Log2(组数)。相联度、行长度(以字节为单位)和组数具有其通常的含义,并且是正在操作的缓存层级的值。 A 和 S 的值向上舍入到下一个整数。 |
3:1 |
Level |
WO |
缓存层级。要操作的缓存层级减 1。 例如,此字段为 0 表示在第 1 层缓存上操作,或为 1 表示在第 2 层缓存上操作。 |
0 |
RSVD |
保留 |
ACTLR
ACTLR 特性如下:
目的: 提供由具体实现定义的配置和控制选项。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
配置: 该寄存器始终被实现。
属性:
32 位读写寄存器,位于 0xE000_E008。
安全软件可以通过位于 0xE002_E008 的 ACTLR_NS 访问此寄存器的非安全版本。
位置 0xE002_E008 对非安全状态和调试器执行软件是 RES0。
该寄存器在安全状态之间是否是 banked 的是由具体实现定义的。
从 Armv8.1-M 开始,当 PE 不在调试状态时,调试器写入此寄存器是否被忽略是由具体实现定义的。
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31 |
RETMODE |
RO |
指示内核是否从保留模式复位。
复位值由保留模式中的输入引脚控制。 |
30:28 |
RSVD |
保留 |
|
27 |
DMASLACCEN |
R/W |
DMA 睡眠使能。
复位值为 0。如果 EXT_DMA==NO,则为 RAZ/WI |
26:22 |
RSVD |
保留 |
|
21:20 |
DCWRR_MODE[1:0] |
R/W |
数据缓存路限制操作模式。 复位值为 2'b11。如果 DCACHE==NONE,则为 RAZ/WI |
19 |
DTCMFILL1 |
WO |
向此位写入 1 触发内核填充其 DTCM1。写入 0 无效果。 |
18 |
RSVD |
保留 |
|
17 |
D2DTCM |
R/W |
指令从 DTCM 使能。复位值从 INITD2DTCM 引脚派生。 |
16 |
DTCMFILL0 |
WO |
向此位写入 1 触发内核填充其 DTCM。写入 0 无效果。 |
15:14 |
IPFMask[1:0] |
R/W |
指令预取数量。
|
13:12 |
ICWRR_MODE[1:0] |
R/W |
指令缓存路限制操作模式 复位值为 2'b11。如果 ICACHE==NONE,则为 RAZ/WI |
11 |
ITCMFILL1 |
WO |
向此位写入 1 触发内核填充其 ITCM1。写入 0 无效果。 |
10 |
RSVD |
保留 |
|
9 |
D2ITCM |
R/W |
数据加载存储到 ITCM 使能。复位值从 INITD2ITCM 引脚派生。 |
8 |
ITCMFILL0 |
WO |
向此位写入 1 触发内核填充其 ITCM。写入 0 无效果。 |
7 |
WBUF_UCMERGEEN |
R/W |
不可缓存请求的写缓冲器合并使能
复位值为 0。 |
6 |
RSVD |
保留 |
|
5 |
D2ITCMNC |
R/W |
数据加载存储请求命中 ITCM 被强制为不可缓存的。
复位值为 0。 |
4 |
D2ITCMWB |
R/W |
数据加载存储请求命中 ITCM 被强制为回写的。
复位值为 0。 |
3 |
WBUF_MERGEEN |
R/W |
写缓冲器合并使能。
复位值为 1。 |
2 |
WBUF_EN |
R/W |
写缓冲器使能。
复位值为 1。 |
1 |
LUB_EN |
R/W |
加载使用数据缓冲器使能。
复位值为 1。 |
0 |
NBL_EN |
R/W |
非阻塞加载使能。
复位值为 1。 |
当数据缓存为 4 路相联时:
DCWRR_MODE[1:0] |
数据在限制范围内 |
数据不在限制范围内 |
|---|---|---|
2'b00 |
使用路 0 |
使用路 1、路 2 和路 3 |
2'b01 |
使用路 0 和路 1 |
使用路 2 和路 3 |
2'b10 |
使用路 0、路 1 和路 2 |
使用路 3 |
2'b11 |
使用所有路 |
不使用任何路 |
当数据缓存为 2 路相联时:
DCWRR_MODE[1:0] |
数据在限制范围内 |
数据不在限制范围内 |
|---|---|---|
2'bz0 |
使用路 0 |
使用路 1 |
2'bz1 |
使用所有路 |
不使用任何路 |
当指令缓存为 4 路相联时:
ICWRR_MODE[1:0] |
数据在限制范围内 |
数据不在限制范围内 |
|---|---|---|
2'b00 |
使用路 0 |
使用路 1、路 2 和路 3 |
2'b01 |
使用路 0 和路 1 |
使用路 2 和路 3 |
2'b10 |
使用路 0、路 1 和路 2 |
使用路 3 |
2'b11 |
使用所有路 |
不使用任何路 |
当指令缓存为 2 路相联时:
ICWRR_MODE[1:0] |
数据在限制范围内 |
数据不在限制范围内 |
|---|---|---|
2'bz0 |
使用路 0 |
使用路 1 |
2'bz1 |
使用所有路 |
不使用任何路 |
ICWRR_BASE
ICWRR_BASE 特性如下:
存在: 提供指令缓存路限制范围基地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE00420A0。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0x0000_0000
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:16 |
RESTRICTED_RANGE_BASE |
R/W |
指示路限制范围基地址(65536 字节对齐)。 |
15:0 |
RSVD |
保留 |
ICWRR_TOP
ICWRR_TOP 特性如下:
存在: 提供指令缓存路限制范围顶部地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE004_20A4。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0xFFFF_0000
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:16 |
RESTRICTED_RANGE_TOP |
R/W |
指示路限制范围顶部地址(65536 字节对齐)。 |
15:0 |
RSVD |
保留 |
DCWRR_BASE
DCWRR_BASE 特性如下:
存在: 提供数据缓存路限制范围基地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE004_20A8。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0x0000_0000
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:16 |
RESTRICTED_RANGE_BASE |
R/W |
指示路限制范围基地址(65536 字节对齐)。 |
15:0 |
RSVD |
保留 |
DCWRR_TOP
DCWRR_TOP 特性如下:
存在: 提供数据缓存路限制范围顶部地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE004_20AC。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0xFFFF_0000
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:16 |
RESTRICTED_RANGE_TOP |
R/W |
指示路限制范围顶部地址(65536 字节对齐)。 |
15:0 |
RSVD |
保留 |
DTCM0_BASE
DTCM0_BASE 特性如下:
存在: 提供 DTCM0 范围基地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE004_2060。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0x0008_0000
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:17 |
DTCM0_BASE_RANGE |
R/W |
指示 DTCM0 范围基地址,按 1K 字节对齐。 |
16:0 |
RSVD |
RO |
保留 |
DTCM0_TOP
DTCM0_TOP 特性如下:
存在: 提供 DTCM0 范围顶部地址。
使用限制:
仅允许特权访问。非特权访问会产生错误。
该寄存器仅支持字访问。半字和字节访问是不可预测的。
属性:
32 位读写寄存器,位于 0xE004_2064。
该寄存器仅能从特权请求访问,如果存在安全扩展,从安全状态访问时为 RAZ/WI。
默认值: 0x0009_7FFF
Bit |
Symbol |
Access |
Description |
|---|---|---|---|
31:17 |
DTCM0_TOP_RANGE_HI |
RO |
DTCM0_TOP 寄存器的高位部分。值与 DTCM0_BASE[31:17]相同。 |
16:10 |
DTCM0_TOP_RANGE_ME |
R/W |
DTCM0_TOP 寄存器的中位部分。复位值是在配置表中的 DTCM0_TOP 寄存器的位[16:10]。 |
9:0 |
DTCM0_TOP_RANGE_LO |
RO |
DTCM0_TOP 寄存器的低位部分。值为 10'h3ff。 |
不支持。