You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 22:54:04