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

本文讨论了在RTL设计中如何通过调整信号处理顺序、优化操作符、使用门控时钟和使能控制、分解大MUX等策略来减少延迟、减小面积、控制功耗以及改善布线。通过实例展示了如何在保持逻辑正确性的前提下,提升设计效率和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

//如果如果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;//提取了分支输出和分支条件,不影响原电路的优先级,但增加了电路的面积。

在这里插入图片描述

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

在这里插入图片描述

//如果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

在这里插入图片描述

面积

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

  • 减少面积的方法:

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

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

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

优化设计中的操作符

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

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

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

对定值数据优化

  • 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;

多比特信号

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

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

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

功耗

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
每次转移一个信号发生翻转

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

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

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

布线

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

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

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

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

热点

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

img

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

在这里插入图片描述

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

在这里插入图片描述

参考资料:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值