IC验证零基础学习-Verilog-PartB

IC验证零基础学习-Verilog-PartB
第三部分 RTL概念与常用RTL建模
一、
HDL语言是份层次的,最常用的层次概念有系统级(System level),功能级(Functional model level),行为级(Behavioal level),寄存器传输级(RTL-Register transfer level)和门级(Gate level)。RTL指:不关注寄存器和组合逻辑的细节,(如使用了多少逻辑门,逻辑门之间的连接拓扑结构等)通过描述寄存器到寄存器之间的逻辑功能描述电路的HDL层次,是可综合的描述层次。
综合:将HDL语言,原理图等设计输入翻译成由与,或,非门等基本逻辑单元组成的门级连接(网表),并根据设计目标与要求(约束条件)优化所产生的逻辑连接,输出门级网表文件。
1)典型的RTL设计包含以下3个部分:
(1)时钟域描述:描述设计使用的所有时钟,时钟之间的主从与派生关系,时钟域之间的转换。
(2)时序逻辑描述(寄存器描述):根据时钟沿的变换,描述寄存器之间的数据传输方式。
(3)组合逻辑描述:描述电平敏感信号的逻辑组合方式与逻辑功能。
2)RTL级代码设计步骤:
(1)功能定义与模块划分(2)定义所有模块的接口(3)设计的时钟域(4)考虑设计的关键路径-设计中时序要求最难以满足的路径(5)顶层设计(6)FSM设计(7)时序逻辑设计(8)组合逻辑设计
3)非阻塞赋值,阻塞赋值,连续赋值
(1)对于时序逻辑,即always模块的敏感表为边沿敏感信号(多为时钟或复位的正沿或负沿),统一使用非阻塞赋值“<=”。
(2)对于always模块的敏感表为电平敏感信号的组合逻辑,统一使用阻塞赋值“=”.
(3)对于assign关键字描述的组合逻辑,称为连续赋值语句,统一使用“=”,变量被定义为wire信号。
4)寄存器电路建模
(1)寄存器定义为reg型,但是定义为reg型并不一定就是寄存器,也可能是纯组合电路。
(2)同时使用时钟上升沿和下降沿的问题,这个双沿电路往往可以等同于使用了原时钟的倍频时钟的单沿操作电路。
5)组合逻辑建模
always敏感表为电平敏感信号的组合逻辑电路,敏感表一定要完整。
6)双向端口与三态信号建模-强烈建议仅在顶层定义双向总线和例化三态信号。
7)MUX建模
(1)简单的用“?”表达式建模。信号被定义为wire型。(2)复杂的mux用case或嵌套的if…else建模,信号被定义为reg型。
8)存储器建模
9)时钟分别电路-难点在于如何调整所有时钟的相位关系。
10)串/并转换建模-可用移位寄存器,RAM等实现。复杂的可用状态机实现。
11)同步复位-复位信号变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对所有寄存器复位。
优点:①利于基于仿真周期机制的仿真器进行仿真,②利于时序分析,其综合结果的频率往往比较高,③同步复位仅在时钟的有效沿生效,可以有效的避免因复位电路毛刺造成的亚稳态和错误。
缺点:①增加更多逻辑资源,②必须保证复位信号的有效时间足够长,从而才能保证所有触发器都有效地复位。
12)异步复位-只需在always的敏感表中加入复位信号的有效沿即可,当复位信号有效沿到达时,无论时钟沿是否有效,复位功能立即生效。
优点:①节约逻辑资源;②异步复位设计简单。缺点:①容易造成触发器亚稳态,造成逻辑错误;②如果异步复位逻辑树的组合逻辑产生了毛刺,则毛刺的有效沿会使触发器误复位,造成逻辑错误。
【推荐】复位电路的方式-异步复位,同步释放。
13)用case和if…else建模
case是“平行”的,并无优先级;if…else也无优先级,if…if具有优先级。优先级结构会消耗更多的组合逻辑资源。
14)可综合的Verilog语法子集
①模块:module…endmodule;②端口声明:input, output, inout;③信号类型:wire, reg, tri等,integer通常用于for语句中的索引;④参数定义:parameter;⑤运算操作符:各种逻辑操作,移位操作,算术操作符等;⑥比较判断:case…endcase, if…else;⑦连续赋值:assign, 问号表达式;⑧always模块:建模时序和组合逻辑;⑨语法分隔符:begin…end;⑩任务定义:function…endfunction, task…endtask;循环语句:for。
第四部分 RTL设计与编码指导
主要包括:一般性的指导原则;同步设计原则和多时钟处理;代码风格;结构层次设计和模块划分;组合逻辑的注意事项;时钟设计的注意事项,RTL代码优化技巧。
1)一般性指导原则:四个基本原则。(1)面积和速度的平衡和互换原则;(2)硬件原则(3)系统原则;(4)同步设计原则。
(1)面积和速度的平衡与互换原则
面积:一个设计所消耗的目标器件的硬件资源的数量。
速度:设计在芯片上稳定运行时所能够达到的最高频率。
(2)硬件原则
HDL语言本质是在描述硬件,最终的实现结果是芯片内部的实际电路。HDL语言便于描述“互连”,“并发”,“时间”这3个概念。
①互连:互连是硬件电路的一个基本要素,HDL的网线型变量则专为模块互连而设计,描述电路连接清晰明确。
②并发:硬件系统中各个单元的运算是独立的,信号流是并行的。
③时间:HDL语言定义了绝对和相对的时间度量,在仿真时可以通过时间度量与周期关系描述信号直接的时间关系。
(3)系统原则
(4)同步设计原则和多时钟处理
①异步电路:电路的核心逻辑用组合电路实现;电路的主要信号,输入信号等并不依赖于任何一个时钟性信号,不是由时钟信号驱动触发器(FF)产生的;最大缺点容易产生毛刺;不利于器件移植;不利于静态时序分析(STA),验证设计时序功能。
②同步电路:电路的核心逻辑用各种各样的触发器实现;电路的主要信号,输出信号等都是由某个时钟沿驱动触发器产生的;同步时序电路可以很好地避免毛刺;利于器件移植;利于静态时序分析(STA),验证设计时序性能。
③同步时序设计-基本原则是使用时钟沿触发所有的操作。
为了能够采样到稳定可靠的数据必须遵守以下两个基本原则:
a:在有效时钟沿达到前,数据输入至少已经稳定了采样寄存器的Setup时间之久,这条原则简称满足Setup原则;
b:在有效时钟沿到达后,数据输入至少还将稳定保持采样寄存器的Hold时间之久,这条原则简称满足Hold时间原则。
④亚稳态
如果触发器的Setup时间或者Hold时间不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间内处于不确定的状态,在这段时间内Q端产生毛刺并不断震荡,最终固定在某一电压值,此电压值并不一定等于原来数据输入端D的数值,这段时间称为决断时间。
异步时钟域的转换的核心就是要保证下级时钟对上级数据采样的Setup时间和Hold时间。
避免亚稳态的方法:
a:对异步信号进行同步处理(采用同步器);
b:采用FIFO对跨时钟域数据通信进行缓冲设计;
c:对复位电路采用异步复位、同步释放方式处理;
⑤异步时钟域数据同步-是指在两个时钟不同步的数据之间可靠地进行数据交换。
a:两个域的时钟频率相同,但是相位差不固定,或者相差固定但是不可测,简称为同频异相问题。
此种问题可以通过用后级时钟对前级数据采样两次,即通常所述的用寄存器打两次。这种方法仅适用于对少量错误不敏感的功能单元。
可靠的做法是用DPRAM,FIFO或一段寄存器Buffer完成一部时钟域的转换。
b:两个时钟域频率根本不同,简称为异频问题。
此种问题就是使用DPRAM或FIFO。
(5)代码风格
(6)结构层次设计和模块划分
模块划分的技巧:
①对每个同步时序设计的子模块的输出使用寄存器。
②将相关的逻辑或者可以重复的逻辑划分在同一模块内
③将不同优化目标的逻辑分开
④将时序约束较松的逻辑归到同一模块
⑤将存储逻辑独立划分成模块
⑥合适的模块规模
(7)组合逻辑的注意事项
①always组合逻辑信号敏感表:
a:正确的信号敏感表设计方法是将always模块中使用到的所有输入信号和条件判断信号都列在信号敏感表中。
b:希望通过信号敏感表的增减完成某项逻辑功能是不可能的。
c:不完整的信号敏感表会造成前仿真结果和综合,实现后仿真结果不一致。
d:一般综合工具对于不完整的信号敏感表的默认做法是,将处理进程中用到的所有输入和判断条件信号都默认添加到综合结果的信号敏感表中,并对原设计代码敏感表中遗漏的信号报警告(warning)信息。
②组合逻辑环路
组合逻辑反馈环路是数字同步逻辑设计的大忌,它最容易因振荡,毛刺,时序违规等引起整个系统的不稳定和不可靠。
同步时序系统中应该避免使用组合逻辑反馈环路:
a:牢记任何反馈环路必须包含寄存器。
b:检查综合,实现报告的warning信息,发现Combination Loops后进行相应修改。
③脉冲产生器
④慎用锁存器
防止产生非目的性的Latch的措施如下:
a:使用完备的if…else语句。
b:检查设计中是否含有组合逻辑反馈环路。
c:为每个输入条件设计输出操作,对case语句设置default操作。特别是在状态机设计中,最好有一个default的状态转移,而且每个状态最好也有一个default的操作。
d:如果使用case语句时,特别是在设计状态机时,尽量附加综合约束属性,综合为完全条件case语句(full case)。
(8)时钟设计的注意事项
①对于时钟路径,必须插入寄存器以过滤毛刺。
②同步时序设计中,必须严格避免使用Ripple Counter。
③时钟选择:
a:时钟切换控制逻辑在配置后将不再改变。
b:时钟切换后,对所有相关电路复位,以保证所有寄存器,状态机和RAM等电路的状态不会锁死或进入死循环。
c:所设计系统对时钟切换过程发生的短暂错误不敏感。
(9)门控时钟(Gated Clock)-IC设计的一种常用减少功耗的手段。在同步设计电路中,尽量不使用Gated Clock。
【注】近年来减少功耗的常用方法:低核电压芯片;芯片休眠功能,Clock,MUX。
2)RTL代码优化技巧
(1)使用Pipelining技术优化时序-流水线时序优化方法
本质是调整一个较长的组合逻辑路径中的寄存器位置,用寄存器合理分割该组合逻辑路径,从而降低了对路径Clock-To-Output和Setup等时间参数的要求,达到提高设计频率的目的。
(2)模块复用与Resource Sharing
(3)逻辑复制-通过增加面积而改善时序条件的优化手段。最常使用的场合是调整信号的扇出。
(4)香农拓展运算-也是一种逻辑复制,增加面积,提高频率的时序优化手段。
香农拓展通过增加MUX,从而缩短了某个优先级,但是组合路径长的信号路径时延,从而提高了该关键路径的工作频率。
3)小结
(1)时序(Timing):要求设计满足预期的时序约束条件,满足预期频率要求。
(2)面积(Area):要求设计所消耗资源满足所规划的面积要求。
(3)时钟(Clocks):要求设计中的时钟质量满足规划要求。
(4)验证(Verification):要求设计通过仿真验证的测试。
(5)可测试性(DFT-Design For Test):要求设计时充分考量设计的可测试性。
(6)可重用性(Reuse):希望设计的最大功耗在规定范围之内。
(7)功耗(Power):要求设计的最大功耗在规定范围之内。
(8)Vendor Policies(原厂的要求):这里主要是指EDA工具的优化测量和PLD或ASIC厂方的设计规格和软硬件需求。
第五部分 如何写好状态机
1)状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法。
2)状态机包括:状态,输入,输出。分为:摩尔(Moore)型和米勒(Mealy)型。
Moore型:输出仅仅依赖于当前状态,与输入条件无关。
Mealy型:输出不仅依赖于当前状态,而且取决于该状态的输入条件。
3)RTL级状态机描述常用语法:①wire, reg;②parameter;③always;④case, endcase;⑤task,endtask。
4)状态机写法:一段式,二段式,三段式,推荐后两种。
(1)二段式状态机:①一个always模块采用同步时序描述状态转移;②另一个模块采用组合逻辑判断转移条件,描述状态转移规律,描述对用状态的输出(多数存在组合逻辑输出)。
(2)三段式状态机:①一个always模块采用同步时序描述状态转移;②一个模块采用组合逻辑判断条件转移,描述状态转移规律。③一个采用同步时序描述对应状态的输出(不存在组合逻辑输出)。
第六部分 逻辑验证与testbench编写
1)功能验证主要有三种:仿真;形式验证;硬件加速。
2)仿真一般性含义:使用EDA工具,通过对设计实际工作情况的模拟,验证设计的正确性。
3)testbench:在仿真的时候testbench用来产生测试激励给待验证设计(DUV)或待测试设计(DUT),同时检查DUV的输出是否与预期一致,达到验证设计功能的目的。
4)testbench主要功能:
(1)为DUT提供激励信号;
(2)正确实例化DUT;
(3)将仿真结果的数据显示在终端,或者存为文件,或者显示在波形窗口以供分析检查;
(4)复杂设计可以使用EDA工具,或通过用户接口自动化比较仿真结果与理想值,实现结果的自动检查。
5)建立testbench,仿真设计
(1)编写仿真激励
(2)搭建仿真环境
(3)确认仿真结果:
①直接观察波形;②观察文本输出;
③自动检查仿真结果——
a:数据库比较法。首先需要生成一个标准的向量数据库(Golden Vector Database),它存储的是期望得到的仿真结果,是比较的基础。然后自动将每条仿真输出的响应向量与标准向量进行比较,记录不一样向量的位置和内容。这种方法的优点是简单易行,缺点是根据输出响应向量回溯并定位输入激励不是十分方便。
b:波形比较法。与数据库比较法思路基本一致,只是比较对象是仿真输出波形,首先存储标准波形文件(Golden Wave File),然后通过仿真软件手动或自动进行仿真的输出波形与标准波形文件进行比较,用图标(marker)定位比较结果相异的地方。这种方法的优点是直观明了。
c:动态自检法。前两种自动比较方法的本质都是将仿真结果与事先存储好的标准向量(Golden Vector)进行比较,对于复杂设计,仿真系统的输出不仅和当前输入有关,还和历史输入甚至和反馈值相关,对于前两种方法,即使发生了输出的响应向量和标准向量不一样,要定位造成不一致的原因,特别是追溯哪些输入造成的输出不一致比较困难。前两种方法统称为静态分析方法。与之相反的,动态分析方法就能实时定位哪些激励造成了响应不一致。基本思路–首先可以在不同的抽象层次(如行为级或混合层次)描述出与DUT功能一致的仿真模型,然后读入测试向量(Test Vectors),将测试激励向量同时送到实例化的DUT和前面提到的仿真模型中,实时的观察,判断。存储两者的输出响应,比较输出结果。一旦发现不一致,即可暂停仿真过程,观察DUT和仿真模型的每个中间状态的值,记录输入的激励向量,定位设计错位。
d:使用VCD文件
6)写testbench要注意什么?
(1)testbench不是硬件
(2)使用行为级描述方式描述testbench
(3)设计高效的testbench

参考书籍《Verilog数字系统设计教程》《轻松成为设计高手-Verilog HDL实用讲解》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值