首先,pipeline 是 rtl design 的技巧,Retiming 是 synthesize 的技术。设计里面要有pipeline,才有后面的retiming。
当然,現在synthesis 进步很多了,這句话在有些时候已经不成立了,但是,大多数的时候,Retiming 还是针对pipeline 做优化。
一個简单的例子,例如我们做一個乘法器,需要20ns,但是我们要跑100M,而且每一T都有输入,这个時候我们就可以把乘法器切成两個stage,1T 算一半,总共用2T来算,但是每一T都可以有值输入,下面代码示例1中 F1,F2 就是一半的乘法运算,但是怎么切一半就是困难的地方的,pipeline是把combination 拆成多個,中间插入FF。retime就是重新分配组合逻辑。也可以把代码写成示例2的形式,然后让综合工具自己会移动d1去meet时序。
代码示例1:
定义三个寄存器d0 d1 d2,把乘法器功能切成F1和F2,各一个周期,综合工具retime会重新分配组合逻辑。
reg d0,d1,d2;
always @(posedge clk) begin
d1 <= F1(d0);
d2 <= F2(d1);
end
代码示例2 :
定义三个寄存器d0