错误处理与自定义故障注入指令
功能描述
CtrlUnit用于控制DCache的ECC错误注入。每一个核的L1DCache配置一个memory map的寄存器控制的控制器,每一个支持ECC的硬件单元设置一个Control Bank。通过MMIO访存指令读写CtrlUnit中的配置寄存器。寄存器配置完成之后,L1 DCache会对第一次读取DCache触发ecc错误(比如load指令或者MainPipe)。
特性 1:地址空间
- 地址空间0x38022000-0x3802207F,总共128字节空间,该空间为每个hart的局部空间。
特性 2:DCache Control Bank
- 如图\ref{fig:CtrlBank}所示,每一个 Control Bank 包含寄存器:ECCCTL、ECCEID、ECCMASK,每一个寄存器是 8 字节。
- ECCCTL(ECC Control):ECC 注入控制寄存器
-
ese(error signaling enable):表示注入有效,初始化为 0。当注入成功后,ese将拉低。
-
pst:支持注入信号。当pst=1时,ECCEID计数器减到0并且成功注入后,注入计时器会被恢复到上一次设置的ECCEID,重新注入;当pst==0时,只注入一次。
-
ede(error delay enable):表示counter有效,初始化为0。如果
-
ese==1并且ede==0,则error注入立即有效。
-
ese==1并且ede==1,则需要等到ECCEID递减到0之后,注入才有效。
-
-
cmp(component):表示注入对象,初始化为 0。
-
1’b0: 注入对象为tag
-
1’b1: 注入对象为data
-
-
bank:bank有效信号,初始化为0,bank中的位置位时,对应mask有效
-
ECCEID(ECC Error Inject Delay):ECC 注入延迟控制器。
-
当 ese==1并且ede==1时,开始递减,直至减为0。目前采用和核频率相同的时钟,也可以分频。由于ECC注入依赖DCache的访问,所以EID的时间和ECC错误触发的时间可能不一致。
-
ECCMASK(ECC Mask):ECC注入掩码寄存器。
- 0 表示不反转,1 表示翻转。tag注入只使用ECCMASK0中对应tag长度的位, 超出部分不起作用。
特性 3: Bus Error Unit控制器
- DCache的ECC错误将统一发送到Bus Error Unit控制器处理。Bus Error Unit控制器保存信息有:
| Field | 描述 | 初始值 | 地址 |
|---|---|---|---|
| cause | 错误事件的原因 | 0 | 0x38010000 |
| value | 错误事件的物理地址 | 未定义 | 0x38010008 |
| enable | 事件有效掩码 | 1 | 0x38010010 |
| global_interrupt | 全局中断使能掩码 | 0 | 0x38010018 |
| accrued | 累积事件掩码 | 0 | 0x38010020 |
| local_interrupt | Hart 本地中断启用掩码 | 0 | 0x38010028 |
-
地址空间
Bus Error Unit物理地址空间为:0x38010000 - 0x38010fff
-
支持错误类型
-
ICache Ecc Error
-
DCache Ecc Error
-
L2Cache Ecc Error
-
-
控制的中断
-
局部中断:只能报告给Bus Error Unit所在的Hart, 上报至后端,有后端负责中断处理,目前采用NMI_31中断。
-
全局中断:如果出现全局中断,Bus Error Unit将中断信息发送给PLIC,由PLIC负责上报中断。
-
特性 4:L1 DCache Ecc 错误处理流程
-
报告错误
-
Tag ECC 错误:只要某一路出现 ECC 错误,就判断出现了 ECC 错误。
Table: Tag ECC错误与Tag命中关系
Hit Error Tag Error N N N N Y Y (probably hit) Y N N Y Y(hit with error) Y Y Y(hit with no error) N 表中Tag Hit 和 Tag ECC Error 与判断结果之间的关系
-
Data ECC 错误:命中行如果出现 ECC 错误,则认为出现 ECC 错误,如果不命中则不处理。
-
如果指令访问触发 ECC 错误,则认为出现 Hardware error 并报告异常。
-
只要出发错误,都需要向 BEU 发送错误信息。 硬件检测到错误时,报送给 BEU,触发 NMI 外部中断
-
-
普通访存指令
-
对于普通的访存指令,例如 Load 指令,在执行时只会触发tag或者data的ECC 错误,并将错误 报送给 BEU,并且报告 Hardware Error(19)。
-
Probe/Snoop
-
对于 Probe/Snoop
-
如果出现 tag ecc error,不需要更改 cache 状态,并且需要向 l2 返回 corrupt=1 的 ProbeAck请求。
-
如果出现 data ecc error,按规则更改 cache 状态,如果需要返回数据,则需要向 l2 返回 corrupt=1 的 ProbeAckData请求。
-
-
Replace/Evict
-
对于 Replace/Evict,
-
如果出现 tag ecc error, 需要向l2返回corrupt=1的Release请求。
-
如果出现 data ecc error, 需要向 l2 返回 corrupt=1 的 ReleaseData请求。
-
-
Store to DCache
-
对于 Sbuffer 写入数据至 DCache
-
如果出现 tag ecc error,则根据 Repalce/Evict 流程释放 cacheline,并将数据写入 dcache 中,不向 l2 报送错误。
-
如果出现 data ecc error,则直接写入数据,不向 l2 报送错误
-
-
Atomics
-
对于 Atomic,报告异常,但是不向 l2 报送错误
-
多错误选择
-
如果同时出现多个错误,则优先级为ldu0 > ldu1 > ldu2 > MainPipe
\newpage
整体框图
接口时序
配置寄存器时序
-
可以通过tilelink接口读写配置寄存器,如图\ref{fig:DCache-Error-Config-Timing}, A通道传递写地址和数据。
-
配置地址为0x38022010的EccMask0寄存器,写入的数据为0xff;
-
配置地址为0x38022008的EccEid寄存器,写入的数据为0x4;
-
配置地址为0x38022000的EccCtl寄存器,写入的数据为0x5
Tag注入时序
-
如图\ref{fig:DCache-Error-TagInj-Timing}所示,当配置好寄存器(EccCtl, EccEid和EccMask0)之后,当计时器计时到0,开始注入:
-
tag注入接口io_pseudoError_0_valid拉高,
-
当注入成功后(即io_pseudoError_0_valid && io_pseudoError_0_ready == 1),EccCtl的ese位将清零,结束注入;
-
以MainPipe为例,s1_tag_error、s2_tag_error和s3_tag_error逐级拉高,最后通过io_error端口向BEU报告错误信息
\newpage
Data注入时序
-
如图\ref{fig:DCache-Error-DataInj-Timing}所示,当配置好寄存器(EccCtl, EccEid和EccMask2)之后,当计时器计时到0,开始注入:
-
tag注入接口io_pseudoError_1_valid拉高,
-
当注入成功后(即io_pseudoError_1_valid && io_pseudoError_1_ready == 1),EccCtl的ese位将清零,结束注入;
-
以MainPipe为例,s2_data_error和s3_data_error逐级拉高,最后通过io_error端口向BEU报告错误信息