在quartus的设置里有,物理综合综合优化,register retiming,是针对网表的优化。
我们知道在组合逻辑之间插入寄存器可以优化设计的时序,而如果只是调整寄存器的位置来优化实现,这种技术被称为寄存器平衡。《高级设计》一书中提供了一个简单代码实例用以展示这种技术。这里我们需要注意的是本文介绍的是基于代码级别的寄存器平衡技术,各个eda厂家提供的编译工具里也有一只选项叫做寄存器平衡,这个我们会在后面讨论。
以下是加法器代码片段: module addera( output reg [7:0] Sum, input [7:0] A,B,C, input clk); reg [7:0] rA,rB,rC; always @ (posedge clk) begin rA<=A; rB<=B; rC<=C; Sum<=rA+rB+rC; end endmodule |
原书使用Synplify对上述代码进行了编译,这里我们使用QuartusII软件来编译上述代码,编译后的结果,如图1所示。
图1:加法器直接实现的结果
如果比较图1和原书的编译结果,我们还是能看到一点点区别,原书中编译出来的加法器是一个三输入加法器,而这里是两个两输入加法器,其实本质并无区别,关键路径都需要经过两次加法。
那么如果我们对上述代码进行寄存器平衡处理,那么代码需要修改如下所示。
以下是修改后加法器的代码片段:
module adderb( output reg [7:0] Sum, input [7:0] A,B,C, input clk); reg [7:0] rABSum,rC; always @ (posedge clk) begin rABSum<=A+B; rC<=C; Sum<=rABSum+rC; end endmodule |
将上述修改后的代码在QuartusII中编译后的结果如图2所示。
图2:通过寄存器平衡后的加法器实现
优化后编译结果和原书的结果一模一样,关键路径上只有一次加法操作。