verilog 在写RTL代码时,要尽量避免锁存器吗?做芯片和FPGA有区别吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog 在写RTL代码时,要尽量避免锁存器吗?做芯片和FPGA有区别吗?相关的知识,希望对你有一定的参考价值。

这也要看情况,锁存器又是也是有用处的,当然做芯片设计也可用verilog描述,其中区别最大的应该是测试验证环节对于芯片设计相当重要,约占设计总时间的80%左右!追问

我是做芯片前段的,刚接触。那怎么判断要不要避免锁存器呢。有人说做ASIC的话,用锁存器的较多。对吗?

追答

锁存器为电平触发,无效电平锁存,有效电平输入即反应到输出,由于延时不同容易产生毛刺。组合逻辑中数据不需要锁存,需要避免产生锁存器。FPGA资源中木有锁存器,需要触发器加逻辑门构成,消耗逻辑资源较多,但有时为了需要满足一些规范协议,会用到锁存器,总之FPGA用的很少。
而ASIC设计中,由于锁存器构成较简单,传输速度快,用锁存器可以有效提高集成度,所以用的比较多!

参考技术A 做芯片级的话锁存器确实用得较多,因为锁存器比寄存器快很多,能够使芯片性能得到最大限度的提高。FPGA使用寄存器较多是因为控制时序比较方便 。 参考技术B 一般都是避免,锁存器会产生预料不到的反馈路径,时序分析不好分析

RTL基本知识:线网类型知多少

Verilog中常用的线网类型如下表所示:

关键词

说明

wire

连线

wand

线与

wor

线或

tri

三态线网

triand

三态线与

trior

三态线或

tri0

三态下拉线网

tri1

三态上拉线网

trireg

三态寄存器

supply0

用于对“地”建模

supply1

用于对“电源”建模

uwire

连线,用于避免多驱动

1 wire和tri

wire和tri功能和使用方法完全一样,都用来连接电路元件,主要区别可能仅在书写上不同,同时使用tri可以增加程序的可读性,表示该线网为有三态功能。当有多个不同值的驱动同时驱动线网时,此时wire和tri声明的线网为不定态(unknown)。下表为wire和tri在多驱动时的逻辑真值表:

wire/tri

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

Z

2 wand/triand

wand和triand的区别与wire和tri类似。当有过个不同值的驱动同时驱动线网时,此时wand和triand声明的线网为不定态(unknown)。下表为wand和triand在多驱动时的逻辑真值表:

wand/triand

0

1

X

Z

0

0

0

0

0

1

0

1

X

1

X

0

X

X

X

Z

0

1

X

Z

3 wor和trior

wor和trior区别与wire和tri类似。当有过个不同值的驱动同时驱动线网时,此时wor和trior声明的线网为不定态(unknown)。下表为wor和trior在多驱动时的逻辑真值表:

wor/trior

0

1

X

Z

0

0

1

X

0

1

1

1

1

1

X

X

1

X

X

Z

 

1

X

Z

4 tri0和tri1

该类线网当没有任何驱动时,其值为pulldown或者pullup,即下拉或者上拉,此时的信号强度为Pull(Pu0或者Pu1),且这种强度不用在线网声明时显式指出,其模拟的电路结构类似下图:

技术分享图片

下表为tri0和tri1在多驱动时的逻辑真值表:

tri0

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

0

 

tri1

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

1

5 supply0和supply1

supply0和supply1用来模拟电路中的电源地,其信号强度为supply(Su)。

6 uwire

当线网声明为uwire后,该类型的线网约束了该线网只能有一个驱动源,如果连接多于一个驱动时将会报错。所以uwire类型的线网不能用于双向端口之类的具有双向数据流向特征的语句中。

7 trireg

trireg用于存储数值,其功能类似于寄存器,常用于电容节点的建模.当该线网的驱动源都为高阻态时,线网上现实的状态为最后一次线网上保存的值 (0,1,x),该线网的缺省态为不定态,这里需要注意的是该线网的强度只能是small(Sm),medium(Me),large(La)三种,该强度指定一般在线网声明时进行,默认强度为medium.

技术分享图片

仿真结果如下:

技术分享图片

技术分享图片

源程序如下:

技术分享图片

在时刻0,nmos1和nmos2全部打开,强度St1的信号复制给了cap1和cap2,此时cap1和cap2中存储的值为St1;

在时刻10,nmos1关闭,St1不能驱动到cap1中,此时cap1中的值为最后一次存储的值1,高电平1的强度为声明时指定的large1(La1)。因为nmos2是打开,所以cap1和cap2是连通的,此时cap1和cap2的强度都为La1;

在时刻20,nmos1和nmos2全部关闭,此时cap1为声明时指定的La1,cap2为声明时指定的Sm1;

在时刻30,nmos2打开,cap1和cap2连通,此时cap1和cap2的强度都为La1;

时刻40情况与时刻30情况类似,不再赘述。

 更多资讯,请关注个人公众号:芯光灿烂

技术分享图片

以上是关于verilog 在写RTL代码时,要尽量避免锁存器吗?做芯片和FPGA有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

提供一个RTL级描述的verilog程序,并解释下怎么看出是RTL级描述的

verilog中为啥锁存器要在电平触发方式下生成

RTL基本知识:Verilog常见错误

verilog的行为级描述和RTL级描述有啥区别

11.Verilog中如何避免Latch

阻塞赋值和非阻塞赋值