verilog 在写RTL代码时,要尽量避免锁存器吗?做芯片和FPGA有区别吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog 在写RTL代码时,要尽量避免锁存器吗?做芯片和FPGA有区别吗?相关的知识,希望对你有一定的参考价值。
这也要看情况,锁存器又是也是有用处的,当然做芯片设计也可用verilog描述,其中区别最大的应该是测试验证环节对于芯片设计相当重要,约占设计总时间的80%左右!追问我是做芯片前段的,刚接触。那怎么判断要不要避免锁存器呢。有人说做ASIC的话,用锁存器的较多。对吗?
追答锁存器为电平触发,无效电平锁存,有效电平输入即反应到输出,由于延时不同容易产生毛刺。组合逻辑中数据不需要锁存,需要避免产生锁存器。FPGA资源中木有锁存器,需要触发器加逻辑门构成,消耗逻辑资源较多,但有时为了需要满足一些规范协议,会用到锁存器,总之FPGA用的很少。
而ASIC设计中,由于锁存器构成较简单,传输速度快,用锁存器可以有效提高集成度,所以用的比较多!
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有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章