移位寄存器在HDL设计中很常见,尤其是在Pipeline设计中,经常会使用移位寄存器去增加某一个路径的Latency。下面是一个简单的移位寄存器的例子:
图中红色框框圈出来的是综合约束,主要作用是避免综合工具将移位寄存器优化为移位寄存器查找表(SRL,Shift Register LUT)。此时综合工具综合的结果如下图所示(这应该是符合很多初学者的预期的):
注:综合工具优化的结果是合理且最优的,这里禁止其优化,仅仅是为了对比结果。
其MAP之后的资源利用情况为:160个寄存器,48个Slices,0个LUT4。
如果删除综合约束,或者将综合约束改为/* synthesis syn_preserve=0 */,则综合的结果为:
此时,MAP之后的资源利用情况为:39个寄存器,60个Slices,84个LUT4。相比之下,综合优化之后消耗了更多的Slice。
注:这里解释一下资源之间的关系,Lattice ECP5系列的FPGA每个PFU包含4个Slice,每个Slice包含2个LUT4和2个寄存器,以及相关的进位链(Carry Chain)资源,如下图所示。当然,FPGA还包含了一些IO上的寄存器资源。我们在分析资源消耗情况的时候,首要考虑的应该是Slice的消耗情况。
一般情况下,我们建议为所有的寄存器复位,以使得系统复位后处于一个确定的状态。但是对于SRL而言,复位并非是必要的,往往只需要为SRL前面的一级寄存器和后面的一级寄存器复位即可。如果我们删除SRL的寄存器,如下图所示:
此时,MAP之后的资源消耗情况为:34个寄存器,25个Slice和50个LUT。可以发现此时仅仅消耗了25个Slice,因为与SRL复位相关的逻辑都被丢弃了。去除了复位的SRL不仅消耗了更少的资源,往往也能够取得更高的运行速度(设计的Fmax更高)。
一般情况下,资源消耗情况为:有复位的RSL设计>禁止综合工具优化的移位寄存器设计>没有复位的SRL设计;
Fmax为:禁止综合工具优化的移位寄存器设计>没有复位的SRL设计>有复位的SRL设计。
当然这也不是绝对,具体还和综合工具以及目标器件的结构有关系。
注:原文最早发表于本人的ChinaAET博客(http://blog.chinaaet.com/justlxy/)