系统复位控制器:POR、复位树、复位原因与看门狗/软件复位
更新时间:2026-09-19。前置:时钟树与复位网络、复位设计、复位域交叉 RDC。本文从 SoC 顶层视角讲复位控制器(reset controller / PRCM 一部分)怎么把多种复位源编排成一棵安全的复位树。
本文要回答的问题
- POR/BOR、外部复位、看门狗、软件复位有何区别,谁能复位谁?
- 复位为什么要「异步断言、同步释放」,复位树如何按顺序展开?
- 软件怎么知道上次为什么复位(reset reason)?
- 跨复位域、时钟未就绪时释放复位有哪些坑?
一、复位源
| 源 | 触发 | 范围/特点 |
|---|---|---|
| POR | 上电检测电源越过阈值 | 全片最基础,不可被屏蔽,含初始态 |
| BOR | 运行中电压跌落到阈值 | 保护,防止低压下乱写 |
| 外部复位 NRST/PIN | 板级按键/调试器 | 通常全片或系统级 |
| 看门狗 WDT | 软件超时未喂狗 | 死机恢复,见定时器看门狗概念 |
| 窗口看门狗/时钟丢失 | 时序异常 | 功能安全 |
| 软件复位 SWRST | 写复位控制寄存器 | 可分级:核/外设/子系统 |
| 低功耗退出复位 | 从 Standby/唤醒 | 部分逻辑重初始化 |
| 调试复位 | JTAG/SWD | 只复位核或系统可选 |
复位控制器把这些源做逻辑组合(多数是「异步置位/复位请求」+ 标志锁存),并定义层次:全局系统复位可复位一切;某外设的局部复位只复位该 IP 而不重启核(见 寄存器表里的 reset 控制)。
二、POR 与上电序列
POR 在电源未达安全工作区时强制全片复位(无时钟也要工作,故 POR 电路是模拟+异步逻辑)。完整上电:
bash
电源爬升 ─► POR 有效(异步,全程)
时钟/PLL 启动(见时钟控制器),等 LOCK
└─ 关键:时钟稳定前不释放逻辑复位
复位控制器按序释放:
先释放时钟/电源相关、再释放总线/存储、最后释放 CPU(从复位向量启动)如果在时钟稳定前释放同步逻辑复位,触发器可能在未知沿上启动、进入非法态。复位与时钟启动必须协同(常归同一个 PRCM/PMU 状态机,见 SoC 时钟控制器、低功耗模式)。
三、异步断言、同步释放(核心)
单个触发器推荐「异步复位、同步释放」,整片复位树还要分级释放避免恢复违例:
verilog
// 异步断言、同步释放(标准写法)
reg r1, r2;
always @(posedge clk or negedge async_reset_n)
if (!async_reset_n) begin r1 <= 1'b0; r2 <= 1'b0; end
else begin r1 <= 1'b1; r2 <= r1; end // 释放打两拍,避开恢复时间
wire rst_n_sync = r2;- 断言异步:复位立即生效,不依赖时钟(POR 时时钟可能不存在)。
- 释放同步:撤销复位时在目标时钟域打两拍,让所有 FF 在时钟沿安全退出,避免 recovery/removal 违例和亚稳态。
- 复位树:全局异步复位进来,先在每个时钟域做同步释放,再分发给该域;不同时钟域各有同步器(复位域交叉分析见 RDC)。复位树像时钟树一样要低偏斜、STA 收敛。
四、复位原因寄存器(reset reason / CSR)
每次复位源触发时,复位控制器应锁存原因位(POR/PIN/WDT/SW/BOR/唤醒…),且这些位本身由「只有 POR 才清零」的备份/常电逻辑保存:
- 复位后软件读 reset-reason 寄存器判断是冷上电、看门狗、还是软复位,决定走全量初始化还是快速恢复。
- 注意「读后写 0 清除」语义与 W1C 类似;不能被本次正在发生的系统复位立刻清掉,否则读不到原因。
- 常有独立的「原始复位状态」与「当前复位状态」两组。
五、看门狗与分级软件复位
- 看门狗复位:WDT 超时先可配成中断(早期警告),持续不喂则升级为系统复位;喂狗由可信代码定期进行,跑飞即恢复。窗口看门狗还限制「太早喂/太晚喂都算错」。
- 软复位分级:很多 SoC 提供 per-block reset(复位 UART/DMA 而不重启),驱动可在 IP 卡死时单独复位;但要保证复位某从机时不撕裂总线上的进行中事务(先停请求/总线空闲再复位,参考 总线超时)。
- 复位某外设也要复位其时钟域/状态,并在释放后重新初始化。
六、常见的坑
- 时钟未稳定就释放复位:上电最常见,CPU 从非法态启动。
- 复位直接异步释放:recovery/removal 违例、亚稳态,偶发启动失败。
- 跨时钟域共用一个复位同步:每个时钟域要有自己的同步释放,见 RDC。
- 复位树偏斜过大:同一域有些 FF 先退出,内部状态不一致;要做复位树时序。
- 复位原因被同步复位清掉:一启动原因位就没了,无法诊断;原因位应由 POR-only 逻辑保存。
- 看门狗在调试/初始化时误触发:下载/长初始化未暂停 WDT,被复位;需调试挂起/早期喂狗。
- 复位外设时总线有未完成事务:从机在 AXI 中途复位导致总线挂死;应先 quiesce。
- 复位范围配错:软复位本想只复位核却复位了含时钟/PLL 的部分,起不来。
- BOR 阈值/迟滞不当:电源抖动反复复位或低压不复位。
- 低功耗唤醒复位不完整:只复位核不复位保持域接口,状态对不上(见 低功耗)。
- POR 电路依赖数字时钟:POR 必须在无时钟下也能强制复位。
- 复位信号被 CDC 后当普通信号:复位域交叉漏分析,见 CDC/RDC 报告分诊。
相关与延伸
总结
系统复位控制器把 POR/BOR/外部脚/看门狗/软件/唤醒等复位源分级组合成一棵复位树,POR 在无时钟下异步强制全片、待 PLL 锁定后再按「时钟/总线/CPU」顺序释放;每个时钟域对复位采用「异步断言、同步释放」打两拍以避免 recovery/removal 违例,复位原因位由仅 POR 可清的常电逻辑锁存供软件诊断,看门狗可先中断后升级为复位、局部软复位须先停总线事务再复位 IP——时钟没稳就释放、异步释放、跨域共用同步和原因位被清掉是四大启动/诊断根因。