FPGA设计优化(1.3)

本文探讨了FPGA设计中面临的挑战,如规模扩大、编译时间和时序收敛困难。针对这些问题,介绍了Vivado ML如何通过机器学习算法优化设计流程,特别是其智能设计流程(IDR)对提高时序性能的贡献。此外,文章强调了FPGA设计的四大基本原则:硬件原则、同步原则和流水原则,指导设计者如何提高综合质量和加速时序收敛。
摘要由CSDN通过智能技术生成

1.3 面临的挑战

        当前的FPGA设计规模越来越大,好在FPGA芯片的规模也越来越大,但设计的复杂度也越来越高,主要体现在较多的输入/输出管脚、较高的总线位宽、较大的扇出及较高的逻辑级数方面。带来的直接后果是编译时间过长、资源利用率过高、次优布局、布线资源消耗太多、时序收敛较困难等,这也是目前FPGA设计面临的一些挑战。另外,有些FPGA设计要求时钟运行在300MHz甚至400MHz以上,这样面临的挑战将会更多。
        以VU9P为例,其可用资源及某设计中的资源利用率如表1-6所示。Vivado版本为2018.3,服务器操作系统为Linux 64位,完成一次编译(从综合到生成.bit文件)至少需要十几小时。当设计的时钟频率为400MHz时,完成一次编译则需要二十多小时甚至更长,有时还无法实现时序收敛,导致反复迭代,从而消耗更多时间。

        在这些挑战中,时序收敛在多数情况下是设计者面临的最大挑战。传统的时序收敛流程如图1-31所示,分为两大阶段:综合阶段和布局布线阶段。综合阶段只要满足WNS(Worst Negative Slack,最差建立时间裕量)等于0即可进行布局布线,这个目标通常比较容易实现。而布局布线阶段的时序收敛往往涉及多方因素,需要设计者对工具特性、设计本身深入理解,同时有一定的经验积累。因此,这个过程有可能出现反复迭代。

        针对布局布线阶段的时序收敛,通常需要采用如图1-32所示的流程。这个流程的关键点是分析时序违例原因,分析的对象并不是所有的时序违例路径,而是最为关键的几条时序违例路径。实践表明,往往只用手工修复这些关键时序违例路径,工具会自动修复其他时序违例路径。找到原因之后才能有的放矢地找到解决办法。一般情况下,出现时序违例的原因包括:逻辑延迟太大、布线延迟太大、时钟偏移或时钟抖动太大。若确定原因是逻辑延迟太大,那么可能的解决办法有两种:插入流水寄存器和采用重定时。前者需要修改代码,由于增加流水寄存器会导致从输入到输出所需要的时钟周期个数发生改变,多条路径的数据需要重新对齐,改动量可能会比较大;后者无须改动
代码,但需要确定是在综合阶段设置重定时还是在布局布线阶段设置重定时,是全局设置(使用全局设置选项)还是局部设置(使用模块化综合技术)。这两种解决办法到底哪个是最优解?这需要尝试,也需要设计者积累足够的经验,同时比较耗时。尤其是在多个解决办法无法并行执行时,耗时更多。

        为了应对这些挑战,我们不仅要从设计本身入手,还要从EDA工具的角度入手,以期工具能够帮助我们缩短编译时间、提高编译质量。这就要提到Vivado ML(Machine Learning)版本。
        Vivado ML的首个版本是2021.1。其在设计的多个阶段引入了机器学习算法。例如,在综合阶段,引入了基于机器学习算法的门级优化,从而大大提高了综合质量并且将综合时间平均缩短了30%;在布局布线阶段,引入了基于机器学习算法的拥塞评估和延迟评估,从而有效减少了迭代次数并将布局布线时间平均缩短了20%;其最大亮点在于引入了智能设计流程(Intelligent Design Run,IDR)。该设计流程专门为时序收敛服务,共包含3个阶段,如图1-33所示。阶段1,工具会从5个方面,即时序约束、资源利用率、时钟网络、布线拥塞和时序违例路径进行优化,生成相应的优化建议(通常以Tcl脚本的方式呈现),并自动将这些建议施加到对应的子步骤(实现阶段1的4个子步骤 , 对 应 的 Tcl 命 令 分 别 为 opt_design 、 place_design 、phys_opt_design和route_design)中。该阶段结束后,工具会对所有的布线后的网表进行比较,选取WNS最小者,获取其中有效的优化建议供阶段2或阶段3使用。阶段2在阶段1的基础上(继承了阶段1的结果,即继承了有效的优化建议),工具会采用机器学习算法生成3个布局布线策略。阶段3为增量编译阶段。实验数据表明,IDR可以给设计带来平均10%的收益,即Fmax(设计可运行的最高时钟频率)可提升10%。

        IDR有单独的窗口,如图1-34所示。采用一键式操作,中间过程无须人工干预。从这个角度而言,IDR对设计者的经验积累的要求并不高。图1-35显示了未使用IDR时最终的时序性能。与图1-34对比,可以看到,IDR使WNS从-1.040ns变为-0.158ns,同时修复了保持时间违例。

1.4 四大基本原则

        尽管FPGA设计越来越复杂,但只要遵循一些基本的原则,就可以提高综合质量、减轻布局布线压力、减少设计迭代次数、加速时序收敛进程。

1.4.1 硬件原则

        FPGA 设 计 采 用 的 主 要 编 程 语 言 包 括 VHDL 、 Verilog 和SystemVerilog,三者均属于硬件描述语言(Hardware DescriptionLanguage,HDL),其中,SystemVerilog因其在验证方面显示的强大功 能 又 被 称 为 硬 件 描 述 与 验 证 语 言 ( Hardware Description andVerification Language,HDVL)。硬件描述语言,顾名思义,其描述的对象是硬件电路,是实实在在存在的硬件电路,这要求我们必须采用HDL可综合的部分进行电路设计,遵循可综合的代码规范。设计者需
要了解所用的HDL哪些是可综合的,哪些是不可综合的。例如,延迟语句,无论是VHDL中的wait for语句,还是Verilog或SystemVerilog中的“#延迟时间”(延迟时间为具体数字),均是不可综合的。同样,除法运算“/”也是不可综合的(只有当除数为2的整数次幂时才可综合,此时等效于右移操作)。从数据类型的角度而言,实数(Real)是不可综合的。
        相比软件编程语言(如C/C++),HDL具有两大特征:并发性和时序性。并发性体现在同一模块中的不同进程(VHDL中的process,Verilog中的always,SystemVerilog中的always_ff、always_comb和always_latch)是同时执行的,这反映了硬件电路的特征:一旦上电,同时工作。时序性则体现了不同数据路径在时钟作用下的相互关系及时序路径与控制路径的关系。时序是设计出来的,不是凑出来的,更不是测出来的。就这点而言,在开始编程之前,要有待设计电路的基本雏形。例如,要设计一个复数乘法器,就要先画出如图1-36所示的硬件电路,图中,D表示D触发器,第一个复数的实部和虚部分别为ar和ai,第二个复数的实部和虚部分别为br和bi。从图1-36中也可以看出各数据路径之间的时序关系。“先有电路,再写代码”,RTL代码的每一条语句都有与之对应的电路单元。

        硬件原则还要求我们对所选用的FPGA的内部结构有所认识和了解,以确保RTL代码风格与FPGA内部结构相匹配,这样才能保证综合电路的质量。例如,7系列FPGA中的触发器复位信号只支持高电平有效,如果代码中的复位是低电平有效,就会消耗额外的查找表(用于逻辑取反),而UltraScale/UltraScale+FPGA中的触发器既支持高电平有效,又支持低电平有效。7系列FPGA中的DSP48不支持异步复位,因此,如果代码中描述的乘法器使用了异步复位,那么相应的触发器是
无法被吸收到DSP48内部的。
        综上所述,硬件原则如下。
        (1)使用可综合的HDL代码描述电路。
        (2)先有电路,再写代码。
        (3)RTL代码风格与FPGA内部结构相匹配。

1.4.2 同步原则

        同步原则指的是整个设计采用同步时序电路,“同步”意味着设计中的所有逻辑单元“步调保持一致”,即所有电路在同一时钟沿的触发下同步处理数据。这样看来,设计中只允许存在一个时钟,我们把这种“同步”称为狭义的同步。毕竟,随着芯片规模增大和设计复杂度增加,设计中的时钟个数也越来越多。例如,外部存储器接口时钟、以太网接口时钟、PCIE接口时钟、PS侧时钟、PL主时钟等。因此,我们又引入了广义的同步。这里我们先给同步时钟下定义,所谓同步时钟,是指时钟组(一个时钟组至少有两个时钟)内的时钟之间有明确的相位关系。反之,若时钟组内的时钟之间没有明确的相位关系,则认为它们是异步时钟。最典型的同步时钟场景是时钟组内的时
钟是由同一个MMCM/PLL生成的,而异步时钟场景是时钟组内的时钟由不同MMCM/PLL生成,如图1-37所示。在图1-37中,clk0和clk1是同步时钟,clka和clkb是同步时钟,但{clk0,clk1}和{clka,clkb}是异步时钟。从而,模块1内存在同步跨时钟域电路,而模块2内存在异步跨时钟域电路。显然,后者无论是电路设计还是时序约束都更为复杂。因此,广义的同步是指电路在同步时钟的作用下处理数据。

                尽管当前的FPGA设计允许存在多个时钟,仍要遵循“时钟个数尽可能少”的原则。一方面可以简化跨时钟域电路,另一方面有利于时序约束和时序收敛。这就要求我们在设计初期制定时钟方案时就要明确设计中有哪些时钟,它们之间的关系如何,是否可以由同一个MMCM/PLL生成。
        之所以遵循同步原则,还因为相比异步设计,同步设计有着明显的优点。首先,同步设计可以有效地避免毛刺的影响,增强设计的稳定性。组合逻辑可能会产生毛刺,如果毛刺仅存在于同步时序的数据路径中,那么受时钟驱动的触发器就可以过滤掉毛刺,因为触发器仅在时钟有效沿才会有动作,从而消除其对电路的影响。如果将该组合逻辑的输出连接到触发器的控制端,如作为触发器的异步复位/置位信号,那么当毛刺足够宽时,就可能导致触发器误动作。即使毛刺的宽度不足以驱动异步复位/置位端,也会造成触发器不稳定,甚至激发其产生亚稳态。其次,同步设计可以减少外部环境对芯片的影响。芯片的实际工作环境可能要比实验环境更为恶劣,这也是我们做高低温实验的一个主要原因,即检测当前设计是否能在不同环境下正常工作。此外,长时间运行也会使芯片自身温度升高,使电压变得不稳定,芯片内部延时可能会发生微小变化。如果采用异步设计,对时序要求比较严苛的电路将无法正常工作,这是因为异步设计的时序正确与否完全依赖于每个逻辑元件的逻辑延时和布线延时。最后,同步设计更有利于静态时序分析(Static Timing Analysis,STA)和验证设计的时序性能。这得益于同步设计的时序约束更为简单。即使对于同步跨时钟域路径,工具也可以自动对其进行约束,当然有时会出现约束不合理的情形。

1.4.3 流水原则

        流水原则是指要求我们在设计中使用流水线设计方法将数据处理流程分割为若干个子步骤,使数据在这些子步骤中流动起来。如图1-38所示,假定某处理流程可分解为读操作、计算操作和写
操作3个步骤,采用流水线方式就是在这3个步骤之间插入流水寄存器。这样处理流程就由顺序方式变为流水线方式,顺序方式和流水线方式如图1-39所示,这样带来的好处也是显而易见的,不仅提高了处理速度,而且降低了从输入到输出的总时钟周期个数(Latency)。使用流水线技术是有要求的:数据流是单向流动,不存在反馈支路。流水线技术也体现了FPGA处理数据的特征:动态处理。

        利用这个思想,从微观角度而言,我们可以把一段长路径切割为多段短路径,在每段短路径之间插入流水寄存器以暂存中间数据,目的仍是将一个大操作分解为若干个小操作,而每个小操作比大操作的延时要小,因此可以提高时钟频率,同时,各个小操作可以并行执行,因此又能提高数据吞吐率。如图1-40所示,图中,上部路径有6个LUT,仅从逻辑延时的角度来看,总逻辑延时为6Tilo(Tilo为LUT从输入到输出的延时)。现将这6个LUT分为两组,在两组LUT之间插入寄存器,从而形成两条时序路径,每条时序路径的逻辑延时降低至3Tilo。这实际上是将路径的逻辑级数由6降至3。从这个角度而言,流水线技术也是修复时序违例的一种方法。

        FPGA芯片内触发器的个数远远多于LUT的个数,如UltraScaleSLICE内有8个LUT,但有16个触发器。因此,对于逻辑级数较高的路径,可通过插入流水寄存器的方法改善其时序性能。那么,如何判断逻辑级数是否过高呢?通常,一个“LUT+一根走线”的延迟为0.5ns( 经 验 值 , 适 用 于 Xilinx 7 系 列 FPGA 和UltraScale/UltraScale+FPGA),假定寄存器时钟周期为T,那么该路
径所能承载的最大逻辑级数为T/0.5,也就是2T。如果逻辑级数大于2T,而时序未能收敛,就可以怀疑时序违例跟逻辑级数较高有关。
        尽管流水寄存器对改善时序有所帮助,但并不意味着流水寄存器越多越好。事实上,过重的流水会导致触发器的利用率增加,这也意味着触发器控制集增加,从而会引发布线拥塞。同时应注意,增加流水寄存器会导致Latency(Latency的具体含义请参考本书1.5节)发生变化。从图1-40中不难看出,上部路径Latency为2,下部路径Latency为3。
        流水线方式的另一种形式是乒乓操作,如图1-41所示。输入数据流通过1:2解复用器分时流向两个数据缓存模块。为便于说明,假定每4个数据构成待处理的一帧数据,形成如图1-42所示的时序图。当selx为0时,数据流向数据缓存模块1,相应的数据缓存模块1的写使能信号wen1被抬高,将第一帧数据A0~A3写入;当selx为1时,数据流向数据缓存模块2,相应的数据缓存模块2的写使能信号wen2被抬高,将第二帧数据B0~B3写入,同时,缓存模块1的读使能信号被抬高,开始从数据缓存模块1中读出第一帧数据A0~A3,并传送给数据预处理模块1。当selx再次为0时,数据又流向数据缓存模块1,向数据缓存模块1写入第三帧数据C0~C3,同时,开始从数据缓存模块2中读出第二帧数据B0~B3并传送给数据预处理模块2,如此循环。从而,数据缓存模块1中存储的永远是奇数帧数据,数据缓存模块2中存储的是偶数帧数据。数据缓存模块1在执行写操作时,数据缓存模块2在执行读操作,而数据缓存模块1在执行读操作时,数据缓存模块2在执行写操作。这样,对两个数据预处理模块而言,只要在8个时钟周期内处理4个数据即可。这实际上减轻了数据预处理模块的时序压力。两个数据预处理模块的输出端连接2:1复用器,在sely的控制下即可将预处理结果不间断地传送给下游处理单元(在图1-42中,数据预处理模块的Latency为6)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值