参考视频:中国大学MOOC 芯动力——硬件加速设计方法 (2.2节)
本篇所有内容来源于《芯动力——硬件加速设计方法》此课程的教学视频 、ppt等相关资料
在RTL书写中如何考虑延迟
例子1:
多if语句逻辑综合工具会将其映射为有优先级的级联的多路选择器。
问题: 假设b信号的延迟较大,到来较晚,那么,电路应该如何修改?
原则上,把b信号这个赋值支路放在最后一个mux上,这样可以隐藏其较大的延迟。
直接把b这个分支放在最后,这样修改是否可行?
修改前电路的功能:
sel[0]=0、sel[1]=1、sel[2]=0、sel[3]=0,z=b。
如果sel[2]和sel[3]有一个不等于0,z≠b。
修改代码:把if(sel[1]) z=b分支放在最后
只要sel[1]=1,z=b。
结果: 这和原有的电路的逻辑是不一样的。
修改方案:
需要将原有输出为b的条件都放在最后一个分支。
例子2:
当if语句中有一个控制信号来的比较晚。如何针对这个信号进行优化?
优化策略:
尽可能把这个延迟较大的分支单独拿出来,放到离出口最近的选择器中。
分析Z=A[4]这个分支的触发条件
首先
这个条件为真,其次, 其他条件为假。
把其他条件为真的结果进行汇总。形成pre_cond值。
否则等于其他分支的值
例子3
分析单if语句嵌套case语句。case语句有一个分支到来的比较晚。怎么优化?
下面的代码对应的电路结构是什么?
对应的电路:case并行的mux,串联一个单if并行mux。
优化的思路:
把case中尽可能晚到的数据支路,放到最后一级mux中
对if else和case中的其他支路条件进行提取
总结FIRST_IF信号,将最终结果判断放在单独always块中
如果FIRST_IF=0,而且DATA_is_late_arriving这个条件成立,最终的输出为晚到的数据
否则输出原有其他分支的结果
例子4
这个电路, 首先,一个MUX,选出来PTR,连续经过减法器、然后经过加法器,得到结果count。
和前面的例子区别,前面的例子是解决分支支路的延时。
假设控制信号CONTROL来的比较晚,针对这种数据通道的电路。如何修改提高电路性能
注意"先加后选"和"先选后加"两种方法对数据通道延迟的影响。
本例选择先选后加,使得本来就比较慢的控制通道,延迟变得更大。
优化策略:
选择先加后选,将原有数据通道复制,然后将选择信号放在最后,改善选择信号延迟。
例子5
这个代码中包含一个加法器和一个比较器。假设A信号到来较晚,如何修改能够提高电路性能?
优化策略:
调整A信号计算顺序
重点关注电路中的加法器、乘法器等较为复杂的逻辑单元,尽可能少使用。
在RTL书写中如何考虑面积
随着芯片工艺的进步和生产成本的降低.面积显得没有时序问题重要。
但减少设计面积意味着成本降低、功耗降低,特别是对于FPGA的设计,直接决着FPGA 的选型。
一般综合过程中可以对面积进行优化,但在RTL编码中如果注意节约设计面积,往往可以达到事半功倍的效果。
怎样去减少设计的面积
- 首先应该学会估计设计使用资源的数量(如使用了多少个触发器、加法器、乘法器。这个过程也可以借助一些工具完成)
- 最终应该知道设计中哪些部分占用了较大的面积,进而分析改进的方法。
在设计中考虑改进的攻点:
一般来说,触发器的数量由功能决定,很难减少,同时触发器的面积比较好估计,因此
和时延问题一样,组合逻辑是改进的攻点。对应到RTL代码,就是各种操作符。
因此,应该了解各种操作符会产生的电路。
优化设计中的操作符
以下这些操作符都可能产生较大的组合逻辑,使用时应加以重视:
- ”+”、“-"、“×”、“÷”
- 条件语句中的比较运算
要知道,RTL代码中的一个“+"可能对应着一个64位的加法器。
对于这些操作,首先应该判断其必要性,是否能用更简单的运算代替。
对定值数据优化
例子:
32的二进制表示:6' 10_0000
如果A<32,说明A [5]<0
所以,只要判断A[5]是否等于1,就可以判断A是否小于32
这样就可以使用一个1bit的逻辑门代替了6bit的比较器。
碰到像32这样的定值数据,都可以这么考虑。
资源共享优化
如果,必须使用复杂的运算符,则应考虑是否可以资源共享。
尽管电路逻辑综合工具也会在综合的过程中采用资源共享的方法进行优化,但是,综合器的策略是有限的,因此,在编写RTL的时候,应该尽量考虑共享,而不是把这项工作完全留给综合工具。
例子:
这样可以减少两个不必要的加法器,
实际的设计中资源共享可能 不会像这样明显,因此,平时应该按照这样的思路多多练习
优化设计中的多比特信号
除了操作符,多比特的信号也往往会占用较大的资源
因为使用这些信号的操作都是对所有的比特进行的,相当于成倍使用资源。因此,对这类信号的操作也应重视。
应该看一看这个信号的所有比特是否都需要参与操作,如果不 是,则可以只对需要的部分比特进行操作。
例子:
访问一RAM的地址有8比特,而写入操作时从0开始,每隔32个地址写入一 个值,地址的产生可以有两种写法。
总结:
除此之外,针对不同的设计,还有可能有各种各样的优化和改进的方法,但是,归结到
一点,就是编写代码时,应对操作符有足够的重视,对有可能简化的地方尽量简化。逻辑简化往往在减少面积的同时也减少了延迟,因此,是值得花费一些时间的。
在RTL书写中如何考虑功耗
电路动态功耗计算公式:
因此,低功耗设计的方法,基本上是减小a、f、c、v。
但是负载电容c和工作电压v是RTL设计无法改变的因数。
所以在RTL级主要考虑尽量降低电路的翻转频率
功耗控制设计方法
对于功耗控制,主要措施包括如下:
(1)门控时钟
门控时钟是电路设计最常用也是最有效的方法,在逻辑综合阶段可以让综合工具自行插入。
(2)增加使能信号,使得部分电路只有在需要工作时才工作
(3)对芯片各个模块进行控制,在需要工作时才工作
(4)尽量减少毛刺在电路中的传播
除了有用信号和时钟的翻转会消耗功耗,组合逻辑产生的毛刺也会大量消耗功耗。
但是,毛刺在设计中无法避免,因此,只有尽量减少毛刺在电路中的传播,才可以减少功耗。即,在设计中,尽量把产生毛刺的电路放在传播路径的最后。
另外,可以使用一些减少毛刺的技术
(5)对于有限状态机,可以通过低功耗编码来减少电路的翻转。
举例:从状态A到状态B
总结
使用这些技术时,注意:
- 首先考虑全局的功耗控制
- 然后再RTL编码中,注意消耗功率较多的电路(如状态机、译码器、多路选择器等)
- 最后,在综合中,使用门控时钟和其他减少功耗的优化技术
门控时钟和增加使能控制的区别:
- 增加使能:仅仅是使得电路的信号不在翻转,但是时钟每个周期还会继续翻转。
- 门控时钟:直接关掉时钟。(这种方法效果更好)
在RTL书写中如何考虑布线(route)
布线(routing) 芯片设计最后的阶段
布线(routing) 功能 - 根据门级网表 的描述实现各个单元的连接
布线(routing) 是否成功,布局 (placement) 是最关键的因素
但即使使用最好的布局工具,还是可能出现无法布通的情况。 出现这种问题,往往要去修改RTL级设计。
如果可以在RTL编码阶段考虑代码可能对布线产生的影响 就可能避免最后出现无法布通的情况。
热点
布线阶段,通常热点是一个影响布线质量的问题。
热点是指设计的功能需要在一个面积内占用大量的布线资源
热点产生原因:RTL编码时使用了特定的结构,如很大的 MUX
例子:
这种结构产生的热点,在综合的时候,导致的延迟是看不出来的 ,只有到了 布线阶段才能给看到它的负面影响。
因此,我们在RTL阶段应该重视这种电 路,及早发现可能在布线阶段产生的问题。
如果设计的功能中确实需要采用大的mux,可以通过其他方式改变他的结 构。
其基本的思路是将一个大的mux分解为多级较小的mux
参考视频:中国大学MOOC 芯动力——硬件加速设计方法 (2.2节)