FPGA之道(59)时空变换之时域优化

前言

疫情已经持续到了3月,今天是三月初,前几日在修改论文,想来今天是新的一月的开始,应该更新博客了,日子虽然都是数字,但有些日子注定拥有特殊的记号。
本来想着应该更新数的表示以及数的运算,但是确实在FPGA中完成原本我们认为十分简单的东西具有一定的难度,十分的繁琐,还是更新下FPGA设计的思路,今天是有关时空转换的,为了博文不能太长,选择分为几部分来更新。
本文依然选自《FPGA之道》,让我们站在巨的肩膀上,开始冲鸭。

时空变换之基本概念

时空概念简介

时钟速度决定完成任务需要的时间,规模的大小决定完成任务所需要的空间(资源),因此速度与规模其实就是FPGA设计中时间与空间的体现。对于FPGA设计来说,时间和空间这两因素就好比阴、阳之于太极,乾、坤之于八卦一样,它们相互依存却又相互制约,唯有达到平衡,方可天下太平。
如果要提高FPGA设计的时钟速率,那么每一个时钟周期内组合逻辑所能做的事情通常就越简单,因此为了实现同样的功能往往会造成资源的膨胀。与此同时,由于时钟速度越快,对资源排列关系的要求就越紧凑,可是资源的膨胀会导致资源占用率提高,进而导致在FPGA芯片内进行布局布线的难度增大,这也就导致资源更难变得紧凑,从而又会给时钟速度的提高带来一定的负面影响。
如果要降低FPGA设计的规模,一般来说,以前多个模块做的事情就需要由一个模块来完成,那么为了能在同样的时间内完成同样的任务,那么就必须提高该模块的执行速度,即时钟频率,而时钟频率的提高又可能会导致该模块一定的资源膨胀,从而又会给设计规模的降低带来一定的负面影响。
上面的讨论中蕴含了FPGA设计的时空互换定律,那就是——如果时间吃紧,空间有余,就拿空间来换时间,虽然空间的增加可能对时间又会产生一些负面影响,但是通常利大于弊;反之,如果空间吃紧,时间有余,就拿时间来换空间,虽然时间的减少可能对空间又会产生一定负面影响,但是通常利也是大于弊的。
鉴于此,可以推断出:如果FPGA设计的规模预期比较大,那么它布局布线的难度就会较大,同一功能聚类的资源就较难紧密排列,因此时钟速度就不可能太高,如果FPGA设计的时间预期也比较高,那么由于时钟速度的限制,要在规定的时间内完成同样的任务就需要更多的资源来实现任务分担,这又反过来导致了设计规模的变大。因此现实中,不可能存在时间、空间均最优的FPGA设计,若要这么做,无异于痴人说梦。但是残酷的现实往往会逼迫每一名FPGA开发者朝这个方向进行努力,因为随着集成度的越来越高、功能需求的越来越复杂等等因素,客观环境要求我们必须设计出又快又省的FPGA设计才能够最终完成项目、迅速赢得市场。因此,为了满足各种苛刻的需求,每一个FPGA开发者都必须了解并能运用时空变换的相关技术,以使自己的设计达到时间、空间的综合最优。
那么由时空互换定律出发,凡是能够在这两种因素之间做到随意调配的人,必是FPGA设计师中的“大虾”!凡是能够根据实际情况达到时空完美平衡点的作品,必是FPGA设计中的“杰作”!因此,写HDL代码前先对自己的FPGA设计做一个时空的评估,找准设计的时空平衡点,是指导整个设计走向的重要参考。

时空变换方案

当FPGA设计的性能或者预期的性能不能满足项目的需求时,就是需要运用时空变换定理的时候。总的来说,时空变换定理在运用时可以具体划分为四项工作内容,即——时域优化、空域优化、时间换空间以及空间换时间。 那么当我们需要对FPGA设计的性能进行优化时,通常的做法应该是这样的:

  • 首先,利用时域优化来去除设计在时间方面的冗余,利用空域优化来去除设计在空间方面的冗余。如果这样处理后的设计已经能满足需求,那最好不过;即使仍然达不到要求,经过如此处理后的设计也分别在空间和时间上腾出了更多的余量,而余量是时空变换定理得以应用的前提。
  • 其次,根据设计与需求之间的矛盾,如果是时间不够了,那么就想办法用空间换时间;如果是空间不够了,那么就想办法用时间换空间。
  • 第三,由于一些时空变换的方法会改变原有逻辑电路的组织结构,因此变换后的逻辑电路很可能具有进一步进行时域优化、空域优化的余地,所以可以利用这一点进一步提升逻辑电路的性能。
  • 最后,在FPGA设计中,没有什么方案是永远最优的,也没有什么方案是永远最差的,我们所要做的并不是竭尽全力去找寻最优的方案,而应该是集中精力找到最适合当前需求的方案。

上述即为常用的时空变换方案,接下来将具体讨论时空变换时所涉及到的四类工作:

时空变换之时域优化

本小节我们主要关注时域内部的优化方法。注意,在做时域优化时,往往是不以牺牲空域余量为前提的,因为它的目的主要是去除时域内部的一些冗余。接下来,将为大家介绍几类比较常用的时域优化方法:

逻辑化简

逻辑化简讨论

逻辑化简是最最基本的冗余去除方法,也是最最有效的冗余去除利器。无论是针对组合逻辑还是时序逻辑,异或是针对时域还是空域,逻辑化简会给所有方面都带来好处。因为逻辑简化了,首先实现该功能需要的逻辑门和触发器数量往往就会减少,因此组合逻辑和时序逻辑中的冗余都得以剔除,进而对空域带来了优化效果;其次,组合逻辑更加精简了,布局布线更加容易了,时域更容易达到较好的性能,并且逻辑的化简很可能导致组合逻辑的级数减少,而这将直接对时域的性能产生大幅提升。
当然,编译器在对FPGA设计进行编译的过程中,也会同时对逻辑进行一些优化,不过其程度毕竟有限。并且,作为一个合格的FPGA开发者来说,应该更多的掌握自己的命运,而不是交由编译器去处置。因此在进行FPGA设计及HDL代码描述时,我们还是应该注重多做一些逻辑化简工作的,不求将所有逻辑都化简到最简,但求不要在我们的FPGA设计中存在过多较为明显的冗余。
逻辑化简的方法有很多种,这里就不再赘述。不过由于FPGA内部硬件组织结构的特殊性,导致有时候略微复杂一些的逻辑实现起来并不一定比简单的逻辑占用资源多,甚至有时候资源更省,空域性能更好;也会导致有时候略微复杂一些的逻辑实现起来并不一定比简单的逻辑时间延迟大,甚至有时候延迟更小,时域性能更好。当然了,这种由于FPGA硬件结构导致的逻辑时空性能颠倒仅仅是细节方面的微观可能,大部分时候其变化趋势仍然是与逻辑化简的程度保持一致的,而从宏观上来看,仍然是越简单的逻辑,其时空性能越好。
其实,在FPGA中,会导致时空性能出现反常现象的主要原因就是其内部的查找表(LUT)资源。通过【知己知彼篇->FPGA内部资源介绍->逻辑资源块】小节的介绍,我们了解到,FPGA内部实现组合逻辑的主要载体就是LUT资源。通常来说,为了使每个LUT都能够实现功能适中的组合逻辑,FPGA内部的LUT一般都是3、4、5或6输入的,但输出都仅有1个。因此,编译器总是要面临着将我们所描述的组合逻辑映射为多输入、单输出的LUT集合形式的工作,而这一工作,就有可能导致微观上的时空性能颠倒。不过随着编译器版本的不断更新,编译技术的不断进步,这种微观上的时空性能颠倒的可能性也会越来越小,但是作为一个FPGA开发者来说,还是有必要了解一下这种情况的具体表现和成因的,下面就来具体介绍:

空域方面的颠倒现象

有时候,逻辑上的化简并不会为最终的FPGA资源占用带来好处,例如对于以下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李锐博恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值