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

下面哪种写法会产生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会造成工具之间的移植性问题,改代码依然综合出了锁存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值