当前位置:   article > 正文

RTL书写与延迟、面积、功耗、布线_rtl设计csdn

rtl设计csdn

RTL书写与延迟、面积、功耗、布线

延迟

设计方法

  • 将延迟较大的信号放在最后一个选择器上,从而隐藏其较大的延迟。
  • 对电路的修改不应该影响其原有的逻辑。

if语句输入信号延迟

  • 提取输出
  • 提取条件
//修改前
module mult_if(
input			a,b,c,d,
input	[3:0]	sel,
output	reg		z
    );
always@(*)begin
    z = 1'b0;
    if(sel[0])z = a;
    if(sel[1])z = b;
    if(sel[2])z = c;
    if(sel[3])z = d;
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

//如果如果b信号来的最晚
//修改后
always@(*)begin
	z = 1'b0;
    if(sel[O])z = a;
    if(sel[2])z = c;
    if(sel[3])z = d;
    if(sel[1]&~(sel[2] | sel[3]))z = b;//提取了分支输出和分支条件,不影响原电路的优先级,但增加了电路的面积。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

if语句控制信号延迟

  • 提取延迟信号所在分支输出,作为最后一级的选择器的一个输入信号。
  • 提取出去延迟分支后的电路输出,作为最后一级选择器的一个输入信号。
  • 提取延迟信号所在分支的执行条件,作为最后一级选择器的选择信号。

单if语句嵌套case语句,case语句的分支来的比较晚。

  • 将case中延迟最大的数据支路,放到最后一级MUX中作为一个输入信号。

  • 提取延迟信号所在分支的执行条件,作为最后一级选择器的选择信号。

  • 对if else和case中的其他支路条件进行提取,作为最后一级选择器的选择信号。

先加后选和先选后加

  • 如果选择信号来的较晚可以选择先加后选

调整信号计算顺序

module mult_if(
input           [3:0]   A,B,C,D,
//input	[3:0]	sel,
output	reg     [3:0]   Z
    );
always@(A,B,C,D) begin
    if(A + B < 'd24)
        Z <= C;
    else
        Z <= D;
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

//如果A信号晚到,对计算顺序进行优化
module mult_if(
input           [3:0]   A,B,C,D,
//input	[3:0]	sel,
output	reg     [3:0]   Z
    );
always@(A,B,C,D) begin
    if(A<'d24 - B)
        Z <= C;
    else
        Z <= D;
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

面积

  • 减少设计面积意味着成本降低、功耗降低。

  • 减少面积的方法:

    • 了解使用资源的数量(使用了多少个触发器、加法器、乘法器)。

    • 触发器的数量由功能决定,很难减少。

    • 了解各种操作符会产生的电路,对组合逻辑进行优化。

优化设计中的操作符

  • 会产生较大电路的操作符:”+”、“-"、“×”、“÷”。

  • 条件语句中的比较运算。

  • 设计方法:对于这些操作,首先应该判断其必要性,是否能用更简单的运算代替。

对定值数据优化

  • 32的二进制表示:6’b10_0000;

  • 对于一个位宽为6的数据A,如果A<32,说明A[5]<0;

  • 使用了一个1bit的逻辑门代替了6bit的比较器。

资源共享优化

如果,必须使用复杂的运算符,则应考虑是否可以资源共享。

if(y1>a+b+q)
	statement1;
if(y2>a+b+r)
	statement2;
if(y3>a+b+s)
	statement3;
//优化后,减少了两个加法器

sum<=a+b;
if(y1>sum+q)
	statement1
if(y2>sum+r)
	statement2
if(y3>sum+s)
	statement3;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

多比特信号

多比特的信号也往往会占用较大的资源,因为使用这些信号的操作都是对所有的比特进行的,相当于成倍使用资源。
观察操作是否需要多比特信号的所有位宽,如果不是,则可以只对需要的部分比特进行操作。

//访问一RAM的地址有8比特,而写入操作时从0开始,每隔32个地址写入一 个值,地址的产生可以有两种写法。

//优化前
addr<=addr+'d32
//优化后
addr[7:5]<=addr[7:5]+1'b1;
addr[4:0]<=addr[4:0]+1'b0;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

功耗

P d = ∑ a f C V 2 P_d=\sum_{}^{}{afCV^2} Pd=afCV2

P d P_d Pd:电路割点的功耗总和, a a a:该点电路的反转次数, f f f:电路的工作频率, C C C:该点的电容, V V V:电压值。

  • 负载电容c和工作电压v是RTL设计无法改变的因数。

  • RTL级设计降低功耗主要考虑降低电路的翻转频率。

  • 组合逻辑产生的毛刺也会大量消耗功耗,但毛刺在设计中无法避免,只能尽量减少毛刺在电路中的传播从而降低功耗。

功耗控制主要措施:

  • 使用门控时钟,门控时钟是电路设计最常用也是最有效的方法,在逻辑综合阶段可以让综合工具自行插入。

  • 增加使能信号,使得部分电路只有在需要工作时才工作

  • 对芯片各个模块进行控制,在需要工作时才工作

  • 减少毛刺在电路中的传播,尽量把产生毛刺的电路放在传播路径的最后。另外,可以使用一些减少毛刺的技术。

  • 对于有限状态机,可以通过低功耗编码来减少电路的翻转。

//状态转移
A:0101
B:1010
每次转移四个信号发生翻转
A:0101
B:0100
每次转移一个信号发生翻转
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

门控时钟和增加使能控制的区别:

  • 增加使能:电路的信号不在翻转,但时钟每个周期还会继续翻转。

  • 门控时钟:直接关掉时钟。(效果更好)

布线

  • 布线(routing):根据门级网表的描述实现各个单元的连接,是芯片设计的最后阶段。

  • 布线(routing) 是否成功,布局 (placement) 是最关键的因素

  • 但即使使用最好的布局工具,还是可能出现无法布通的情况。 出现这种问题,往往要去修改RTL级设计。

  • 在RTL编码阶段考虑代码可能对布线产生的影响,从而避免无法布通的情况。

热点

  • 热点是指设计的功能需要在一个面积内占用大量的布线资源,会影响布线质量。

img

  • 热点产生原因:RTL编码时使用了特定的结构,如很大的 MUX。
  • 这种结构产生的热点,在综合时导致的延迟无法看出 ,只有到了布线阶段才能给看到其负面影响。

在这里插入图片描述

  • 设计方法:将一个大的mux分解为多级较小的mux。

在这里插入图片描述

参考资料:

芯动力——硬件加速设计方法

可综合风格——在RTL书写中如何考虑延迟、面积、功耗、布线

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/807907
推荐阅读
相关标签
  

闽ICP备14008679号