为什么Yosys将Verilog时序语句综合为常数赋值语句
问题解答
核心原因
- 你的Verilog逻辑存在赋值分支缺失:你仅在时钟上升沿且
A为高时给B赋值为1'b1,没有补充else分支,也没有给寄存器加任何复位逻辑,这意味着B一旦被置1后,没有任何路径可以回到0状态。 - Yosys的综合优化逻辑:综合工具会自动分析所有信号的可达状态,当识别到该寄存器的最终稳态必然为1,且不存在反向赋值路径时,会直接将其优化为常数
1'b1输出,节省寄存器资源。 - 隐含的语法不规范问题:代码中的输出端口
B没有显式声明为reg类型,而在always块内赋值的变量必须是reg类型,部分综合工具对这种隐式声明的处理逻辑不同,也会加剧优化的程度。
修复方案
如果需要正确推断出寄存器,需要补充完整的赋值逻辑,比如增加复位逻辑、补充else分支的取值,示例代码如下:
module test (A,B, CLK, rst_n); input A, CLK, rst_n; output reg B; // 显式声明为reg类型 always@(posedge CLK) if(!rst_n) B <= 1'b0; // 复位时赋值为0 else if(A) B <= 1'b1; else B <= B; // 保持原有值,可根据需求修改为其他逻辑 endmodule
修改后综合工具会识别到寄存器存在复位、保持等多种状态,不会再将其优化为常数。
内容的提问来源于stack exchange,提问作者Donghui Li
相关产品推荐
相关产品推荐

