verilog实例_Verilog中的assign 语句y会生成latch么?
数字芯片实验室之前深度分析过Verilog建模的组合逻辑在什么样的条件下会生成Latch?
实例解析Verilog综合出锁存器的问题
今天数字IC设计交流群中讨论到一个assign语句生成Latch的问题。下面是两个实例
示例1
module test1(out,a,b); input a ,b ; output out ; assign out = (a& b) + (!b & out) ;endmodule
示例1不会生成Latch。
elaborate结果
Vivado工具elaborate之后,可以看出上述代码是一个纯组合逻辑,满足逻辑关系
out = (a & b) + (!b & out) ;
synthesis结果
Vivado工具综合之后,将设计映射到一个LUT3上。
示例2
module test2(out,a,b); input a ,b ; output out ; assign out = b?a:out ; endmodule
示例2会生成Latch。
elaborate结果
Vivado工具elaborate之后,可以看出上述代码是一个Latch逻辑,满足逻辑关系
out =b?a:out ;
synthesis结果
造成上述两个相同逻辑,不同综合结果差异的根本原因是:过程赋值和连续赋值的差异。
过程赋值和连续赋值我在之前的文章verilog重点解析(13题)中讨论过。
过程赋值在Verilog中主要用来赋值给reg变量,用来生成时序和组合逻辑。例如
always@(*)
连续赋值主要用来赋值给wire变量,用来生成组合逻辑。例如
assign
特别的是,Verilog中的
assign out =b?a:out ;
是一个特例。其赋值行为等价于
always@(b) beginout = b?a:out ;end
也就是说,其赋值行为其实是过程赋值
1、先计算出右边的值RHS
2、在将RHS赋值给左边的值LHS
而
assign out = (a & b) + (!b &out) ;
的赋值行为是连续赋值
计算出右边的值RHS,同时将RHS赋值给左边的值LHS。
最后我们可以修改文章实例解析Verilog综合出锁存器的问题中得到的结论为
由过程赋值(always@和?=)建模的组合逻辑是否会生成锁存器,其根本原因是该组合逻辑存在保持功能!
本文感谢数字IC设计交流一群小伙伴们的技术支持