0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

设计Verilog时为什么要避免Latch的产生呢?

冬至子 来源:数字IC与好好生活的两居室 作者:除夕之夜啊 2023-06-02 11:32 次阅读

Latch 的含义

◆锁存器(Latch),是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值。仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。

当电平信号无效时,输出信号随输入信号变化,就像通过了缓冲器;当电平有效时,输出信号被锁存。激励信号的任何变化,都将直接引起锁存器输出状态的改变,很有可能会因为瞬态特性不稳定而产生振荡现象。

锁存器示意图如下:

图片

◆触发器(flip-flop),是边沿敏感的存储单元,数据存储的动作(状态转换)由某一信号的上升沿或者下降沿进行同步的(限制存储单元状态转换在一个很短的时间内)。

触发器示意图如下:

图片

寄存器(register),在 Verilog 中用来暂时存放参与运算的数据和运算结果的变量。一个变量声明为寄存器时,它既可以被综合成触发器,也可能被综合成 Latch,甚至是 wire 型变量。

但是大多数情况下我们希望它被综合成触发器,但是有时候由于代码书写问题,它会被综合成不期望的 Latch 结构。

◆Latch 的主要危害有:1)输入状态可能多次变化,容易产生毛刺,增加了下一级电路的不确定性;2)在大部分 FPGA 的资源中,可能需要比触发器更多的资源去实现 Latch 结构;3)锁存器的出现使得静态时序分析变得更加复杂。

Latch 多用于门控时钟(clock gating)的控制,设计时一般应当避免 Latch 的产生。

if 结构不完整

◆组合逻辑中,不完整的 if - else 结构,会产生 Latch。

例如下面的模型,if 语句中缺少 else 结构,系统默认 else 的分支下寄存器 q 的值保持不变,即具有存储数据的功能,所以寄存器 q 会被综合成 Latch 结构。

module module1_Latch1(
    input       data, 
    input       en ,
    output reg  q) ;

    always @(*) begin
        if (en) q = data ;
    end


endmodule

◆避免此类 Latch 的方法主要有 2 种,一种是补全 if-else 结构,或者对信号赋初值。

例如,上面模型中的 always 语句,可以改为以下两种形式:

// 补全条件分支结构   
    always @(*) begin
        if (en)  q = data ;
        else     q = 1'b0 ;
    end
//赋初值
    always @(*) begin
        q = 1'b0 ;
        if (en) q = data ; //如果en有效,改写q的值,否则q会保持为0
    end

◆但是在时序逻辑中,不完整的 if - else 结构,不会产生 Latch,例如下面模型。

这是因为,q 寄存器具有存储功能,且其值在时钟的边沿下才会改变,这正是触发器的特性。

module module1_ff(
    input       clk ,
    input       data, 
    input       en ,
    output reg  q) ;

    always @(posedge clk) begin
        if (en) q <= data ;
    end


endmodule

◆在组合逻辑中,当条件语句中有很多条赋值语句时,每个分支条件下赋值语句的不完整也是会产生 Latch。

其实对每个信号的逻辑拆分来看,这也相当于是 if-else 结构不完整,相关寄存器信号缺少在其他条件下的赋值行为。例如:

module module1_Latch11(
    input       data1, 
    input       data2, 
    input       en ,
    output reg  q1 ,
    output reg  q2) ;

    always @(*) begin
        if (en)   q1 = data1 ;
        else      q2 = data2 ;
    end


endmodule

这种情况也可以通过补充完整赋值语句或赋初值来避免 Latch。例如:

always @(*) begin
        //q1 = 0; q2 = 0 ; //或在这里对 q1/q2 赋初值
        if (en)  begin
            q1 = data1 ;
            q2 = 1'b0 ;
        end
        else begin
            q1 = 1'b0 ;
            q2 = data2 ;
        end
    end

case 结构不完整

case 语句产生 Latch 的原理几乎和 if 语句一致。在组合逻辑中,当 case 选项列表不全且没有加 default 关键字,或有多个赋值语句不完整时,也会产生 Latch。例如:

module module1_Latch2(
    input       data1, 
    input       data2, 
    input [1:0] sel ,
    output reg  q ) ;

    always @(*) begin
        case(sel)
            2'b00:  q = data1 ;
            2'b01:  q = data2 ;  //缺少 default 选项
        endcase
    end


endmodule

消除此种 Latch 的方法也是 2 种,将 case 选项列表补充完整,或对信号赋初值。

补充完整 case 选项列表时,可以罗列所有的选项结果,也可以用 default 关键字来代替其他选项结果。

例如,上述 always 语句有以下 2 种修改方式。

always @(*) begin
        case(sel)
            2'b00:    q = data1 ;
            2'b01:    q = data2 ;
            default:  q = 1'b0 ;
        endcase
    end
always @(*) begin
        case(sel)
            2'b00:  q = data1 ;
            2'b01:  q = data2 ;
            2'b10, 2'b11 : 
                    q = 1'b0 ;
        endcase
    end

原信号赋值或判断

在组合逻辑中,如果一个信号的赋值源头有其信号本身,或者判断条件中有其信号本身的逻辑,则也会产生 Latch。因为此时信号也需要具有存储功能,但是没有时钟驱动。此类问题在 if 语句、case 语句、问号表达式中都可能出现,例如:

//signal itself as a part of condition
    reg a, b ;
    always @(*) begin
        if (a & b)  a = 1'b1 ;   //a - > Latch
        else a = 1'b0 ;
    end
//signal itself are the assigment source
    reg        c;
    wire [1:0] sel ;
    always @(*) begin
        case(sel)
            2'b00:    c = c ;    //c - > Latch
            2'b01:    c = 1'b1 ;
            default:  c = 1'b0 ;
        endcase
    end
//signal itself as a part of condition in “? expression”
    wire      d, sel2;
    assign    d =  (sel2 && d) ? 1'b0 : 1'b1 ;  //d - > Latch

避免此类 Latch 的方法,就只有一种,即在组合逻辑中避免这种写法,信号不要给信号自己赋值,且不要用赋值信号本身参与判断条件逻辑。

例如,如果不要求立刻输出,可以将信号进行一个时钟周期的延时再进行相关逻辑的组合。上述第一个产生 Latch 的代码可以描述为:

reg   a, b ;
    reg   a_r ;

    always (@posedge clk)
        a_r  <= a ;

    always @(*) begin
        if (a_r & b)  a = 1'b1 ;   //there is no Latch
        else a = 1'b0 ;
    end

敏感信号列表不完整

如果组合逻辑中 always@() 块内敏感列表没有列全,该触发的时候没有触发,那么相关寄存器还是会保存之前的输出结果,因而会生成锁存器。

这种情况,把敏感信号补全或者直接用 always@(*) 即可消除 Latch。

小结

总之,为避免 Latch 的产生,在组合逻辑中,需要注意以下几点:

1)if-else 或 case 语句,结构一定要完整

2)不要将赋值信号放在赋值源头,或条件判断中

3)敏感信号列表建议多用 always@(*)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    425

    浏览量

    26273
  • 寄存器
    +关注

    关注

    30

    文章

    5027

    浏览量

    117711
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109298
  • 锁存器
    +关注

    关注

    8

    文章

    744

    浏览量

    41034
  • 触发器
    +关注

    关注

    14

    文章

    1677

    浏览量

    60394
收藏 人收藏

    评论

    相关推荐

    CMOS的闩锁效应:Latch up的原理分析

    电路无法正常工作,甚至烧毁电路。 Latch up是指CMOS晶片中,在电源VDD和地线GND(VSS)之间由于寄生的PNP和NPN双极性BJT相互影响而产生的一低阻抗通路,它的存在会使VDD和GND之间产生大电流; 随着IC制
    的头像 发表于 12-23 16:06 4.8w次阅读
    CMOS的闩锁效应:<b class='flag-5'>Latch</b> up的原理分析

    X态是什么?X态有什么危害?如何避免X态的产生?X态怎么处理?

    Verilog 和 SV 定义了四种逻辑状态:0,1,Z 及 X
    的头像 发表于 11-15 14:47 1863次阅读
    X态是什么?X态有什么危害?如何<b class='flag-5'>避免</b>X态的<b class='flag-5'>产生</b>?X态怎么处理?

    芯片设计都不可避免的考虑要素—闩锁效应latch up

    闩锁效应,latch up,是个非常重要的问题。现在的芯片设计都不可避免的要考虑它。我今天就简单地梳理一下LUP的一些问题。
    的头像 发表于 12-01 17:11 847次阅读
    芯片设计都不可<b class='flag-5'>避免</b>的考虑要素—闩锁效应<b class='flag-5'>latch</b> up

    #硬声创作季 【4.2】——D-LatchVerilog表述

    fpgaVerilog
    Mr_haohao
    发布于 :2022年09月08日 09:11:17

    [4.2.1]--4-2D-LatchVerilog表述

    Verilog
    李开鸿
    发布于 :2022年11月12日 14:49:30

    Latch UP

    的PNP和NPN双极性BJT相互影响而产生的一低阻抗通路, 它的存在会使VDD和GND之间产生大电流随着IC制造工艺的发展, 封装密度和集成度越来越高,产生Latch up的可能性会越
    发表于 12-16 16:37

    GSM教你理解verilog HDL语言的一些概念

    表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。12、IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果
    发表于 02-24 10:37

    【锆石科技】关于 Verilog HDL 语言的一些关键问题解惑【免费下载】

    设计③ 如何给端口选择正确的数据类型④ Verilog语言中latch产生⑤ 组合逻辑反馈环⑥ 阻塞赋值与非阻塞赋值的不同⑦ FPGA的灵魂状态机⑧ 代码风格的重要性[hide][/hide]
    发表于 08-17 05:56

    寄生电路的效应:Latch-Up(锁定)

    了解电路设计技巧之后,这种效应已经可以被控制了。CMOS电路之所以会产生Latch-Up效应,我们可以用图2.29来表示。在图中我们以剖面图来看一个CMOS反相器如何发生此效应,而且它是用P型阱制造
    发表于 08-23 06:06

    请问Latch到底是什么

    (Address Latch Enable)。描述是这样的,ALE是一个脉冲信号,用来锁住(Latch)AD0~AD7的地址。这里Latch又是动词。请问Latch到底是什么意思
    发表于 12-06 10:35

    Verilog基本功--flipflop和latch以及register的区别

    消耗的门资源比ff少。但是你用的如果是 fpga,那么内部一般带DFF单元,反而用触发器更好。3、latch与register的区别,为什么现在多用register.行为级描述中latch如何
    发表于 08-27 08:30

    怎么知道产生的PWM波形对不对

    前言在做嵌入式开发的过程中,不可避免的会用到PWM的功能,但是我们怎么知道产生的PWM波形对不对,这个时候可能就需要一台示波器来测量一下了,但是这始终有点麻烦。于是我尝试着使用STM32的定时器
    发表于 08-16 09:06

    为什么C语言避免使用Null指针

    为什么C语言避免使用Null指针?指针作为数组的应用有哪些
    发表于 12-20 07:19

    always block內省略else所代表的電路 (SOC) (Verilog)

    Abstract在Verilog中,always block可以用來代表Flip-Flop, Combination Logic與Latch,本文比較在不寫else下,always block所代表
    的头像 发表于 09-28 11:16 4509次阅读
    always block內省略else所代表的電路 (SOC) (<b class='flag-5'>Verilog</b>)

    ncp1234的latch脚怎么用

    ncp1234的latch脚怎么用  ncp1234的latch脚是一种用于控制数据输入和输出的引脚,在数字电路设计中起着重要的作用。 ncp1234的latch脚的功能 ncp1234的la
    的头像 发表于 12-07 16:52 240次阅读