
本书以Xilinx公司 7系列FPGA、UltraScale/UltraScale+和Versal ACAP内部架构为基础,介绍了与之匹配的RTL代码风格(采用SytemVerilog语言)和基于Vivado的设计分析方法。全书共10章内容,包括了时钟网络、组合逻辑、触发器、移位寄存器、存储器、乘加运算单元和状态机的代码风格和优化方法,也包含扇出和布线拥塞的优化方法。本书可供电子工程领域内的本科高年级学生和研究生学习参考,也可供FPGA工程师和自学者参考使用。
设计收敛是FPGA 工程师所面临的一个重要课题:既要保证功耗收敛,又要保证时序收敛。两者均与设计有很大关系。在多年的工程实践和技术支持过程中,笔者发现,很多设计未能收敛都与代码风格或对Vivado 工具的理解有很大关系。 就代码风格而言,目前已有越来越多的工程师意识到其重要性。往往“良好的代码风格”能起到事半功倍的效果。“良好的代码风格”的一个重要指标就是代码风格与FPGA内部结构匹配,保证综合工具能够完美地推断出期望的结果。这一点被很多工程师忽略了。例如,7 系列FPGA 内部的DSP48E1 是不支持异步复位的,如果乘法器使用了异步复位,那么相应的触发器是无法被吸收到DSP48E1 内部的,这不仅消耗了额外的触发器(SLICE 内部的触发器),还会导致时序恶化。鉴于此,本书以FPGA 内部结构为基础,以SystemVerilog 语言为描述方式,并结合大量实际案例,力求帮助读者深入理解两者之间的对应关系。 就工具而言,Vivado 越来越智能,功能越来越强大,分析手段也越来越多。这就需要工程师深入理解工具在各个阶段所提供的选项的含义,并能够在工程实践中正确合理地使用这些选项;同时,面对未能收敛的设计,能够找到其中的根本原因。为此,本书也介绍了什么是有缺陷的设计,如何借助Tcl 脚本找到这些缺陷,以及如何解决这些缺陷。 全书共10 章。第1 章从FPGA 发展历程的角度对FPGA 技术进行了分析。第2章以时钟网络架构为基础,阐述了优化时钟网络的经典方法,涉及改善时钟偏移和降低时钟抖动。第3 章~第7 章分别介绍了优化组合逻辑、优化触发器、优化移位寄存器、优化存储器和优化乘加运算单元的经典方法,重点介绍了优化对象的基本结构,包括目前主流的FPGA(7 系列FPGA、UltraScale/UltraScale+ 和Versal ACAP),在每章的最后还重点介绍了如何发现缺陷单元,以及如何处理缺陷单元。第8 章介绍了优化状态机的经典方法,包括状态机的“两段式”和“三段式”描述方法、状态机编码方式、Vivado 提供的状态机编码选项等。第9 章和第10 章分别阐述了优化扇出和优化布线拥塞的经典方法,均以Vivado 工具为核心,给出了相应的Tcl 脚本。 全书既阐述了FPGA 的内部结构,又阐述了RTL 的代码风格(采用SystemVerilog语言),既介绍了以Vivado 图形界面为主的分析手段,又介绍了以Tcl 脚本为主的分析手段,力求帮助读者从设计输入和设计分析两个维度理解设计。 为便于读者阅读和理解书中内容,本书给出了468 张图片、76 个表格、186 个SystemVerilog 代码片段、56 个Tcl 脚本片段、57 条设计规则和29 个应用案例;同时,为加深印象,本书在每章最后还列出了一些常见问题留给读者思考,共有100 个问题。 FPGA 设计收敛不是一蹴而就的,既需要依靠我们的大脑智慧,又需要工具协同,两者缺一不可。希望读者在阅读本书之后,对FPGA 架构和RTL 代码风格的理解能够更上一层楼。 读者在阅读本书的过程中,如发现书中内容有任何不当之处,或者对本书内容有任何建议或意见,可发邮件到laurengao@126.com,不胜感激。 获取代码示例: 如果需要获取代码示例,请关注作者微信公众号“FPGA 技术驿站”,回复关键字“设计优化SV”即可。 高亚军 2022/3/12
第1 章 FPGA 技术分析/ 1 1.1 芯片架构的演变 / 1 1.2 设计方法的演变 / 15 1.3 面临的挑战 / 20 1.4 四大基本原则 / 23 1.5 性能指标 / 29 1.6 思考空间 / 31 第2 章 优化时钟网络/33 2.1 时钟资源 / 33 2.2 时钟偏移 / 55 2.3 时钟抖动 / 68 2.4 安全的时钟启动方式 / 75 2.5 时钟规划 / 79 2.6 创建输出时钟 / 84 2.7 思考空间 / 84 第3 章 优化组合逻辑/86 3.1 组合逻辑资源 / 86 3.2 译码器代码风格 / 87 3.3 编码器代码风格 / 94 3.4 多路复用器代码风格 / 103 3.5 多路解复用器代码风格 / 116 3.6 比较器代码风格 / 118 3.7 移位器代码风格 / 130 3.8 加法器代码风格 / 135 3.9 奇偶校验电路代码风格 / 163 3.10 二进制码与格雷码互转电路代码风格 / 165 3.11 避免组合逻辑环路 / 168 3.12 慎用full_case 和parallel_case / 169 3.13 思考空间 / 175 第4 章 优化触发器/ 176 4.1 触发器资源 / 176 4.2 建立时间和保持时间 / 183 4.3 亚稳态 / 185 4.4 控制集 / 188 4.5 复位信号的代码风格 / 194 4.6 同步边沿检测电路代码风格 / 204 4.7 串并互转电路代码风格 / 206 4.8 避免意外生成的锁存器 / 211 4.9 思考空间 / 216 第5 章 优化移位寄存器/ / 218 5.1 移位寄存器资源 / 218 5.2 移位寄存器的代码风格 / 222 5.3 移位寄存器的应用场景 / 234 5.4 管理时序路径上的移位寄存器 / 236 5.5 思考空间 / 240 第6 章 优化存储器/ 242 6.1 存储器资源 / 242 6.2 单端口RAM 代码风格 / 255 6.3 简单双端口RAM 代码风格 / 269 6.4 真双端口RAM 代码风格 / 277 6.5 RAM 的初始化与ROM 代码风格 / 284 6.6 同步FIFO 代码风格 / 289 6.7 异步FIFO 代码风格 / 302 6.8 平衡Block RAM 的功耗与性能 / 310 6.9 异构RAM / 312 6.10 以IP 方式使用RAM 和FIFO / 312 6.11 以XPM 方式使用RAM 和FIFO / 319 6.12 管理时序路径上的Block RAM 和UltraRAM / 322 6.13 思考空间 / 328 第7 章 优化乘加运算单元/ / 330 7.1 乘加器资源 / 330 7.2 以乘法为核心运算的代码风格 / 337 7.3 复数乘法运算代码风格 / 363 7.4 向量内积代码风格 / 377 7.5 以加法为核心运算的电路结构 / 379 7.6 管理时序路径上的乘加器 / 384 7.7 思考空间 / 385 第8 章 优化状态机/ 386 8.1 基本概念 / 386 8.2 状态机代码风格 / 388 8.3 状态编码方式 / 409 8.4 基于ROM 的控制器 / 413 8.5 思考空间 / 414 第9章 优化扇出/ 416 9.1 生成扇出报告 / 416 9.2 利用设计流程降低扇出 / 418 9.3 利用约束降低扇出 / 420 9.4 从代码层面降低扇出 / 424 9.5 改善扇出的正确流程 / 424 9.6 思考空间 / 425 第10 章 优化布线拥塞/ 426 10.1 布线拥塞的三种类型 / 426 10.2 利用设计流程改善布线拥塞 / 428 10.3 利用约束缓解布线拥塞 / 430 10.4 从代码层面降低布线拥塞程度 / 431 10.5 缓解布线拥塞的正确流程 / 431 10.6 思考空间 / 432