如何发现并解决FPGA设计中的时序问题
扫描二维码
随时随地手机看文章
耗费数月精力做出的设计却无法满足时序要求,这确实非常令人伤心。然而,试图正确地对设计进行约束以保证满足时序要求的过程几乎同样令人费神。找到并确定时序约束本身通常也是非常令人头痛的问题。
时序问题的恼人之处在于没有哪种方法能够解决所有类型的问题。由于客户对于和现场应用工程师共享源代码通常非常敏感,因此我们通常都是通过将工具的潜力发挥到极致来帮助客户解决其时序问题。当然好消息就是通过这种方法以及优化RTL代码,可以解决大多数时序问题。
但在深入探讨之前,我们首先需要对时序问题进行一点基本分析。这里的目标是首先排除明显的问题,如将时钟引脚置于器件的上部、在器件下部驱动数字时钟管理器(DCM),然后再在器件上部驱动全局缓冲(BUFG)。
有时,此类引脚布局会导致根本没有办法满足时序要求。通过察看时序报告中的延迟,通常可以发现这些明显的时序问题。在这些情况下,为了解决这些明显的问题,都需要利用底层规划工具“floorplanner”将造成问题的部分锁定在适当的位置。底层布局规划工具还可以帮助以可视的方式来理解时序问题。
用最新工具进行时序分析
假设问题并非这么明显,那么为了锁定问题所在,需要了解所使用的器件系列以及软件版本。通常,每种器件系列对应一种最优的软件版本。如Xilinx Virtex-4器件对应的最佳软件是ISE软件9.2i版,而对Virtex-5 FPGA则是ISE软件10.1版。
综合工具的版本也很重要,因此当采用最新的器件架构时,下载并使用最新版软件非常重要。软件开发几乎总是滞后于硬件功能,因此我不提倡使用旧版软件进行基于新器件的设计。
然而,有些客户由于担心新的和未知的软件缺陷而不愿意升级软件。但是,在使用最新的器件时,如果希望更好地处理时序挑战,强烈建议下载最新版软件。
拥有了最适用于目标器件系列的软件,还需要确定最佳的实现选项。可惜,并没有适用于所有情况的超级选项组合。对于设计实现工具来说,有成千上万种不同的实现选项组合。根据所使用的实现选项不同,时序分数(即所有存在错误的时序路径与时序要求的差异总和,以皮秒表示)也会有很大不同。
赛灵思的几款工具可帮助确定适用于特定设计的最佳实现选项。ISE软件现在包括两个工具:Xplorer以及最近发布的SmartXplorer。SmartXplorer可充分发挥多处理器优点,能够以不同选项组合运行多个实施实例。
SmartXplorer需要Linux支持,但使用非常容易。其命令行很简单:smartxplorer designname.edn -p xc5vlx110t-1ff1136.
只要用户约束文件(UCF)和网表约束文件(NCF)文件名相同,SmartXplorer会自动使用正确的选项。唯一需要做的是编辑主机列表文件。
SmartXplorer可以通过SSH/rsh安全shell登录到其他机器。只需要在名为smartxplorer.hostlist的文件中将每台机器一行将机器名字添加进去就可以了。如果机器有两个处理器,请将机器列出两次。表1给出了SmartXplorer的一组结果。
表1:对基于Virtex-5 FPGA的设计SmartXplorer 10.1的一个例子。
PlanAhead软件也包括了与SmartXplorer类似的称为ExploreAhead的功能。ExploreAhead支持同时在多台Linux机器上分布式运行布局布线任务。所有这些工具的目的都是类似的:确定实现工具的最佳选项组合,以获得最好的时序得分。
请注意选项的不同组合对于时序得分和运行时间的巨大影响。仔细调整综合选项也非常重要。例如,在综合选项中关闭结构层次(hierarchy)通常会大大提高性能。综合过程中的约束条件好坏在满足时序方面的作用也很突出。
用PlanAhead分析时序
在了解实现选项对最佳时序分值的影响之后,现在可以开始有效地分析时序问题了。这时候,PlanAhead是一款非常有价值的工具,可以视觉化显示布局布线后的设计。利用它,还可以导入时序约束并在已布局窗口交叉探查(cross-probe)时序失败的路径。
当工具本身的决策不好时,则可以通过平面布局模块或通过手工布局部分组件的方式来纠正。这一过程通常需要反复多次,才能够确定时序优化的最佳设计布局方式。PlanAhead软件的可视化功能确实使这一工作的完成更容易了。
利用PlanAhead软件,首先创建项目(project),然后将HDL或网表文件导入工具中。一旦创建了一个项目,就可以选择“File→Import Placement”。选择时序优化效果最佳的布局布线后(ncd)文件,将布局布线信息导入PlanAhead软件项目。
软件会将PlanAhead项目组织到几个不同的窗口。左上窗口是物理分层窗口,描述了设计中的当前区域组。选定窗口在下面,包含了当前选定的数据详细信息。中间窗口是网表窗口,给出了整个网表的分层结构。最右侧窗口是器件观察窗(Device view),里面已经充满了设计实施完成后的逻辑。
然后,将时序分析报告(TWR/TWX)导入到PlanAhead工具中。选择“File→Import TRCE Report”。这一步将时序报告数据添加到底部窗口。按照时序余量(timing slack)对这一窗口进行排序可以将焦点首先集中于违反时序要求最多的地方。经常的情况是解决了这些时序偏差最大的地方所存在的问题也就解决了整个设计的时序问题。
图1. PlanAhead 10.1版显示出已实施的设计,一条时序失败路径高亮显示。
一旦选择了一条时序失败的路径,PlanAhead软件就会选定时序失败路径上的实例和连接。按F9键放大显示选定的部分。
这儿的事情显得有些复杂。必须进行一定的审查和思考才能够明显布局布线工具将基本单元(primitive)放在某个地方,以及为什么对于当前的特定设计来说还有更好的方法。
可以放大显示任何高亮的基本单元。鼠标点击一个基本单元并拖动,可以更好地观察其连接情况。在网表窗口,还可以移动到包含了所选实例的顶层模块。鼠标右击模块名称并为选定的实例选择颜色,这样就可以显示出这一模块在芯片中的布局,以及组内单元是靠近还是散开的。
可能发现有时需要更好地锁定特定的基本单元。Block RAM和DSP模块的自动布局是导致时序失败的常见原因。很容易发现布局布线工具将Mult18安排的位置很不好。时序失败路径中的块RAM输出连接到Mult18,后者的输出又馈送到进位链。块RAM在上部、Mult18在下部,而逻辑部分又位于上部。如果布线不需要上上下下、边边角角地来回绕,该路径应当可以满足时序要求。
时序问题不同,在PlanAhead软件中处理这些时序问题的解决方案也跟着变化。在PlanAhead设计工具中解决时序问题需要不断实践。该解决方案体现以下操作步骤中:
1. 选择高亮显示失败的时序路径。
2. 右击路径上的某个实例,选择“Highlight With →color of choice”。
3. 在左侧栏中,将底部第二个Mult18释放。右击“Unplace。这将为时序失败的块RAM腾出空间。
4. 点击拖动底部的Mult18向左上移动一个位置。
5. 点击拖动右边的块RAM到底部左侧的自由块RAM位置。
6. 选定失败的时序路径,确认路径看起来是优化的。
7. 选择“Tools→Clear PlacementConstraints”。点击第一个选项中的“Next”。
8. 选择“Unplace All But SelectedInstances”。在余下的向导步骤点击“Next”。
9. 如果希望在“PlanAhead软件外运行实施流程,选择“File →Export Floorplan”。
10. 工具会输出一个新的文件名为“top.ucf”的UCF文件。你可直接使用这一文件,或者将文件中的约束加入到原始UCF中。
11. 另一个选择是在PlanAhead软件内运行实施工具。
选择“Tool→Run ISE Place & Route with ExploreAhead。
ExploreAhead提供了许多很好的功能,包括:自动从器件观察窗导入约束到UCF;简化了从ExploreAhead中运行的布局和时序结果的导入。
图2. PlanAhead 10.1版软件显示出将DSP48和块RAM锁定后的正确路径。
Pblock和底层规划
如果发现布局中有许多时序失败路径,手工布局调整通常无法解决问题。反过来,应当创建区域组。创建区域组(Pblock)的方式之一是在网表窗口中右击模块名字并选择“Draw Pblock”。然后在器件观察窗中希望放置区域组的地方画一个长方形。
工具会创建一个Pblock,同时会显示有关的详细信息。属性窗口会显示Pblock需要的逻辑资源以及画出的长方形区域组中可用的资源。
设计的底层规划是一个需要深度交互的过程。你可能会发现需要反复多次调整区域组才能够达到目标。请记住有时创建的区域组越小越少越好。你并不是总需要将整个模块固定为区域组。集中于时序失败的基本单元,将它们组合为区域组并单独为其进行底层规划。
在此过程中,应当利用Pblock指标(Metrics)来更好地理解有关功能,如区域组中可配置的逻辑块(CLB)的利用情况如何(可以在PlanAhead软件左上窗口中点击Metrics标签来查看可用的指标)。这可帮助确定是否某个特定区域中太拥挤以致妨碍布线。如果确实比较拥挤,可能需要通过平面规划将设计逻辑放得散开一些。
一旦利用PlanAhead软件获得尽可能好的时序分数,最后的任务就是优化代码。PlanAhead设计工具现在支持HDL源文件。根据你导入的源文件不同,你可以从时序问题出发通过交叉探查功能回查到网表或HDL。
利用原理图观察窗(Schematic view),可以察看整个时序路径。只需要从时序结果中选择时序路径并按F4。仔细观察从其他模块扇入扇出的逻辑。由于外部接口要求,工具可能经常需要将模块在芯片上散开部署。如果是这样,可能需要使用流水线。
Block RAM和DSP输出时序是引起时序问题的常见原因。通过在这些模块的输出进行存储,通常可以恢复一纳秒甚至更多的时间。