Verilog时序电路设计指南

没有时序电路设计准则的RTL设计可能会导致性能低下。

本文关键指南包括在顺序设计中使用非阻塞赋值、使用同步复位和时钟选通。详细描述了在设计中使用流水线阶段的指南,这些指南有助于提高设计性能。本文还介绍了有关描述具有多个时钟、多相位时钟的Verilog RTL以及异步复位问题的基本信息。

阻塞赋值的使用

如之前介绍所述,建议使用阻塞赋值来描述组合逻辑设计。但是,如果在编码时序逻辑行为时使用阻塞赋值,会发生什么?这是需要解决的最重要的问题之一,对后续讨论很重要。

如果阻塞赋值用于编码时序逻辑的行为,则可以观察到综合结果不是正确的功能设计意图。

接下来介绍使用阻塞赋值对时序电路设计进行编码的几个设计方案。

阻塞赋值和多个“Always”进程

如例6.1所述,在多个“Always” 进程中使用阻塞赋值。程序块“Always”在时钟的正边缘触发,综合器推断时序逻辑。如前所述,所有阻塞赋值都在活动队列中进行计算和更新。读者请参阅之前分享的分层事件队列一文。

如例6.1所述,这两个“Always” 进程并行执行,并以两位串行输入串行输出移位寄存器的形式生成输出。首先,always进程生成一个输出“b_in”从第一个“Always” 进程生成的输出被另一个“Always” 进程用作输入。因此,综合器将其推断为两位串行输入串行输出移位寄存器。

示例6.1的综合逻辑如图6.1所示,并具有输入“a_in”,“clk”和输出“y_out”

例6.1在多个always块中阻塞赋值图6.1多个always块中阻塞赋值的综合逻辑

同一“always”进程中的阻塞赋值

如果阻塞赋值用于描述时序逻辑,并且在同一“always”程序块中使用多个分配,则预期需求可能与综合逻辑匹配,也可能与综合逻辑不匹配。原因是,在阻塞分配中,所有后续语句(下一个立即数)都被阻塞,除非直到当前语句被执行。这将导致硬件截断,并可能推断出不需要的综合输出。

考虑在示例6.2中描述的设计场景,其意图是创建三位串行输入和串行输出移位寄存器,但是在综合示例6.2之后,它推断为单个触发器。

可综合逻辑如图6.2所示,其输入为“a”、“clk”和输出为“y”。所需的功能是串行输入、串行输出移位寄存器,但上述示例由于使用阻塞赋值而推断出单个触发器。因此,建议在为时序功能编码或描述RTL时使用非阻塞赋值。

例6.2在always”进程中的阻塞赋值图6.2同一always进程中阻塞赋值的综合逻辑

阻塞赋值示例

考虑在示例6.3中描述的设计场景,其意图是创建三位串行输入和串行输出移位寄存器,并且由于块“begin” 和 “end”中使用的阻塞赋值语句,它顺序生成三位串行输入串行输出移位寄存器。

综合逻辑如图6.3所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。因此,需要记住的重要一点是,程序“always”块中的阻塞赋值语句的顺序是综合中的决定性因素。

例6.3同一always块中的阻塞赋值(排序)图6.3阻塞赋值重新排序后的可综合逻辑

非阻塞赋值

如之前介绍的“分层事件队列”一文所述,非阻塞赋值在活动事件队列中评估,并在NBA队列中更新。非阻塞赋值用于描述时序逻辑。这些指定在程序块“always”中使用,以获得所需的综合结果。所有非阻塞赋值在“always”块内并行执行。

如例6.4所述。非阻塞赋值用于多个“always”块。程序块“always”在时钟的正边沿触发,综合器推断时序逻辑。综合逻辑如图6.4所示。

例6.4不同always块中的非阻塞赋值图6.4不同always块中的非阻塞赋值的综合逻辑

非阻塞赋值示例

如果使用非阻塞赋值来描述时序逻辑,并且在同一“always”程序块中使用多个赋值,则综合器始终推断出所需的预期逻辑。原因是,在非阻塞赋值中,“begin-end”块中写入的所有语句都是“并行”执行的,这就产生了时序逻辑。

考虑示例6.5中描述的设计场景,意图是创建三位串行输入和串行输出移位寄存器,使用非阻塞赋值。

综合逻辑如图6.5所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。

例6.5同一always块中的非阻塞赋值图6.5同一always块中非阻塞赋值的综合逻辑

非阻塞赋值的排序

考虑在示例中描述的设计方案,其意图是创建三位串行输入和串行输出移位寄存器,并使用非阻塞赋值。

上一节中的实例,在本例6.6中重新排序。

综合逻辑如图6.5所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。所以,重要的一点是要记住,过程“always”块中非阻塞赋值语句的顺序不是推断逻辑的决定性因素。

例6.6在同一always块中具有顺序更改的非阻塞赋值

锁存器与触发器

在实际的时序设计中,锁存器和触发器被用作设计所需预期设计功能的元件。锁存器是电平触发的,触发器是边缘触发的。大多数ASIC/FPGA设计都使用触发器作为时序元件。

D触发器

如前所述,触发器是边缘触发的,与锁存器相比,触发器单元的面积更大,甚至对于触发器,由于自由运行时钟的功耗更高,因此需要额外的功率控制逻辑。触发器没有周期窃取或时间借用(the cycle stealing or time borrowing)的概念,操作需要在一个时钟周期内完成。对于基于触发器的设计,应满足建立时间,设计的总体工作频率取决于设计中的关键路径。对于基于触发器的设计,时序分析和时间预算(Timing analysis and time budgeting)应更为明确。

示例6.7中描述了D触发器RTL,并使用非阻塞赋值。输入“D”被分配到时钟正边缘的输出“Q”。

正边缘触发D触发器的综合逻辑如图6.6所示。

例6.7使用非阻塞赋值的D触发器图6.6综合D触发器

锁存器

如前所述,锁存器是电平触发的,与触发器相比,锁存器单元的面积更小,对于锁存器,也不需要额外的功率控制逻辑,因为由于锁存器启用输入的低开关导致功耗更小。锁存器具有周期窃取或时间借用的概念,在流水线中非常有用。不需要在一个时钟周期内完成操作。基于锁存器的设计,设计的总体工作频率不取决于设计中最慢的路径。对于基于锁存器的设计,时序分析和时间预算更为困难。

示例6.8中描述了D锁存器RTL,并使用非阻塞赋值。在锁存启用输入的正电平上,输入“D”被分配给输出“Q”。

正电平敏感锁存器的综合逻辑如图6.7所示。

图6.7综合锁存器

同步与异步复位的使用

大多数情况下,设计工程师在使用复位时会感到困惑!对于我们来说,何时进行异步复位以及何时使用同步复位是工程师面临的关键挑战之一。因此,对于ASIC/FPGA设计工程师来说,需要很好地理解复位问题以及复位树。复位树结构和同步将在后面讨论。本节介绍使用Verilog HDL的同步和异步复位描述。

异步复位D触发器

如前面文章所述,异步复位是ASIC /FPGA设计中的一个问题,因为它独立于时钟信号。复位信号用于在任何时间点初始化时序逻辑,与时钟无关。复位输入不是数据路径的一部分,甚至内部生成的复位或异步复位也不建议在ASIC/FPGA设计中使用,因为它们容易出现故障。即使复位恢复也是一个问题,如果使用异步复位输入,则建议使用两级同步器同步异步复位输入。

如例6.9所示,使用Verilog HDL描述异步复位信号D触发器RTL。

异步复位D触发器的综合逻辑如图6.8所示。

例6.9用于异步复位D触发器的Verilog RTL图6.8异步复位D触发器的综合

同步复位D触发器

如之前所述,在ASIC/FPGA设计中,同步复位与依赖于时钟信号。复位信号用于在时钟正边缘上的实例初始化时序逻辑。复位输入是数据路径的一部分,不容易出现故障。使用同步复位输入,复位恢复就不是问题。同步复位不需要使用电平同步器。

如例6.10所示,使用Verilog HDL描述同步复位信号D触发器RTL。

综合逻辑如图6.9所示,其中复位输入是数据路径的一部分。

例6.10同步复位D触发器的Verilog RTL图6.9同步复位综合D触发器

使用if-else与案例分析

对于时序设计,使用“if-else”结构来描述优先级逻辑功能。要分配优先级信号,请使用“if-else”结构。使用“case”结构来描述并行逻辑。后续会进行详细介绍,这里先不介绍了。

内部生成的时钟

内部生成的时钟信号使用系统或主时钟,并生成输出作为内部生成的时钟信号。但是,需要避免内部生成的时钟信号,因为它会导致设计中的功能和时序问题,功能和时序问题是由组合逻辑传播延迟引起的。内部产生的时钟信号会在系统中产生小故障或尖峰(glitch or spike)输出,这可能会多次触发时序逻辑,或产生不需要的输出。这不仅违反建立或保持时间,这些类型的设计也会违反计时规则。

始终建议使用寄存器输出逻辑生成内部时钟。但是仍然由于触发器的传播延迟,总体累积延迟或偏差可能会在设计中产生小故障或尖峰。

如例6.11所示,描述了Verilog RTL生成内部时钟。生成的内部时钟信号由其他时序程序块使用。

例6.11用于内部生成时钟的Verilog RTL图6.10综合内部生成时钟逻辑

综合逻辑如图6.10所示,第一个寄存器由时钟“clk”驱动,第二个寄存器由“int_clk”驱动。

门控时钟

门控时钟信号用于在时钟输入端使能切换,并可通过使用使能输入端在单个或多个时钟域设计中使用。使能输入为高时,时钟域打开;使能输入为低时,时钟域关闭。需要时钟选通逻辑来控制时钟的开启或关闭。时钟选通是ASIC/FPGA设计中用来降低寄存器时钟输入端开关功率的一种有效技术。通过使用时钟选通结构,可以根据设计功能要求在需要时停止时钟切换。

但是时钟选通的问题是它不能用于同步设计,原因是它引入了大量的时钟偏移,甚至这种技术也引入了小故障。为了避免出现故障,ASIC/FPGA设计工程师需要特别小心。

例6.12中描述了Verilog RTL,并使用使能输入控制时钟切换活动。对于“enable=1”,时钟输入“clk”切换,对于“enable=0”,时钟输入无切换。

综合逻辑如图6.11所示,其中使用AND逻辑对时钟进行选通。

图6.11综合时钟选通逻辑

设计中“流水线”的使用

流水线是以延迟为代价提高设计性能的强大技术之一。这种技术被用于许多处理器设计和许多ASIC/FPGA设计应用程序中,以便一次并行执行多个任务。本节讨论无流水线设计和有流水线设计。

无流水线的设计

在设计的初始阶段,大多数设计都是使用Verilog RTL描述的,而不使用流水线逻辑。如果没有达到设计性能所需的速度,那么ASIC/FPGA设计者可以使用各种方法达到自己的目的。最好的方法之一是通过根据时钟延迟和数据速率要求插入寄存器逻辑进行流水线。示例6.13描述了在不使用任何流水线逻辑的情况下使用Verilog RTL的设计功能。

综合RTL逻辑如图6.12所示,由公共时钟源“clk”触发的两个寄存器组成。

例6.13无流水线级的Verilog RTL图6.12无流水线级的综合逻辑

流水线设计

为了提高设计性能,可以将组合逻辑和输出提供给附加的流水线寄存器,流水线寄存器的输出可以驱动或逻辑的一个输入。

这种技术将以一次时钟延迟为代价来提高设计的整体性能。设计性能的提高是由于寄存器到寄存器路径中组合延迟的减少。

例6.14中描述了Verilog RTL,通过添加额外的寄存器逻辑,实现了流水线。

综合RTL逻辑如图6.13所示,由公共时钟源“clk”触发的三个寄存器组成。

例6.14带流水线级的Verilog-RTL图6.13流水线级综合逻辑

同步设计建模指南

以下是用于描述同步设计的关键指南

  1. 要描述同步设计的功能,请使用非阻塞赋值。

  1. 请勿使用基于锁存器的设计,因为锁存器在半个时钟周期内是透明的。

  1. 使用流水线提高设计性能。

  1. 使用同步复位信号,因为它们不容易出现故障或尖峰。

  1. 如果使用异步信号,则使用双级同步器同步内部生成的复位。

  1. 使用时钟选通单元(门控时钟)进行低功耗设计。

同一模块中的多个时钟

在多时钟域设计中可以使用多个时钟源或信号。这些时钟信号可以通过使用不同的源来生成,并且可以在ASIC/FPGA设计中用于触发不同的“always”程序块。数据从一个时钟域到另一个时钟域的传输需要数据路径和控制路径中的额外同步器,这些将在后续文章中讨论。

例6.15中描述了Verilog RTL,它使用两个不同的时钟信号“clk1”和“clk2”。使用两个不同的程序块分别使用“clk1”和“clk2”来描述功能y。在同一模块中定义多个时钟信号不是最佳做法。在多时钟域设计中,根据功能需求需要描述不同的设计块,并且可以在不同的时钟信号上触发它们。

综合输出如图6.14所示,并生成输出“f1_out”和“f2_out”。时钟信号“clk1”用于触发上层寄存器。上层寄存器在时钟“clk1”的正边缘触发。下层寄存器在“clk2”的负边缘触发。

例6.15用于多时钟定义的Verilog RTL图6.14多时钟综合逻辑

设计中的多相位时钟

用于触发多个程序块并从同一时钟源生成且具有到达时间差的时钟信号称为多相位时钟信号。例如,如果其中一个程序块在时钟的正边缘触发,而另一个程序块在时钟的负边缘触发,则寄存器和这些信号的触发中存在180°的相位差,并被视为相移信号。

Verilog RTL如例6.15所示,其中一个程序块由时钟的正边缘触发,另一个由时钟的负边缘触发(例6.16)。

综合逻辑如图6.15所示,其中在时钟的不同边缘触发两个不同的寄存器。

例6.16带多相时钟的Verilog-RTL图6.15多相位时钟的综合逻辑

异步设计建模指南

以下是异步设计建模时需要遵循的关键准则

  1. 如果使用异步复位信号,则使用双边缘同步器同步内部生成的复位信号。

  1. 避免使用将触发器输出驱动到后续触发器的异步复位,因为这可能具有竞争条件。

  1. 避免使用异步脉冲发生器,因为它会在设计和定时关闭过程中,甚至在place和route过程中产生问题。

如果以功耗为目标,则仅使用高效纹波计数器;但是,由于触发器的累积延迟效应或级联延迟(由于触发器的个别传播延迟),在使用纹波计数器时会出现性能下降。

你真的理解Verilog 中的module吗?

工具与大脑完美结合,才能写出世上最棒的Verilog代码

数字硬件建模综述

数字硬件建模-从另一方面理解Verilog(一)

数字硬件建模-重新从另一方面理解Verilog(二)

组合逻辑硬件建模设计(一)逻辑门

FPGA的设计中为什么避免使用锁存器

组合逻辑硬件建模设计(二)算术电路

Verilog组合逻辑设计指南

Verilog时序逻辑硬件建模设计(一)锁存器D-latch和触发器Flip-Flop

Verilog时序逻辑硬件建模设计(二)同步和异步复位

Verilog时序逻辑硬件建模设计(三)同步计数器

Verilog时序逻辑硬件建模设计(四)移位寄存器

Verilog时序逻辑硬件建模设计(五)异步计数器&总结

Verilog时序电路设计指南相关推荐

  1. Verilog时序逻辑硬件建模设计(四)移位寄存器

    Verilog时序逻辑硬件建模设计(四)移位寄存器 -Shift Register 没有任何寄存器逻辑,RTL设计是不完整的.RTL是寄存器传输级或逻辑,用于描述依赖于当前输入和过去输出的数字逻辑. ...

  2. 一般时序电路设计(次态卡诺图化简法)

    次态卡诺图 没有用到的状态用xxxx表示,当作约束项. 四个状态变量要分成四个卡诺图 Q3*,Q2*Q1*Q0* 四个卡诺图 对于Q3*的卡诺图,将次态卡诺图的每一行的左数第一个数填入Q3*的卡诺图的 ...

  3. 第23讲 时序电路设计1

    时序电路设计1 1.时序电路设计步骤: 2.形式化 3.状态赋值 1.时序电路设计步骤: 1.功能说明: 2.形式化:做状态图或状态表: 3.状态赋值:给每一个状态指定一个编码: 4.确定下一状态方程 ...

  4. 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计.仿真.综合和下载 示例:计数器与分频器 ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式: ...

  5. OneMO模组说|技术学堂-硬件篇(一):模组SIM卡电路设计指南

    SIM卡全称"用户识别模块",是移动蜂窝互联网与物联网设备的用户识别卡.SIM卡与模组通信易受其他信号干扰造成读卡失败.掉卡等问题,因此在SIM卡电路设计时需要做好抗干扰处理.本文 ...

  6. 三极管开关电路_[经验] 三极管开关电路设计指南

    三极管除了可以当做交流信号放大器之外,也可以做为开关之用.严格说起来,三极管与一般的机械接点式开关在动作上并不完全相同,但是它却具有一些机械式开关所没有的特点.     图1所示,即为三极管电子开关的 ...

  7. Verilog的时序问题和SystemVerilog TestBench激励时序

    转载请标明出处: 原文发布于:[浅尝辄止,未尝不可的博客](https://blog.csdn.net/qq_31019565) Verilog时序问题和SystemVerilog TestBench ...

  8. verilog时钟翻转怎么写_Verilog基本电路设计之二(时钟无缝切换)

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区. 您需要 登录 才可以下载或查看,没有帐号?注册 x 时钟切换分成两种方式,普通切换和去毛刺无缝切换. 普通切换,就是不关心切出的时钟是否存在毛 ...

  9. Verilog在编写第一行代码之前

    除非你知道自己要去的地方,否则你不可能到达那里! 好的设计者一般都要对电路要实现的功能有清晰的认识,对数据流很清楚,知道数据如何从一个点移动到另-个点,这就是所谓的"勾划"(wal ...

最新文章

  1. Linux-4.查看网卡信息,状态
  2. Start Activity for Result(Bug)
  3. 《尼山萨满》项目美术亲述游戏创作过程
  4. c语言枚举代替双switch,C语言 使用数组代替switch分支语句降低圈复杂度
  5. 图论 —— AOE 网与关键路径
  6. Bailian3756 多边形内角和【数学计算】
  7. Java_基础(一)
  8. 吉他扒谱该怎么做?分享一款超好用的扒谱工具!
  9. Altium designer—各类USB封装大全
  10. redis视频教程 java_Redis高级运用视频教程
  11. Frameworks Detected: Web framework is detected
  12. java屏蔽虚拟按键代码_Android虚拟按键 Recent键屏蔽(隐藏)
  13. 标准10进制公制度量系统单位换算
  14. 【數論】【搜索】【SCOI2009】遊戲
  15. nvidia显卡,驱动以及cuda版本对应查询
  16. ArcGIS Pro从0到1入门实战教程 书籍淘宝线上销售,免费下载数据和视频
  17. 电路板PCBA清洗工艺
  18. 以太零MPOS共识机制介绍
  19. SQL Server 2012 Analysis Services高级教程
  20. UG二次开发GRIP添加加工工序

热门文章

  1. vs2017手动安装插件
  2. LeetCode:242. 有效的字母异位词
  3. 利用Scrapy框架爬取前途无忧招聘信息
  4. 遥感植被叶面积指数LAI3g数据发布-GIMMS LAI3g
  5. 国家电网泛在电力物联网分析—架构形式
  6. 将字符串转换成大写字母
  7. nginx使用Proxy-protocal
  8. 沃趣科技与「DaoCloud 道客」达成生态合作,共同助推数字化新发展
  9. 电脑桌面云便签怎么绑定QQ互联登录或解绑QQ?
  10. php cgi 挂掉,zend opcache引起iis/Apache 不时挂掉 php-cgi.exe - FastCGI 进程意外退出