对于速度优化这章,前面一篇博文已经贴出了时序优化的几个小节,原书作者给出的实例代码也有展示,由于原作者实例运行的平台是Xilinx器件,而综合工具使用的是Sycplify。笔者最近几年只是使用Altera的器件,综合工具多使用Quartus II自带的工具。所以前一篇博文的实例已经在其它网站都有重新经过Quartus II编译以后的结果展示,这里就不再重复展示了。
本文要展示原书中关于时序优化的第三个方法,即让设计结构扁平化。下述代码是作者举例的原始代码:
module regwritea(
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
如果将上述代码在Quartus II中进行编译,那么编译的结果如图1所示:
图1:有优先级编码
如果根据原书将前面代码修改如下所示:
module regwriteb(
output reg[3:0]rout,
input clk,in,
input[3:0]ctrl);
always@(posedge clk)begin
if(ctrl[0])rout[0]<=in;
if(ctrl[1])rout[1]<=in;
if(ctrl[2])rout[2]<=in;
if(ctrl[3])rout[3]<=in;
end
endmodule
再将上述代码在Quartus II中编译,那么编译结果如图2所示。
图2:无优先级编码
代码修改前后区别是if-else结构的差异,第一个是带有优先级的if-else结构,位置靠前的入口优先级更高一些,而第二个是没有优先级,所以说每个分支都是并行的关系。通过图1和图2的比较可以看到代码修改前后,关键路径的延时是不一样的,图2中所有路径都一样,即只有一级寄存器;而图1中关键路径上多了两级组合逻辑,即多路选择器。