Vivado中Synth 8-7213错误:复位信号判断与事件控制不匹配
Vivado中[Synth 8-7213]报错原因及rst_n/!rst_n写法差异
报错本质
[Synth 8-7213]是Vivado综合器抛出的复位逻辑推断失败错误,意味着代码描述的复位行为不符合时序电路的综合规范,综合器无法识别合法的复位结构。
两种写法的差异根源
1. 复位信号的有效电平约定
rst_n是行业通用的低电平有效复位信号:即rst_n=0时复位生效,rst_n=1时复位失效。
- 用
if(rst_n)判断时,实际处理的是复位失效的场景,若此时把复位动作(比如给寄存器赋初始值)写在这个分支里,完全违背了复位逻辑的设计意图。 - 用
if(!rst_n)判断时,直接对应复位生效的场景,把复位动作放在这个分支,完全符合低电平复位的设计逻辑,综合器能直接识别。
2. Vivado综合器的复位推断规则
Vivado对时序电路的复位逻辑有明确推断要求:它期望复位条件直接指向复位有效电平,即当复位信号处于有效状态时,寄存器被赋予初始值。
if(!rst_n)的写法直接满足这个要求,综合器能快速识别这是异步/同步复位的合法时序电路。if(rst_n)的写法把复位失效场景放在了第一个分支,若后续else分支的逻辑不明确(比如没有给寄存器赋初始值,或者赋值逻辑混乱),综合器会无法确定这是不是合法的复位结构,进而抛出错误。
3. 代码示例对比
触发报错的写法(逻辑倒置)
// 异步复位敏感列表:negedge rst_n,但复位动作写在了rst_n=1(失效)的分支 always @(posedge clk or negedge rst_n) begin if(rst_n) begin data <= 1'b0; // 错误:复位失效时给初始值,违背低电平复位逻辑 end else begin data <= data_in; end end // ?:运算符的错误写法 assign data = rst_n ? 1'b0 : data_in; // 同样逻辑倒置
正常合成的写法(逻辑匹配)
// 异步复位:复位有效(!rst_n=1)时执行复位动作 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin data <= 1'b0; end else begin data <= data_in; end end // ?:运算符的正确写法 assign data = !rst_n ? 1'b0 : data_in;
总结
报错的核心是复位逻辑的有效电平与代码分支判断逻辑不匹配,导致综合器无法正确推断时序电路。!rst_n的写法直接对应低电平复位的有效状态,符合综合器的推断规则;而rst_n的写法若逻辑倒置,就会触发复位推断失败的错误。
内容的提问来源于stack exchange,提问作者Cu635
相关产品推荐
相关产品推荐

