Yosys合成Verilog异步复位报多沿敏感错误原因与解决
报错根因
Yosys抛出ERROR: Multiple edge sensitive events found for this signal错误,是因为你编写的异步复位逻辑不符合Verilog时序寄存器的推断规则,无法映射到iCE40器件的原生D触发器单元,具体违反的编写规范如下:
- 异步复位信号的硬件优先级必须高于所有时钟触发逻辑,不能和普通功能条件做逻辑运算后放在同一个判断分支。你写的
if (leds == 8'b11111111 || ~rst)把~rst复位条件和leds状态判断设为同级触发条件,完全不符合硬件DFF 复位有效时立刻输出复位值,不依赖时钟沿、不关心其他输入状态 的固有行为。 - 带异步复位的时序
always块有固定的可综合推断模板:敏感列表同时列出时钟有效沿、复位有效沿后,块内第一个判断必须单独检查复位信号是否有效,复位分支直接给寄存器赋固定复位值;只有复位无效时,才执行时钟沿触发的正常功能逻辑。你将复位条件和功能逻辑混写在同一个if判断中,合成器无法识别出标准异步复位DFF结构,最终触发报错。
修正方法
严格按照异步复位DFF的可综合模板修改代码即可,针对你使用的低电平有效rst按键,正确代码如下:
always @(posedge enable or negedge rst) begin // 最高优先级:单独判断复位状态,不与其他逻辑条件合并 if (!rst) begin leds <= 8'b00000000; // 复位按键按下,所有LED熄灭 end else begin // 复位无效时,执行原有enable上升沿触发的LED翻转逻辑 if (leds == 8'b11111111) begin leds <= 8'b00000000; end else begin leds <= 8'b11111111; end end end
补充设计提示:直接用分频器输出的enable信号作为寄存器时钟属于门控时钟写法,在FPGA设计中容易引入时钟偏移、时序收敛困难的问题。更稳妥的实现方式是使用开发板板载的全局时钟作为所有触发器的工作时钟,将分频输出的enable信号作为时钟使能使用,该优化不影响本次报错修复,仅作为后续设计改进参考。
内容的提问来源于stack exchange,提问作者Neekon Saadat
相关产品推荐
相关产品推荐

