Pipeline Feedback
A design with feedback limits the initiation interval to be no less than the delay of the feedback path. There are three types of feedback:
- data dependent, 即inter-loop dependency。“If the only loop in the design is the main loop the variable must have been declared as static for there to be feedback.”指的是用static存住一个寄存器型变量,在每次调用时都能继承上次的结果。举例如下:
void accumulate(int a, int b, int &dout){
static int acc=0;
int tmp = acc*a;
acc = tmp+b;
dout = acc;
}
要想使得Pipeline II=1,则工作频率不会很高,时空关系如下所示:
对应硬件电路如下:
而要想二者兼得,即想得到如下的时空图:
上图中Main iteration 1需要"acc"的时候,Main iteration 0还未准备好,因此时空关系并不成立。
实际综合出的电路会对应下图,II=2:
若想同时达到高频率和II=1的目的,可以将代码改写成如下形式,出发点是为了平衡feedback和feedforward两条路径的延时,具体移位寄存器的数量=(feed-forward latency)/期望II。(Feed-forward latency如上图中含有两个Reg的路径延时)下述代码第一次调用时,acc_old1的值无法确定(为何不初始化为0),第一次调用是无效的考虑舍弃?b的路径不需要平衡吗,还是说b和a本来就不是一起到达的?
void accumulate(int a, int b, int &dout){
static int acc=0;
static int acc_old0;
static int acc_old1;
int tmp0 = acc_old1*a;
acc = tmp0+b;
acc_old1 = acc_old0;
acc_old0 = acc;
dout = acc;
}
进行如上更改后对应的电路如下所示:
- control dependent, 嵌套的层数越多,控制逻辑便越复杂,一个bad example如下所示:
void control(int din[8][8],
int dout[8],
int x_size,
int y_size){
int acc;
X:for