1.2低延迟优化
所谓的低延迟设计是指尽可能快让数据从输入到输出通过设计,我们可以通过最小化中间处理的延时来达成此目的。常常,一个低延迟设计需要并行处理,移除一些流水线操作。有时候甚至需要改变一下原本逻辑设计的方法,找到一个延时更小的实现方法,即所谓的逻辑short cut。上述措施的后果是可能会使得设计的吞吐量减少,或者会降低设计的最高时钟速度。
回到上一节我们讨论的求3次方那个例子,迭代的实现方法中由于每次乘法操作后都必须被寄存等待下一次操作,所以这种方式没有明显的对延迟的优化。而流水线的实现方式中,我们可以很清楚地看到延迟的减少。注意流水线每一级的乘法结果都必须等到下一个时钟沿到来时才能被传送到下一级流水。因此,我们可以通过移除流水寄存器来最小化输入到输出的延迟,我们看看下面这段代码示例:
module power3(
output [7:0] XPower,
input [7:0] X
);
reg [7:0] XPower1,XPower2;
reg [7:0] X1,X2;
assign XPower=XPower2*X2;
always@*begin
X1=X;
XPower1=X;
end
always @* begin
X2=X1;
XPower2=XPower1*X1;
end
endmodule
上例中,寄存器被剥离出了流水线。每一级都是使用组合逻辑表达式来显示上一级的结果,如图1-3所示。
图1-3:低延迟实现方式
我们来看看图1-3所示的实现方式下设计的性能:
l 吞吐量=8bits/时钟周期(每个时钟周期只有一个新的输入数据)
l 延迟=只有一个和两个乘法器延时,无时钟周期延迟
l 时序=存在两个乘法器的关键路径
通过以上分析,可以看出移除流水寄存器后,该设计的延迟减小到小于一个时钟周期。所以我们可以得出这样一个结论,即延迟可以通过移除流水寄存器来减小。只是这样的带来的明显后果是时序。图1-2所示的设计理论上是可以运行的系统时钟,其时钟周期接近一个乘法延迟,而图1-3所示的设计的系统时钟周期至少是两个乘法器的延迟,而且还要根据具体实现加上关键路径上的其它逻辑延时。所以移除流水寄存器在减少延迟的同时,也带来了寄存器之间组合逻辑延时的增加。