实例解析Verilog综合出锁存器的问题

原文链接:https://mp.weixin.qq.com/s/kOgmVAFAoP70LRwmkTlEgw

下面哪种写法会产生latch?为什么? 

代码如下:

A.

always  @(*)begin
if(d)
a = b;
end

B

always  @(*)begin
if(d)
  a = b;
else
  a = a;
end

C

always @ (b or d)
  case(d)
    2’b00: a=b>>1;
    2’b11: c=b>>1;
    default:
      begin
        a=b;
        c=b;
      end
endcase

D

always @(b or d)begin
  a=b;
  c=b;
  case(d)
    2’b00: a=b>>1;
    2’b11: c=b>>1;
  endcase
end

E

always@(bor d)begin
  case(d) //synopsys full_case
    2’b00: a=b>>1;
    2’b11: c=b>>1;
  endcase
end

代码A:

是一个always语句块构成的组合逻辑,其中缺少else分支

当d=1'b0时,综合工具会默认保持a的值,即生成锁存器

代码B:

代码B虽然补全了else分支语句。但是,其代码依然有保持功能,即会生成锁存器;也就是说,组合逻辑是否会生成锁存器,其根本原因是该组合逻辑存在保持功能!

代码C:

代码C在always语句块内使用了case语句,并且case语句中含有default分支。但是,我们可以发现:

d=2’b00时,没有说明c的赋值;
d=2’b01时,没有说明a的赋值;

 代码D

代码D和代码C的不同是,它在always语句块的开始,对a和c进行了默认赋值;

这就类似于软件里面的初始化,当然只是类似而已,不会生成锁存器;

代码E

使用了//synopsys full_case 选项,该选项:

1、防止综合工具将case语句综合成不必要的优先级电路,增大硬件开销

2、和default语句类似,补全case语句没有列出的情况。

3、但是//synopsys full_case会造成工具之间的移植性问题,改代码依然综合出了锁存器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章