根据问题的内容不同,速度有三种定义流量(Throughout)、时滞(Latency)和时序(Timing)。流量定义为每个时钟周期处理的数据量;时滞定义为数据输入与处理的数据输出之间的时间;时序定义为时序元件之间的逻辑延时。根据问题不同,设计高速度的结构主要体现在以上三个方面。
1.1 高流量
简单的例子,求X的3次幂。
moudle power3(
output [7:0] XPower,
output finished,
input [7:0] X
input clk,start);
reg [7:0] count;
reg [7:0] xpower;
assign finished = (ncount == 0);
always @(posedge clk)
if(start) begin
xpower <= x;
ncount <= 2;
end
else if(!finished) begin
ncount <= ncount - 1;
xpower <= xpower *X;
end
endmodule
串行计算,计算一个输出X的三次幂需要三个时钟周期,因此流量=8/3,或2.7位/时钟。
如果采用流水线设计,计算过程可以或分在多个时钟周期。
moudle power3(
output [7:0] XPower,
input [7:0] X
input clk);
reg [7:0] x1,x2;
reg [7:0] xpower1,xpower2;
always @(posedge clk)
//pipeline stage 1
x1 <= x;
xpower1 <= x;
//pipeline stage 2
x2 <= x1;
xpower2 <= x1*xpower1;
//pipeline stage 3
xpower <= x2*xpower2;
endmodule
X的数据传递到两个流水线级,如果看单独一个数据输入的时候,从输入到输出仍然是3个时钟周期,但是流水线如果运行起来,==每个时钟周期都可以有新的输入,长期来看,基本每个时钟周期可以计算出一个输入的3次幂,==因此流量=8/1,或8位/时钟。
1.2 低时滞
通过最小化中间处理的延时来尽可能快速的把数据从输入端传递到输出端设计。方法是并行性,去除流水线,缩短逻辑。可能减少设计中的流量或降低最大时钟速度。时序逻辑要求时钟与时钟之间的处理量有限制,如果全是组合逻辑,一个时钟周期能完成所有操作,自然时滞最低。
如果直接将上一节流水线设计的三拍时钟去除,直接一拍完成,流量不会发生变化,时滞却只会在乘法器之间的延时,0时钟的延时。比较明显的缺点是计算量增加,关键路径中却存在2个乘法器延时,对时序不友好。
1.3 时序
时序取决于关键路径的延时,具体表现形式决定了一个设计的时钟速度。
F
m
a
x
=
1
/
(
T
c
l
k
q
+
T
l
o
g
i
c
+
T
r
o
u
t
i
n
g
+
T
s
e
t
u
p
−
T
s
k
e
w
)
Fmax=1/(Tclk_q+Tlogic+Trouting+Tsetup-Tskew)
Fmax=1/(Tclkq+Tlogic+Trouting+Tsetup−Tskew)
Fmax是时钟可允许的最大频率;Tclk_q是从时钟到达直至数据到达Q端的时间;Tlogic是逻辑通过触发器之间的传播延时;Trouting是触发器之间的布线延时;Tsetup是下一个时钟上升沿到达D端的最小时间;Tskew是启动触发器(发送端)和捕捉寄存器(采样端)之间时钟的传播延时。
优化方法:
- 添加寄存器层次,适用于对于时滞没有要求
- 重新组织关键路径,并行的实现逻辑结构
- 展平逻辑结构,利用无特权逻辑,尽量减少逻辑层级
错误示范:
module regwrite(
output reg [3:0] rout,
input clk,in,
input [3:0] ctrl);
always @(posedge clk)
if(ctrl[0]) rout[0] <= in ;
else if(ctrl[1]) rout[1] <= in ;
else if(ctrl[2]) rout[2] <= in ;
else if(ctrl[3]) rout[3] <= in ;
endmodule
正确示范:
module regwrite(
output reg [3:0] rout,
input clk,in,
input [3:0] ctrl);
always @(posedge clk)
if(ctrl[0]) rout[0] <= in ;
if(ctrl[1]) rout[1] <= in ;
if(ctrl[2]) rout[2] <= in ;
if(ctrl[3]) rout[3] <= in ;
endmodule
- 寄存器平衡,平等的重新分布寄存器之间的逻辑。减少任何两个寄存器之间最坏条件的延时。
错误示范:
module adder(
output reg [7:0] sum,
input [7:0] a,b,c,
input clk);
reg [7:0] ra,rb,rc;
always @(posedge clk)
ra <= a ;
rb <= b ;
rc <= c ;
sum <= ra+rb+rc ;
endmodule
正确示范:
module adder(
output reg [7:0] sum,
input [7:0] a,b,c,
input clk);
reg [7:0] rabsum,rc;
always @(posedge clk)
rabsum <= a + b;
rc <= c ;
sum <= rabsum+rc ;
endmodule
- 重新安排路径
重新安排路径使关键路径最小化,使关键路径移动到更接近目的寄存器。具体事例可以参考时序优化的几种方法-IC学习笔记(七)
1.4 小总结
- 高流量提高每秒可以处理最大位数,方法可以是流水线,拆开迭代环路。
- 低时滞是将模块输入端到输出端延时最小化,可以通过移去DFF。
- 时序定义为设计的时钟速度,也是设计较多涉及的地方,包括添加寄存器层次,设计并行化,展平逻辑结构,寄存器平衡。