原创 【way to timing closure】PART2 综合选项设置

2013-12-31 09:57 1224 14 14 分类: FPGA/CPLD 文集: Way to timing closure

这里想说一下我对综合选项的设置。设置的依据是ISE的帮助,网上的资料,以及自己的理解。请大家能为我指正设置得不合理的地方。没有提及的选项采用缺省设置。采用的EDA软件是ISE 13.2,综合器为XST。

 

【Synthesis Options】

 

Use Synthesis Constraints File & Synthesis Constraints File:

 

一般来说,会在implement之前,采用UCF文件对设计进行时序约束。实际上,在synthesis之前,可以先采用XCF文件对设计进行时序约束,以使XST针对时序约束进行synthesis,在synthesis时产生更好的网表。按照网上的说法,XCF中的时序约束应当要比实际需求更紧一些。

 

XCF文件的实际效果嘛。我谈一下自己使用XST的情况吧。XST完成综合(synthesis)后,会产生一个估计的最大工作频率。某一次综合后,我使用XCF文件将最大工作频率约束的比XST的估值大一些,再重新进行综合后,XST给出的估值确实增大了少许。大部分时候,在重新综合后是看不到效果的。至于对最终结果的影响,就不得而知了。

 

XCF文件的语法与UCF文件完全一致。与UCF不同,ISE没有为XCF提供编辑的工具,只能自己用文本编辑器编辑。

 

Keep Hierarchy:

 

这个选项是设置是否在synthesis与implement中打破设计的层次结构。选项【yes】和【no】很容易理解。选项【soft】的意思则是在综合时不打破层次结构,而在之后打破层次结构。

 

个人理解。打破层次结构后,有些信号就变了,不利于分析与约束。而打破层次结构,更有利于电路的优化。

 

【HDL Options】

 

FSM Encoding Algorithm:

 

有限状态机的编码方式。我采用了【One-Hot】(独热码)。其优缺点相信大家都非常清楚,不再赘述了。

 

Case Implementation Style:

 

case语句的实现方式。使用verilog时,缺省状态下XST不会把case语句综合成你想象的结构。这点,大家可以自己写一段简单的代码试试。

 

以一个独热码状态机为例:

以下是代码片段:
reg [2:0] sta;

case(1'b1)

sta[2]: ...;

sta[1]: ...;

sta[0]: ...;

endcase

 

首先,综合出来的电路不止判断一个比特。XST不知道sta只会出现3'b100、3'b010、3'b001三种可能,它会把诸如3'b101这样的状态也考虑在内,大概把电路综合成如下的样子:

 

以下是代码片段:

reg [2:0] sta;

case (sta)

3'b001: ...;

3'b010: ...;

3'b100: ...;

default: ...;

endcase

 

这样,采用独热码似乎没有什么意义。而且因为采用独热码时,sta的比特数比采用格雷码时更多,复杂度反而还增加了。

 

另外,XST也可能没有把case语句转换为并行结构,而是有优先级的结构。

 

【Case Implementation Style】中有三个选项:【Full】、【Parallel】与【Full-Parallel】。其中,【Full】针对上述的第一点,向XST说明有些状态是不可能出现的,让XST不要考虑太多;【Parallel】让XST将case语句综合为并行的电路结构;【Full-Parallel】则是两者的结合。

 

对于状态机,这项设置的影响很大。器件为xc6vlx240t-1ff1156时,同样代码的8状态独热码状态机,缺省设置时占用11个寄存器、6个查找表,只能工作在575 MHz时钟频率下;改为【Full-Parallel】设置后,占用11个寄存器、3个查找表,可以工作在900 MHz时钟频率下。

 

【Xilinx Sepcific Options】

 

Max Fanout & Register Duplication:
 
寄存器的最大扇出。扇出是一个门需要驱动的门数目。如果一个门的扇出很大,那么它的输出布线将非常拥塞,布线的时延可能就会很长。在时序报告中,如果看到逻辑一条路径的逻辑时延很短,但布线时延很长,很可能的原因就是信号的扇出太大。这样,即使设计时保证了此处的组合逻辑很简单,也无法减少时延。
 
一个有效的方法是寄存器复制。也就是说,像下图一样,为大扇出的门加入一些副本,让这些完全相同的门来分担扇出。寄存器复制可以通过代码来实现,不过显然,这样做是非常麻烦的。而【Max Fanout】这个选项,能够使XST自动实现寄存器复制。在综合时,通过这个选项为所有寄存器都加上扇出的限制,一旦寄存器的扇出大于设置的值,XST会自动进行寄存器复制。在我的设计中,将最大输出设为20。
 
b33f1ec4e9ed1429507af7eb5cca4986.jpg
 
不过这么做没法解决所有的问题。一方面,XST只能做寄存器复制,对于扇出大的组合逻辑,就没有办法了;另一方面,XST也无法跨越模块进行优化。对于第一个问题,可以对大扇出的组合逻辑一级寄存器缓冲一下,这样就可以复制了。对于第二个问题,采用扁平化的设计是一种方法,不过这样会为设计带来很大的困难。另一种方法,是在模块的边界处加入寄存器,即对模块的输入输出都进行缓存。这是比较推荐的做法。
 
顺便提一句,在【Map Properties】中,同样有【Register Duplication】的选项。该选项是根据时序约束(而非对扇出的限制)来进行寄存器复制。
 
Equivalent Register Removal:
 
把设计中等效的寄存器去掉,合并为一个。显然,这个选项让人感觉与【Register Duplication】是互斥的。但是,在设置时,这两个选项是能够同时勾选的。因为不知道同时勾选的效果会是怎样的,我把这个选项前面的复选框去掉了。
 
要点总结
  • case 语句未必被综合为并行电路。需要并行电路的话,需要设置【HDL Options】中的【Case Implementation Style】。
  • 配合【Max Fanout】与【Register Duplication】来进行全局的寄存器复制,以减小扇出。

文章评论0条评论)

登录后参与讨论
我要评论
0
14
关闭 站长推荐上一条 /2 下一条