本文面向 AMD/Xilinx
XCKU5P-FFVB676-2-I与 Vivado 工程,承接 Part.17 的 CDC/RDC 内容,介绍 FPGA 上电、同步/异步复位、多时钟域复位、MMCM、MIG、GTY/JESD、Ethernet PHY 的启动顺序,以及复位对时序、布局和资源推断的影响。
前言:复位不是"接到所有寄存器上的清零线"
小工程经常这样写:
verilog
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
data_reg <= 0;
else
data_reg <= data_next;
end
当工程扩展到 RGMII、UDP、DDR4 MIG、AXI、GTY/JESD 后,一个全局复位直接连接所有模块会带来新的问题:
- 复位释放不满足 Recovery/Removal,状态机偶发跑飞;
- 同一异步复位在不同区域、不同寄存器处释放时间不同;
- MMCM 尚未锁定,下游逻辑已经运行;
- MIG 尚未校准,DMA 已经发起 AXI 请求;
- GTY PLL/Channel 尚未完成复位,JESD 状态机已经等待链路;
- FIFO 一侧已经退出复位,另一侧仍处于 Reset Busy;
- 复位网络扇出过大,降低时序和布局质量;
- 给所有数据寄存器加复位,导致 SRL、BRAM、DSP 内部寄存器无法正常推断。
所以,完整的复位系统需要回答五个问题:
- 复位从哪里来?
- 复位在哪个时钟域生效和释放?
- 每个模块是否真的需要复位?
- 各 IP 按什么顺序退出复位?
- 复位后如何确认系统已经进入可工作状态?
1. FPGA 工程中的复位来源
#mermaid-svg-N9cU9C2BDtZYBdb3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N9cU9C2BDtZYBdb3 .error-icon{fill:#552222;}#mermaid-svg-N9cU9C2BDtZYBdb3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N9cU9C2BDtZYBdb3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .marker.cross{stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N9cU9C2BDtZYBdb3 p{margin:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label text{fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label span{color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster-label span p{background-color:transparent;}#mermaid-svg-N9cU9C2BDtZYBdb3 .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 span{fill:#333;color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node rect,#mermaid-svg-N9cU9C2BDtZYBdb3 .node circle,#mermaid-svg-N9cU9C2BDtZYBdb3 .node ellipse,#mermaid-svg-N9cU9C2BDtZYBdb3 .node polygon,#mermaid-svg-N9cU9C2BDtZYBdb3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .rough-node .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label text,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .rough-node .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label,#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label{text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node.clickable{cursor:pointer;}#mermaid-svg-N9cU9C2BDtZYBdb3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .arrowheadPath{fill:#333333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster text{fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 .cluster span{color:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N9cU9C2BDtZYBdb3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N9cU9C2BDtZYBdb3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape p,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N9cU9C2BDtZYBdb3 .icon-shape .label rect,#mermaid-svg-N9cU9C2BDtZYBdb3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N9cU9C2BDtZYBdb3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N9cU9C2BDtZYBdb3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N9cU9C2BDtZYBdb3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复位来源
上电 POR / 配置完成
板级复位按键/监控芯片
MMCM/PLL Lock 丢失
AXI-Lite 软件复位
看门狗/超时恢复
PHY、MIG、GT/JESD 故障恢复
这些复位语义不同:
| 来源 | 典型范围 | 注意事项 |
|---|---|---|
| POR/外部复位 | 整个用户系统 | 必须去毛刺并在各域同步释放 |
| MMCM/PLL Lock | 对应时钟域 | Lock 需要稳定若干周期后才能使用 |
| 软件复位 | 某模块或数据通路 | 不应无条件复位时钟、AXI-Lite 本身 |
| 看门狗 | 故障模块或系统 | 需要记录复位原因 |
| MIG 校准失败 | DDR 数据通路 | 重新初始化流程由 MIG 规范决定 |
| GT/JESD 失锁 | 串行链路 | 应区分 PLL、Channel、协议层复位 |
| PHY Reset | 外部芯片 | 满足脉宽、时钟与 MDIO 初始化要求 |
工程中建议维护 reset_reason 寄存器,记录 POR、软件、看门狗、链路和时钟故障原因。
2. 同步复位与异步复位
2.1 同步复位
verilog
always @(posedge clk) begin
if (rst)
state <= IDLE;
else
state <= state_next;
end
只有时钟有效边沿到来时复位才生效。
优点:
- 置位和释放都由当前时钟采样;
- 更容易进行常规时序分析;
- 有利于控制集重映射和高密度布局;
- 更容易映射到 DSP、BRAM 等硬核内部寄存器。
缺点:
- 时钟停止时可能无法复位;
- 复位脉冲必须足够长,确保被时钟采到;
- 高扇出同步复位本身仍需满足 Setup/Hold。
2.2 异步复位
verilog
always @(posedge clk or negedge arst_n) begin
if (!arst_n)
state <= IDLE;
else
state <= state_next;
end
复位不依赖时钟即可立即生效。
优点:时钟未运行时仍可将关键寄存器置于安全状态。
缺点:释放时存在 Recovery/Removal 风险;过多异步复位会增加控制集、限制打包和资源推断。
2.3 推荐原则
不是"同步一定优于异步"或"所有模块必须异步复位",而是:
- 安全输出、同步链和必须在无时钟时复位的寄存器可异步置位;
- 普通控制状态机优先考虑同步复位;
- 大量数据流水寄存器通常不需要逐个复位;
- 外部异步复位进入每个时钟域时采用"异步置位、同步释放"。
3. Recovery 与 Removal
异步复位释放同样需要避开时钟边沿:
Clock Async Reset Clock Async Reset #mermaid-svg-2qpzY8lMGWTMMdwR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2qpzY8lMGWTMMdwR .error-icon{fill:#552222;}#mermaid-svg-2qpzY8lMGWTMMdwR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2qpzY8lMGWTMMdwR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2qpzY8lMGWTMMdwR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2qpzY8lMGWTMMdwR .marker.cross{stroke:#333333;}#mermaid-svg-2qpzY8lMGWTMMdwR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2qpzY8lMGWTMMdwR p{margin:0;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2qpzY8lMGWTMMdwR .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .sequenceNumber{fill:white;}#mermaid-svg-2qpzY8lMGWTMMdwR #sequencenumber{fill:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-2qpzY8lMGWTMMdwR .messageText{fill:#333;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR .labelText,#mermaid-svg-2qpzY8lMGWTMMdwR .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .loopText,#mermaid-svg-2qpzY8lMGWTMMdwR .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2qpzY8lMGWTMMdwR .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-2qpzY8lMGWTMMdwR .noteText,#mermaid-svg-2qpzY8lMGWTMMdwR .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2qpzY8lMGWTMMdwR .actorPopupMenu{position:absolute;}#mermaid-svg-2qpzY8lMGWTMMdwR .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2qpzY8lMGWTMMdwR .actor-man circle,#mermaid-svg-2qpzY8lMGWTMMdwR line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-2qpzY8lMGWTMMdwR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 释放若靠近时钟边沿 寄存器可能进入亚稳态或分批退出复位 复位有效 复位释放 采样边沿
- Recovery 类似异步控制相对时钟的 Setup 要求;
- Removal 类似异步控制相对时钟的 Hold 要求。
直接把板级 reset_n 扇出到所有寄存器,无法保证整个芯片同时、安全地退出复位。
4. 异步置位、同步释放
4.1 低有效复位同步器
verilog
module reset_sync_n #(
parameter integer STAGES = 3
)(
input wire clk,
input wire arst_n,
output wire srst_n
);
(* ASYNC_REG = "TRUE" *)
reg [STAGES-1:0] rst_pipe;
always @(posedge clk or negedge arst_n) begin
if (!arst_n)
rst_pipe <= {STAGES{1'b0}};
else
rst_pipe <= {rst_pipe[STAGES-2:0], 1'b1};
end
assign srst_n = rst_pipe[STAGES-1];
endmodule
行为:
arst_n=0时,输出立即为 0;arst_n=1后,输出经过若干个clk周期才变为 1;- 不同时钟域必须各自实例化一个同步器。
4.2 XPM 方案
UltraScale+ 可使用:
XPM_CDC_ASYNC_RST:异步置位、同步释放;XPM_CDC_SYNC_RST:置位和释放都同步于目的时钟。
verilog
xpm_cdc_async_rst #(
.DEST_SYNC_FF (3),
.INIT_SYNC_FF (0),
.RST_ACTIVE_HIGH (0)
) u_rst_sync (
.src_arst (board_rst_n),
.dest_clk (user_clk),
.dest_arst (user_rst_n)
);
正式工程请从当前 Vivado Language Templates 复制与版本对应的模板。
5. 多时钟域复位树
#mermaid-svg-YQnZWl1F4d9Iv8AK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YQnZWl1F4d9Iv8AK .error-icon{fill:#552222;}#mermaid-svg-YQnZWl1F4d9Iv8AK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YQnZWl1F4d9Iv8AK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .marker.cross{stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YQnZWl1F4d9Iv8AK p{margin:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label text{fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label span{color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster-label span p{background-color:transparent;}#mermaid-svg-YQnZWl1F4d9Iv8AK .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK span{fill:#333;color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node rect,#mermaid-svg-YQnZWl1F4d9Iv8AK .node circle,#mermaid-svg-YQnZWl1F4d9Iv8AK .node ellipse,#mermaid-svg-YQnZWl1F4d9Iv8AK .node polygon,#mermaid-svg-YQnZWl1F4d9Iv8AK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .rough-node .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label text,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label{text-anchor:middle;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .rough-node .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label,#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label{text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node.clickable{cursor:pointer;}#mermaid-svg-YQnZWl1F4d9Iv8AK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .arrowheadPath{fill:#333333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster text{fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK .cluster span{color:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YQnZWl1F4d9Iv8AK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YQnZWl1F4d9Iv8AK rect.text{fill:none;stroke-width:0;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape p,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YQnZWl1F4d9Iv8AK .icon-shape .label rect,#mermaid-svg-YQnZWl1F4d9Iv8AK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YQnZWl1F4d9Iv8AK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YQnZWl1F4d9Iv8AK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YQnZWl1F4d9Iv8AK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 板级复位/POR
去毛刺与复位控制器
100 MHz 域同步器
RGMII RX 域同步器
UDP/DMA 域同步器
MIG UI 域同步器
GTY/JESD 域同步器
错误做法是先在 100 MHz 域同步一次,再把这个输出直接当成 125 MHz、300 MHz、GT User Clock 域的同步复位。它对其他时钟域仍是异步信号。
推荐命名:
text
arst_global_n 原始异步复位
rst_sys_100m_n 100 MHz 域同步复位
rst_rgmii_rx_n RGMII RX 域同步复位
rst_udp_n UDP 用户域同步复位
rst_mig_ui_n MIG UI 域同步复位
rst_gty_rx_n GTY RX User Clock 域同步复位
6. 不是所有寄存器都需要复位
AMD UltraFast 方法学建议逐个同步块判断是否真的需要复位。减少复位可以:
- 降低复位网络扇出;
- 减少路由拥塞;
- 降低控制集数量;
- 改善寄存器打包和最高频率;
- 允许 SRL、BRAM、URAM、DSP 内部流水寄存器被正确使用;
- 降低动态功耗。
6.1 必须复位的典型对象
- 协议状态机状态;
valid、ready状态与事务占用标志;- 外部输出使能和安全控制;
- FIFO 指针/标志;
- 错误 Sticky Flag;
- 影响软件可见行为的控制寄存器。
6.2 通常可以不复位的对象
- 在
valid=0时没有意义的数据寄存器; - 纯数据流水线;
- 后续一定会被完整覆盖的缓存数据;
- 乘加器中由有效信号保护的数据寄存器。
verilog
always @(posedge clk) begin
if (rst) begin
out_valid <= 1'b0;
end else begin
out_valid <= next_valid;
end
// 数据本身不复位,由 out_valid 决定是否有效
if (load_data)
out_data <= next_data;
end
7. 控制集为什么重要?
控制集由寄存器使用的 Clock、Clock Enable 和 Set/Reset 组合构成。复位极性、同步/异步类型或使能不同,都会形成不同控制集。
text
同一个 clk + rst + ce 组合 -> 一个控制集
不同 rst/ce 组合 -> 新控制集
控制集过多会导致本可放在同一 Slice 的寄存器无法打包,造成:
- 利用率看起来不高却出现拥塞;
- 布线距离增加;
- Setup 时序恶化;
- 功耗增加。
编码时应让 Reset 优先于 Clock Enable:
verilog
always @(posedge clk) begin
if (rst)
q <= 1'b0;
else if (ce)
q <= d;
end
若把 CE 写在 Reset 前面,可能迫使工具把复位功能映射到数据路径并增加逻辑。
8. 高扇出复位网络
全局复位可能驱动数万寄存器。常见问题:
- 源端经过组合逻辑产生毛刺;
- 一条复位网跨越多个 Clock Region;
- 高扇出导致布线延时和拥塞;
- 复位路径影响关键数据路径布局。
推荐方法:
- 减少不必要的复位寄存器;
- 每个时钟域独立同步;
- 在层级边界生成本地同步复位;
- 让 Vivado 做高扇出优化和驱动复制;
- 不要手工把异步复位用 LUT 随意分支;
- 用
report_high_fanout_nets和 Device 视图检查。
9. 上电启动控制器
复杂系统不能只依赖一个计数器延时固定时间。应根据实际就绪信号分阶段启动。
#mermaid-svg-Xrpn3v3PEiCRCZoS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Xrpn3v3PEiCRCZoS .error-icon{fill:#552222;}#mermaid-svg-Xrpn3v3PEiCRCZoS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xrpn3v3PEiCRCZoS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .marker.cross{stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xrpn3v3PEiCRCZoS p{margin:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Xrpn3v3PEiCRCZoS g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-Xrpn3v3PEiCRCZoS .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Xrpn3v3PEiCRCZoS .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xrpn3v3PEiCRCZoS .edgeLabel .label text{fill:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .label div .edgeLabel{color:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS #statediagram-barbEnd{fill:#333333;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .cluster-label,#mermaid-svg-Xrpn3v3PEiCRCZoS .nodeLabel{color:#131300;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .note-edge{stroke-dasharray:5;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note text{fill:black;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram-note .nodeLabel{color:black;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagram .edgeLabel{color:red;}#mermaid-svg-Xrpn3v3PEiCRCZoS #dependencyStart,#mermaid-svg-Xrpn3v3PEiCRCZoS #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-Xrpn3v3PEiCRCZoS .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Xrpn3v3PEiCRCZoS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外部复位释放
MMCM/PLL locked
Lock 连续稳定
释放 MIG/基础设施
init_calib_complete
PHY/GT/JESD ready
严重故障/看门狗
HOLD_ALL
WAIT_CLK_LOCK
WAIT_STABLE
RELEASE_INFRA
WAIT_DDR
WAIT_LINK
RELEASE_USER
RUN
9.1 Lock 要滤波
MMCM locked 刚置位时,不建议立即释放整个系统。可以要求连续若干周期为 1:
verilog
reg [7:0] lock_filter;
always @(posedge mgmt_clk or negedge board_rst_n) begin
if (!board_rst_n)
lock_filter <= 8'h00;
else
lock_filter <= {lock_filter[6:0], mmcm_locked};
end
wire clk_stable = &lock_filter;
9.2 不要在时钟停止域里等待自己的时钟
启动控制器应运行在始终可用的管理时钟域,例如板上稳定的 100 MHz 时钟。若目标时钟尚未建立,目标域无法自己执行状态机退出复位。
10. 当前 KU5P 工程的推荐启动顺序
#mermaid-svg-DIdRVm1btkfMhTMd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DIdRVm1btkfMhTMd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DIdRVm1btkfMhTMd .error-icon{fill:#552222;}#mermaid-svg-DIdRVm1btkfMhTMd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DIdRVm1btkfMhTMd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DIdRVm1btkfMhTMd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .marker.cross{stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DIdRVm1btkfMhTMd p{margin:0;}#mermaid-svg-DIdRVm1btkfMhTMd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label text{fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label span{color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster-label span p{background-color:transparent;}#mermaid-svg-DIdRVm1btkfMhTMd .label text,#mermaid-svg-DIdRVm1btkfMhTMd span{fill:#333;color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .node rect,#mermaid-svg-DIdRVm1btkfMhTMd .node circle,#mermaid-svg-DIdRVm1btkfMhTMd .node ellipse,#mermaid-svg-DIdRVm1btkfMhTMd .node polygon,#mermaid-svg-DIdRVm1btkfMhTMd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .rough-node .label text,#mermaid-svg-DIdRVm1btkfMhTMd .node .label text,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label,#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label{text-anchor:middle;}#mermaid-svg-DIdRVm1btkfMhTMd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .rough-node .label,#mermaid-svg-DIdRVm1btkfMhTMd .node .label,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label,#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label{text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .node.clickable{cursor:pointer;}#mermaid-svg-DIdRVm1btkfMhTMd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .arrowheadPath{fill:#333333;}#mermaid-svg-DIdRVm1btkfMhTMd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DIdRVm1btkfMhTMd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DIdRVm1btkfMhTMd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster text{fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd .cluster span{color:#333;}#mermaid-svg-DIdRVm1btkfMhTMd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DIdRVm1btkfMhTMd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DIdRVm1btkfMhTMd rect.text{fill:none;stroke-width:0;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape p,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DIdRVm1btkfMhTMd .icon-shape .label rect,#mermaid-svg-DIdRVm1btkfMhTMd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DIdRVm1btkfMhTMd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DIdRVm1btkfMhTMd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DIdRVm1btkfMhTMd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FPGA 配置完成 + 板级复位释放
100 MHz 管理时钟稳定
MMCM/PLL Lock 稳定
释放 AXI-Lite 与状态寄存器
释放 MIG 并等待校准
init_calib_complete=1
配置/释放 Ethernet PHY
启动 GTY/JESD 初始化
RGMII Link Up
GT reset done + JESD Link Up
释放 UDP/DMA 业务
建议区分:
infra_reset:时钟、互连、寄存器基础设施;ddr_reset:MIG/DDR 数据通路;eth_reset:MAC/UDP/PHY 管理;jesd_reset:GTY、PHY、JESD Core;dma_soft_reset:只清空 DMA/FIFO 和统计,不重启整个系统。
11. MIG DDR4 复位注意事项
MIG 常见信号包括系统复位、UI Clock、UI Clock Sync Reset 和 init_calib_complete。具体极性和时序以生成 IP 的端口说明为准。
工程原则:
- MIG 输入时钟必须先稳定;
- 不要把
init_calib_complete当作异步信号直接用于其他域; - 业务 AXI Master 必须等校准完成且 AXI 域复位释放;
- AXI Clock Converter 两侧复位应符合其时钟域要求;
- 运行中重新复位 MIG 会破坏 DDR 中已有数据;
- 软件程序位于 DDR 时,不能在运行过程中随意复位 MIG。
verilog
wire ddr_ready_sync;
xpm_cdc_single #(
.DEST_SYNC_FF(2),
.SRC_INPUT_REG(1)
) u_sync_ddr_ready (
.src_clk (mig_ui_clk),
.src_in (init_calib_complete),
.dest_clk (dma_clk),
.dest_out (ddr_ready_sync)
);
12. GTY/JESD 复位注意事项
GTY 复位不是一根 reset 线能够描述的,通常涉及:
- 参考时钟稳定;
- QPLL/CPLL Lock;
- TX/RX Channel Reset;
- TX/RX Reset Done;
- User Clock Active;
- Buffer/Alignment;
- JESD CGS、ILAS、Data 阶段;
- SYSREF/LMFC 同步。
优先使用 GT Wizard/JESD IP 生成的初始化状态机。用户逻辑应在规定的 reset_done、userclk_active 和协议 Link Up 条件满足后再开放数据。
若链路掉线,先判断应该:
- 只重启 JESD 协议层;
- 重启 RX/TX Channel;
- 重启 PLL;
- 还是重新配置外部 ADC/DAC。
复位范围越大,恢复时间越长,影响也越大。
13. Ethernet PHY 与 RGMII 复位
YT8531DC-CA 等外部 PHY 的硬件复位需要满足数据手册规定的:
- 复位有效脉宽;
- 电源稳定到复位释放的延时;
- 参考时钟稳定时间;
- Strap 管脚采样时刻;
- 复位后 MDIO 可访问时间。
推荐流程:
text
电源稳定 -> PHY参考时钟稳定 -> 保持RESET_N
-> 释放RESET_N -> 等待PHY启动 -> MDIO配置
-> 等待Link Up -> 释放UDP业务
RGMII RX 域使用 PHY 输出的 RXC,因此 MAC RX 复位必须在 rgmii_rxc 域同步释放。不能只使用系统 100 MHz 域的同步复位。
14. FIFO 与 AXI 复位
异步 FIFO 两侧有独立时钟。复位时需要:
- 写域停止写入;
- 读域停止读取;
- 按 IP 要求保持复位脉宽;
- 等待
wr_rst_busy/rd_rst_busy结束; - 清除半帧状态和 AXIS
TVALID; - 再开放上下游流量。
AXI Interconnect、SmartConnect 和 Clock Converter 的复位通常为低有效 aresetn,并要求相对于各自 aclk 同步释放。
模块复位时,如果上游仍保持 VALID、下游仍等待响应,可能造成永久挂起。软复位必须定义清楚:
- 未完成事务是等待结束、丢弃还是返回错误;
- FIFO 中已有数据是否保留;
- AXI Burst 能否在中途取消。
15. 软件复位寄存器怎么设计?
软件复位不建议让 CPU 写 1 后永久保持,而应转换为受控请求:
Target Module Reset Controller AXI-Lite/CPU Target Module Reset Controller AXI-Lite/CPU #mermaid-svg-onb3jN2nE5n9Nkzh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-onb3jN2nE5n9Nkzh .error-icon{fill:#552222;}#mermaid-svg-onb3jN2nE5n9Nkzh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-onb3jN2nE5n9Nkzh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-onb3jN2nE5n9Nkzh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-onb3jN2nE5n9Nkzh .marker.cross{stroke:#333333;}#mermaid-svg-onb3jN2nE5n9Nkzh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-onb3jN2nE5n9Nkzh p{margin:0;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-onb3jN2nE5n9Nkzh .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .sequenceNumber{fill:white;}#mermaid-svg-onb3jN2nE5n9Nkzh #sequencenumber{fill:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-onb3jN2nE5n9Nkzh .messageText{fill:#333;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh .labelText,#mermaid-svg-onb3jN2nE5n9Nkzh .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .loopText,#mermaid-svg-onb3jN2nE5n9Nkzh .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-onb3jN2nE5n9Nkzh .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-onb3jN2nE5n9Nkzh .noteText,#mermaid-svg-onb3jN2nE5n9Nkzh .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-onb3jN2nE5n9Nkzh .actorPopupMenu{position:absolute;}#mermaid-svg-onb3jN2nE5n9Nkzh .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-onb3jN2nE5n9Nkzh .actor-man circle,#mermaid-svg-onb3jN2nE5n9Nkzh line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-onb3jN2nE5n9Nkzh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 写 soft_reset_req 停止接收新事务 idle/flush_done 复位保持 N 个目标时钟周期 同步释放复位 init_done reset_done + reason
推荐寄存器:
| 寄存器 | 功能 |
|---|---|
RESET_REQ |
写 1 发起指定模块复位 |
RESET_STATUS |
当前处于哪个复位阶段 |
RESET_REASON |
最近一次复位原因 |
RESET_COUNT |
模块累计复位次数 |
READY_STATUS |
时钟、MIG、PHY、GT/JESD 就绪位 |
TIMEOUT_STATUS |
哪个阶段发生超时 |
16. 复位约束与 Vivado 报告
外部异步复位本身不是普通数据输入,不应随意添加虚假的 Input Delay。重点是让同步释放结构被工具识别,并检查 Recovery/Removal。
常用命令:
tcl
report_cdc
report_clock_interaction
report_timing -delay_type min_max
report_high_fanout_nets
report_control_sets
report_methodology
check_timing -verbose
对于标准异步复位同步器,例外范围必须精确。不要这样做:
tcl
# 错误示例:可能隐藏整个设计的恢复/移除问题
set_false_path -from [get_ports board_rst_n]
应优先使用 XPM/标准同步结构及 IP 自带约束;若必须添加例外,只作用于同步链第一级的异步控制路径,并验证对象匹配数量。
17. 仿真方法
复位 Testbench 不应只在仿真开始时拉低一次。
需要覆盖:
- 上电时钟尚未稳定;
- 复位释放靠近时钟边沿;
- MMCM Lock 抖动;
- MIG 校准成功和超时;
- PHY/GT Link Up 延迟;
- 业务运行中软复位;
- AXIS 背压和半帧状态下复位;
- 多个复位原因同时出现;
- 目标时钟暂停后恢复。
关键断言:
text
未 ready 时不能发起 AXI/AXIS 业务
复位期间所有 valid 必须为 0
状态机退出复位后必须从合法状态开始
FIFO reset busy 期间不得读写
reset_done 必须在所有依赖 ready 后产生
每个请求必须得到 done 或 timeout
18. 上板调试
建议用 ILA 观察:
text
board_reset
mmcm_locked / lock_stable
mig_ui_rst / init_calib_complete
phy_reset_n / link_up
gty_pll_lock / txresetdone / rxresetdone
jesd_link_up
各时钟域 reset_n
system_ready
reset_state / timeout_counter / reset_reason
不要只看 system_ready=1,还要保留每个阶段的进入时间和超时标志。若某状态只出现几个周期,使用 Sticky Flag 记录,避免 ILA 没有恰好触发。
19. 常见错误
错误 1:全工程共用一根异步复位
释放时可能在不同寄存器处产生不一致。应按时钟域同步释放。
错误 2:所有寄存器都清零
会增加扇出、控制集和拥塞,还可能阻止 SRL、BRAM、DSP 推断。只复位控制状态和有效标志。
错误 3:MMCM Lock 一拉高就立即启动
Lock 可能短暂变化。应滤波并按顺序释放下游。
错误 4:把 init_calib_complete 直接用于其他时钟域
这是 CDC。应同步后再使用。
错误 5:复位 AXI Slave,却不处理未完成事务
Master 可能永远等待响应。软复位前需要 quiesce/flush 协议。
错误 6:FIFO 一侧先运行
另一侧仍 Reset Busy 时可能出现错误标志或数据丢失。两侧均 ready 后再开放业务。
错误 7:用组合逻辑产生异步复位
多个条件的组合毛刺可能产生窄复位脉冲。复位原因应先在管理域锁存,再由控制器输出。
错误 8:复位整个系统解决局部错误
会扩大故障影响。应设计分层复位和可恢复边界。
20. 工程检查清单
- 所有时钟域均有独立复位同步器;
- 异步复位均同步释放;
- 复位同步寄存器设置
ASYNC_REG; - 管理状态机运行在始终可用时钟域;
- MMCM/PLL Lock 经过稳定判定;
- MIG 校准完成后才开放 DDR 访问;
- PHY 满足硬件复位和 Strap 采样要求;
- GTY/JESD 使用官方复位状态机;
- FIFO Reset Busy 结束后才允许读写;
- 数据流水寄存器没有无意义复位;
- 控制集数量与高扇出网络已检查;
- 软件复位不会截断未完成 AXI 事务;
- 复位原因、次数和超时可通过 AXI-Lite 回读;
- 仿真覆盖运行中复位和异常恢复;
- ILA 能观察各阶段 Ready/Reset 状态。
21. 总结
可靠复位系统的核心原则是:
- 异步复位可以立即置位,但必须在每个时钟域同步释放;
- 只复位真正需要确定初值的控制状态,不要默认清零所有数据寄存器;
- 复位是一套启动协议,不只是一根信号;
- MMCM、MIG、PHY、GTY/JESD 和业务逻辑必须按依赖关系启动;
- 软复位需要先停止新事务,再清理状态,最后重新开放业务;
- 复位网络也会影响控制集、布局、时序、功耗和资源推断;
- 每次复位都应有原因、状态、超时和可观测结果。
对当前 KU5P 工程,推荐把 100 MHz 稳定参考时钟作为管理域,以独立同步复位控制 RGMII、UDP/DMA、MIG UI 和 GTY/JESD 时钟域,并通过 AXI-Lite 暴露完整启动状态。
参考资料
- AMD UltraFast Design Methodology:Resets(UG949)
- AMD UltraFast Design Methodology:When and Where to Use a Reset(UG949)
- AMD UltraFast Design Methodology:Synchronous Reset vs. Asynchronous Reset(UG949)
- AMD UltraFast Design Methodology:Control Signals and Control Sets(UG949)
- AMD UltraScale Architecture Libraries Guide(UG974)
- AMD XPM_CDC_ASYNC_RST(UG974)
- AMD XPM_CDC_SYNC_RST(UG974)
不同 IP 和 Vivado 版本的复位端口极性、最小脉宽与启动顺序可能不同,最终必须以当前 IP Product Guide、Example Design 和生成后的端口说明为准。