综合与可综合的HDL设计

综合的定义

综合就是针对给定的电路实现功能和实现此电路的约束条件,如速度、功耗、成本及电路类型等,通过计算机进行优化处理,获得一个能满足上述要求的电路设计方案。 
被综合的文件是HDL文件(或相应文件等),综合的依据是逻辑设计的描述和各种约束条件,综合的结果则是一个硬件电路的实现。该方案必须同时满足预期的功能和约束条件。对于综合来讲,满足要求的方案可能有多个,综合器将产生一个最优的或接近最优的结果。因此,综合的过程也就是设计目标的优化过程,最后获得的结构与综合器的工作性能有关。

FPGA/CPLD综合软件

FPGA/CPLD综合软件包括:Synopsys公司的FPGA Compiler II、Synplicity公司的Synplify/Synplify Pro、Mentor公司的LeonardoSpectrum及FPGA/CPLD厂商集成开发环境中自带的综合工具,如Altera Quartus II软件中的综合软件等。

综合的特点

综合的特点体现在以下几个方面:综合是在一定的限制条件下进行的,比如时序、面积或物理约束等;综合器独立于具体设计工艺,如果工艺改变,可使用新工艺元件库重新综合;综合器很难得到硬件设计的所有实现方案,不可能得到最优的硬件结果;不同的综合器使用不同的机制和算法,因此对相同的HDL描述可能得到不同的结果;不同的综合器对HDL语句和语法的支持不同,需要通过察看综合软件的相关文档进行了解。 
可综合的数据类型包括枚举类型、整数类型、数组类型(一维数组、二维数组)及记录类型。综合器不支持的数据类型包括:物理类型,如时间类型;浮点类型,如实数类型;存取类型及文件类型等。

面向综合的编码风格

设计描述的编码风格将直接影响EDA软件工具的综合结果。好的描述方式易于被综合器识别且能够被综合出设计者所期望的电路。电路的质量取决于设计者使用的描述风格和综合工具的能力。

形成良好的编码风格应注意以下几个方面:

对希望形成组合逻辑的if和case语句,要完整地描述其各个分支,避免形成锁存器(可行的方法之一是给所有被赋值信号赋初始值);

尽量使用简单的逻辑及数字运算符;

进程的敏感清单应列举完全,否则可能产生综合前后仿真结果不同的现象;

在循环中不要放置不随循环变化的表达式;

对 于复杂的数字运算要充分进行资源共享,如采用if块等;

对于长的组合链路应该在代码编写阶段注意描述成树状结构;

时序逻辑尽可能采用同步设计;

对具有不同的时序或面积限制的设计,应尽可能采用不同的代码描述以达到不同的要求(一般而言,面积与延时是相互冲突的,在FPGA 中面积代表资源的多少); 
对于复杂系统设计,应尽量采用已有的算法和模块来实现。

设计实现

设计实现即利用实现工具把逻辑映射到目标器件结构的资源中,决定逻辑的最佳布局,选择逻辑与输入输出功能连接的布线通道进行连线,并产生相应文件(如,配置文件与相关报告)的过程。通常可分为如下五个步骤:

1)转换:将多个设计文件进行转换并合并到一个设计库文件中。

2)映射:将网表中的逻辑门映射成物理单元或元素,即把逻辑设计分割到构成可编程逻辑阵列内的可配置逻辑块与输入输出块及其他资源中的过程。

3)布局布线:布局是指从映射中取出定义的逻辑和输入输出块,并把它们分配到 FPGA 内部的物理位置。通常基于某种先进的算法,如最小分割、模拟退火和一般的受力方向张弛等来完成;布线是指利用自动布线软件使用布线资源选择路径,试着完成所有的逻辑连接。在布局布线过程中,可同时提取时序信息形成时序分析报告。

4)时序提取:产生反标文件,供后续的时序仿真使用。

5)配置:产生FPGA配置时所需的位流文件。

增量设计

传统方法vs增量设计

传统的FPGA设计过程中,每次修改都将导致整个设计的重新编译,如此,时序也将产生变化,针对这一现象,引入了增量设计的概念。

增 量设计主要是指增量编译:根据设计者的分割设置,对不同的层次和模块分别编译。在对设计进行重新编译时,可以保持未修改部分的编译结果,从而节省编译时间。 
增量设计可将设计中无需修改的部分锁定并保持其性能,仅对设计中变化的部分重新处理。使用增量设计,设计人员可在验证过程中加速设计变化的调试,将更多时间用于调整设计中的关键元件,甚至在后期设计规范发生改变时,也不会影响整个设计的主要进度。

对于设计中未改变的部分,由于它们布局布线都保持不变,性能也不会变化,因此无需进行重新验证,从而可以节省大量的设计时间。增量设计有助于模块化设计和基于团队的设计流程。

图1 传统方法vs增量设计(略)

设计分割

设计分割指用户定义的逻辑分割,它与物理区域不同。逻辑分割应与设计的层次边界相符合,其中,每个设计实体并不自动成为一个分割。设计分割具有不同的设计文件,如果使用第三方综合软件,要为每个分割生成各自的EDIF或VQM文件。最优化过程不能跨越分割的边界,每个分割部分独立的进行综合和适配。

图2给出了设计分割示意,顶层划为一个分割,其他层次结构的子模块根据具体情况进行分割。不一定每个设计实体即为一个分割,也可以是几个设计模块的组合。

图2 设计分割(略)

对于不同的设计流程,Altera提供了不同的软件支持。自顶向下(Top-Down)的设计流程,整个设计在顶层编译,可由一个设计者或项目管理者完成编译设计,Altera Quartus II 5.0 和5.1中完全支持。自底向上(Bottom-Up)的设计流程,整个设计是在底层编译,在各个设计者分别优化后进行集成。目前Altera Quartus II 5.0和5.1中尚无导入和导出功能,因此并不支持自底向上(Bottom-Up)的设计流程,而借助LogicLock可实现该设计流程。

图3 增量编译流程(略)

增量编译流程

增量编译流程如图3所示,首先,准备利用增量编译的项目。包括:详细的设计分析,识别设计的层次;生成设计分割;使能“完全增量编译”或者“只进行增量综合”;用LogicLock生成设计版图等。

利用LogicLock布图

利用LogicLock生成设计版图:对包括顶层在内的每个分割产生一个LogicLock区域,而后每个LogicLock区域或设计分割将被独立放置在分开的物理区域上,手动或使用Altera Quartus II早期时序估计工具分配物理位置。

LogicLock区域由位置和尺寸定义。用原点表示位置:对于Stratix,Cyclone和MAX II器件,原点位于区域左下角,而其他Altera器件,原点则位于区域左上角。区域的宽度和高度决定了区域的尺寸。

推荐的设计分割用法与布局方式

根据设计经验,分割中有一些推荐用法,包括:所有分割的输入输出端口要有寄存器;应令跨边界的连接最少;将关键路径限制在每个分割的内部;分割不应太小(如<1000个逻辑单元);可能需要均衡使用资源;及分割边界上不使用三态或双向端口等。 
同时,推荐的布图方式包括:避免区域间相互覆盖及使用父区域和子区域,从而保持设计的逻辑层次关系,提高区域布局的灵活性等。

其次,执行完全编译。执行完全编译即启动完全编译并编译每一个分割,从而生成在随后增量编译中重新使用的综合后和适配后的网表。

最后,对设计进行修改并执行增量编译。完全编译后,在设计与调试阶段需反复进行设计的修改及增量编译。

执行增量编译

在下一次编译期间为每个分割设置使用的网表类型,如表1所示,然后重新编译设计。

表1 :网表类型设置(略)

设计优化与模块化设计方法

设计优化

FPGA设计过程中,必须采用与其结构相适应的优化技术,才能有效发挥FPGA芯片的能力。设计优化是指在设计没有达到用户要求的情况下,对其进行改进,以便满足设计的初始规格。

设计优化的主要内容包括:理解整个设计;对设计进行约束和设置;优化资源利用;输入输出时序优化;速度优化;编译效果优化及编译和测试时间优化。其设计流程如图4所示。

图4 设计优化流程(略)

只有深入理解整个设计,才能对其进行优化。包括理解系统时序,如系统时钟、模块时钟、时钟域及时钟来源等内部时钟问题。

在理解整个设计的基础上,须对设计进行约束和设置,约束和设置旨在完成编译后,可以根据编译结果对设计进行分析,找到设计中的真正瓶颈,从而有效的引导后续的优化过程。利用Altera提供的开发工具及其他厂商的EDA软件都可设定各种设计约束。

完成约束、设置后,通常将查看并分析编译产生的报告,包括:了解设计的资源使用情况,以便在后续的设计优化中更合理的分配和使用资源;查看并分析时序报告,判断各种时序关系和系统运行速度等指标是否满足了设计的需求,以便对不满足要求的部分进行修改和优化。

优化资源的利用

设计过程中,由于资源数量限制,造成系统不能在目标器件中实现,则需对资源利用进行优化。FPGA的资源,包括:逻辑单元、块RAM、I/O引脚、DSP块、锁相环、布线资源及各种硬IP核等。

设计中最根本、最有效的优化方法是对设计输入(如HDL代码)的优化,比较常用的面积优化方法包括:模块的时分复用、改变状态机的编码方式及改变模块的实现方式等。 
当 设计中位置约束或者逻辑锁定约束较多时,可能会造成局部设计拥挤,导致布线资源紧张,此时,可适当解除或放松布线拥挤区域的约束 。

输入输出时序优化

输入输出时序优化需要重点考虑的问题是可编程逻辑器件与外围芯片间的接口时序。在同步系统设计中,外部芯片和可编程逻辑器件使用的时钟经常是同相位的。设计主要关心芯片输入引脚的建立时间和保持时间、数据的时钟到输出延时及数据的输入到输出延时等。

输入输出时序的优化方法:根据外围器件和PCB连线情况,保留一定余量,计算I/O时序要求,并将这些时序要求在EDA软件中对设计进行约束,编译软件将根据约束条件进行自动优化;使用I/O单元的触发器;及使用锁相环电路等。

速度优化

速度优化即最高时钟频率优化,其最有效的方法是对设计代码进行优化。具体优化方法包括:增加流水线级数、组合逻辑分割和平衡、复制高扇出的节点及令状态机仅完成控制逻辑的功能等。

编译效果优化

使用不同的随机数种子,编译结果将在小幅度内变动。如果设计已经非常接近系统需求,则可以尝试改变随机数种子,使性能达到系统需求。同时,使用软件工具,如Altera的"Design Space Explorer",可以一次运行多种编译设置和优化目标,探索设计的优化空间。

编译和测试时间优化

设计较大或约束较多时,编译时间往往很长,从而影响开发进度。缩短编译时间有以下3种常用方法:使用快速编译方式,其特点是速度快,但可能在一定程度上影响设计性能;使用增量编译,最大限度的利用上一次的编译结果;反标注,使逻辑的位置和布线成为下一次编译的约束,对这部分不进行重新编译。

模块化设计方法

模块化设计

模 块化设计是将复杂的大型设计分成多个模块,利用基于团队的优势,分别进行设计和调试。采用模块化设计,可以进行系统的标准化设计,即将一些系统中常用的功能块进行模块化设计、调试和包装,以备调用。

与传统设计流程相比,模块化设计流程的输入模块是已经优化并达到时序收敛的子模块,通过模块化设计方法继承以往编译与实现的结果,在保证每个子模块时序收敛的基础上,达到顶层设计的时序收敛。因此有效避免了对整个系统进行的繁琐的设计编译、时序分析以及优化的反复循环,提高了设计效率。

模块划分的一般原则:模块内部联系紧密;各个模块的功能尽量独立;模块间连接尽量简单。

模块化设计基本流程

模块化设计的基本流程(如图5所示),分为两部分,一:模块化设计输入与综合,包括:顶层模块设计(输入与综合)、子模块划分及子模块的输入与综合。二:模块化设计实现,包括模块分割,添加设计约束、各子模块的实现(布局布线)及设计整合:将顶层设计和各子模块合并。

图5 模块化设计基本流程(略)

顶层设计是进行模块化设计的必要条件,包括:所有全局逻辑、输入输出端口、类似黑匣子的子模块及模块间、模块与输出输入端口间的信号连接等。项目设计人员设计各个子模块的逻辑实体,综合出各个子模块的网表。

模块化设计的实现包括三个阶段:初始预算、模块实现及设计整合。初始预算阶段,项目负责人对设计的整体进行分割和逻辑资源的分配,主要任务包括:对设计进行全局区域规划和布局;规划每个模块的规模和区域;规定每个模块的输入输出端口及最初的时序约束。

模 块实现阶段,项目设计人员将实现顶层设计中确定的各个模块,包括:添入功能实体、添加约束、进行布局布线。当最终实现结果满足模块的设计要求,则该模块的实现阶段完成。设计整合阶段,项目负责人将所有实现好的有效模块的设计结果与顶层设计结果进行整合,从而完成整个设计,包括:对设计进行合并及对合并后的设计进行布局布线。

Altera LogicLock工具

Altera LogicLock工具是Altera Quartus II软件内嵌的高级工具,LogicLock模块化设计流程支持复杂设计的某个模块独立进行设计、实现及优化,并将该模块的实现结果约束在规划好的FPGA区域内。这样在进行设计整合时,能够更好的继承每个模块的实现结果,提高模块复用效率,缩短设计周期。

基于LogicLock的模块化设计流程如下:1.合理规划设计层次并划分模块;2.使用Quartus II软件自带的综合软件或其他第三方综合软件,对设计的每个模块进行综合;3.对每个子模块建立Quartus II软件工程,在每个独立的工程中分别对每个子模块进行设计优化,以满足每个子模块的时序性能和面积目标,创建LogicLock区域;4.当所有子模块都满足要求后,导出所有模块和LogicLock区域的反标信息,作为后续设计的约束;5.建立顶层工程,根据设计要求选择节点反标或布线反标,将每个子模块的LogicLock区域反标信息导入顶层设计中;6.编译顶层设计,并观察顶层设计是否满足设计需要。

通过 LogicLock可以将关键路径分组,便于时序优化;继承模块的设计优化成果,便于设计重用;通过增量的编译与实现,有效缩短设计编译时间;支持模块化设计方法,便于分工协作与并行设计。

FPGA程序如何模块化设计?相关推荐

  1. 如何表达清楚一个程序:模块化设计

    如何表达清楚一个程序:模块化设计 主程序:模块与模块之间的关系 子程序:模块 使用函数或对象,通过封装程序划分为模块和模块之间的表达 对于要实现的算法 设定功能模块并且功能模块中建立之间的关系 模块术 ...

  2. (15)FPGA模块化设计原则

    (15)FPGA模块化设计原则 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块化设计原则 5)结语 1.2 FPGA简介 FPGA(Field Progra ...

  3. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  4. 【FPGA学习笔记】Verilog语言的模块化设计

    在进行模块化设计中,对于复杂的数字系统,我们一般采用自顶向下的设计方式.可以把系统划分成几个功能模块,每个功能模块再划分成下一层的子模块:每个模块的设计对应一个module,一个module设计成一个 ...

  5. 基于FPGA的超声波信号发生器设计:程序和电路原理图

    基于FPGA的超声波信号发生器设计:程序和电路原理图,产生方波,正弦波和三角波,双通道. ID:28800618610960372

  6. FPGA SelectMap接口配置设计

    http://xilinx.eetop.cn/viewnews-682-page-2 摘要:与通常采用外围的CPLD器件和CPU来产生配置接口控制逻辑的方法不同,本文设计了采用嵌入到FPGA的Leon ...

  7. 基于FPGA的IIR滤波器设计

    基于FPGA的IIR滤波器设计,使用VHDL语言. 本设计是毕设,包括论文 下面是论文目录截图: 各模块VHDL程序 时序控制模块程序 library ieee; use ieee.std_logic ...

  8. 基于ASP.NET Core的模块化设计: 虚拟文件系统

    土牛亲自录制的本文介绍视频 Abp中文网(https://cn.abp.io/)提供翻译字幕 基于ASP.NET Core的模块化设计: 虚拟文件系统 简介 创建模块化的应用程序很困难. 构建模块化的 ...

  9. 单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

    前言:前段时间分享的文章[单片机裸机代码框架设计思路],很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升. 本文章我们再谈谈单片机代码的 ...

最新文章

  1. 最全Python算法实现资源汇总!
  2. 推荐|深度学习领域引用量最多的前20篇论文简介
  3. 解决xcode打开时假死的问题
  4. android:ellipsize = marquee 跑马灯,Android-单行跑马灯(一直循环)效果
  5. Codeforces Round #662 (Div. 2)
  6. oracle decode函数
  7. 小程序input textarea 禁止粘贴实现
  8. vue简化技巧之‘hook:生命周期‘
  9. 服装行业ERP体系的主要好处
  10. Windows server DHCP服务器搭建
  11. matlab设置图片的比例,Matlab 画图字体,字号的设定,图片大小和比例
  12. PSI成长之路_配置并成功运行
  13. 最后聊聊:备案需要注意的地方和域名的解析
  14. qrious二维码生成插件
  15. android自定义插值器_自定义缓动插值器,可在Android中实现有意义的动作
  16. 计算机管理主分区改成逻辑分区,win10系统电脑的四个分区都是主分区,主分区如何改为逻辑分区?...
  17. 【ivp6服务器可通过ivp4网络访问教程】
  18. MetaMask轻钱包教程 修心手把手带你玩小狐狸 钱包小白必备非原创
  19. Week9 作业——B - 东东学打牌
  20. Java中的模块(Module)入门介绍

热门文章

  1. 2022年跨境物流指数研究报告
  2. 馒头店,普遍是开在菜市场附近。
  3. Golang 容易找工作吗?
  4. 反复使用的 git 指令
  5. matlab开启并行计算 核数_MATLAB——多核并行计算初探
  6. 力扣杯2021秋季编程大赛第四题 LCP 42. 玩具套圈
  7. 华为交换机流量不均处理
  8. java获取当日凌晨时间(获取当日零点)
  9. 5个高效的Python自动化脚本(建议收藏)
  10. 抖音那家公司发半个月工资奖金,员工:公司是我家