规避锁存器的出现

锁存器(latch)是数字逻辑电路中很重要的一种基本电路,常见的锁存器包括三个端口:数据输入口,,数据输出口,使能端。当使能端为高电平时,输入口的数据直接送到输出口,此时输入输出口可以看成是直接连通的;当使能端为低电平时,输出口的数据保持之前的数据不变,无论输入口的数据怎么变化,输出都不变,就是把原来的状态锁存下来(所以才叫锁存器)。锁存器与触发器的区别在于:锁存器是电平触发,触发器是边沿触发。锁存器在不锁存数据时,输出随输入变化。但一旦数据锁存,输入对输出不产生任何影响。

在时序逻辑中,不完整的if…else…结构并不会生成锁存器,而组合逻辑不完整的if…else…就会生成锁存器。
在时序逻辑中,由于触发器具有锁存数据的功能,所以不会生成锁存器,锁存器只会在组合逻辑电路中产生。

eg1:

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

这是一个always语句块构成的组合逻辑,其中缺少else分支。当d=1’b0时,综合工具会默认保持a的值,即生成锁存器。
eg2:

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

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

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

代码C在always语句块内使用了case语句,并且case语句中含有default分支。但是,我们可以发现,
d=2’b00时,没有说明c的赋值;
d=2’b01时,没有说明a的赋值;
eg4:

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

它在always语句块的开始,对a和c进行了默认赋值。
综合结果,没有生成任何时序逻辑。
eg5:

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

使用了//synopsys full_case 选项,
该选项:
1、防止综合工具将case语句综合成不必要的优先级电路,增大硬件开销
2、和default语句类似,补全case语句没有列出的情况。
3、但是//synopsys full_case会造成工具之间的移植性问题,改代码依然综合出了锁存器
在这里插入图片描述
在这里插入图片描述

说完了锁存器的出现情况,下面说下,为什么在ICG CELL中使用的是锁存器而不用触发器?
门控时钟最简单的实现方法就是使用与门。
在这里插入图片描述
理论上是可行的,当使能信号enable为高电平时,时钟将被传递到被门控的触发器,FF2。
问题在于时序(timing)。在时钟的上升沿,触发器FF1的D输入传播到Q输出,但是时钟的同一上升沿也到达了与门,这会导致门控时钟出现毛刺现象。
因此选择使用集成时钟门控(ICG)单元。
在这里插入图片描述
当时钟为低电平时,允许输入直接传播到与门的输入。此时时钟为低电平,所以与门的输出将为低电平,与使能输入无关。
当时钟为高电平时,锁存器将关闭,并阻止enable的值的任何更改传播到与门。这就不会产生毛刺。
当时钟再次变为低电平时,锁存器重新打开,新的使能通过锁存器。

可以使用单独的门(锁存器和与门)构建这种类型的电路,但这需要在综合/后端/STA中进行一些额外的时序检查。

大多数ASIC库都提供一个标准的ICG单元,其中的时序已经在内部进行了描述。类似于触发器和锁存器,ICG单元的使能输入同样具有建立和保持时间要求,很容易进行时序分析。

如果使用的是上升沿触发的触发器,就会发生和一开始的clock gating设计一样的问题。

如果使用的是下降沿触发的触发器代替低电平敏感的锁存器,在时钟的下降沿捕获使能输入。这样与门的使能输入会保持稳定,直到时钟的下一个下降沿。因此,解决了毛刺问题。

但是,这会带来三个问题:

1、触发器通常由两个锁存器组成。因此,Flip-Flop-basedICG相比Latch-based ICG面积增加了一倍。

2、Flip-Flop-based ICG相比Latch-based ICG增加了功耗

3、最重要的是,Flip-Flop-based ICG在时钟下降沿捕获使能输入,必须在半个时钟周期内完成。而使用锁存器,能够占用整个时钟周期(time borrow),因为Latch在有效电平是一直能够传播数据的,触发器只能在边沿传播数据。

因此,Latch-based ICG相比Flip-Flop-based ICG具有更好的功耗、面积和时序。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值