两段Verilog代码综合结果是否一致?工具差异及验证方法
两段Verilog代码的综合结果对比及验证方法
问题说明
两段需置于always块中且已声明所用寄存器的Verilog代码,是否会被综合为相同电路?考虑到Vivado与Quartus等综合工具可能存在差异,它们的输出结果是否不同?有没有简便的验证方法?
代码片段
第一段代码
if (some_condition) begin if(another_condition) begin output <= 1'b1; end else begin output <= output; end end else begin if(another_condition) begin output <= 1'b1; end else begin output <= 1'b0; end end
第二段代码
if (another_condition) begin output <= 1'b1; end else begin if (some_condition) begin output <= output; end else begin output <= 1'b0; end end
逻辑等价性分析
这两段代码的逻辑功能完全等价,具体拆解:
- 当
another_condition为真时,无论some_condition的状态是什么,output都会被赋值为1'b1; - 当
another_condition为假时:- 若
some_condition为真,output保持当前值(output <= output); - 若
some_condition为假,output被赋值为1'b0。
- 若
基于逻辑等价性,主流综合工具(包括Vivado和Quartus)都会将它们综合为完全相同的电路——综合工具会自动优化逻辑分支,识别并合并等价的逻辑路径。
验证方法
- 本地工具验证:分别用Vivado或Quartus综合两段代码,查看生成的RTL原理图或网表文件,直接对比电路结构是否一致;
- 在线EDA平台验证:借助在线EDA平台快速完成验证,无需本地安装工具,通过查看综合后的逻辑示意图或网表即可确认结果是否一致。
内容的提问来源于stack exchange,提问作者igrok
相关产品推荐
相关产品推荐

