01signal.com

时序就是一切

本页面是有关时序的系列页面中的第一篇。

回报是内心安宁

时序这个主题,尤其是其中的时序约束(timing constraints),对 FPGA 设计者来说是一大挑战。难懂并不是唯一的问题。真正的挑战在于,当你从事 FPGA 设计时,因为一切工作正常,你很自然地想要无视整个时序主题。当设计表面上看不出明显问题时,人们特别容易安于现状,并掉进这个陷阱。

经常可以听到 FPGA 设计者说:他们知道自己的设计在时序方面有所欠缺,但管它呢,电子系统运行得像钟表一样可靠。确实,在当时看来,花时间把时序处理好似乎纯属浪费时间。一个正急着推进新功能开发的经理,多半不会因为项目连续几周毫无可见进展而感到高兴。事实上,认真检查设计的时序,可能会发现一些很难解决的问题。而这些在旁人看来,简直像是凭空制造问题,然后再花宝贵的时间去解决它们。

说实话,忽略时序的做法在短期内往往确实能蒙混过去。但很多时候,正是因为没有认真对待时序,才导致最令人恼火的问题,而且这些问题总喜欢在最令人恼火的时刻冒出来。比如说,在最终验收测试期间,电子系统可能每隔几个小时就出一次故障,尤其是在全温度范围内测试的时候。还有比这更糟糕的:产品发布几年后,客户的投诉才开始陆续到来。在费尽力气排查这些投诉的原因之后,才发现这些产品中的 FPGA 来自不同的生产批次。因此,即使所有 FPGA 都满足数据手册中的指标,硅片本身的差异也会让新一批 FPGA 表现出略微不同的行为。

这类事件让 FPGA 背上了一些坏名声。不过,只要把时序处理得当,你就大可放心,这类事情不会发生。当设计被正确处理之后,FPGA 是极其可靠的。

所以,帮自己一个忙吧:花时间去学习时序知识,并且以后务必充分运用这些知识。这样做能让你不再时刻担心设计一改动就出意外,也能让你免于没完没了地追踪那些时隐时现的 bug。最重要的是,你会渐渐习惯把 FPGA 看作一个可靠且稳如磐石的器件。

时序约束的重要性

只有 FPGA 设计中每一个同步元件都满足时序要求,FPGA 内部的逻辑才能可靠工作。为了确保这一点,必须检查所有可能的路径(path)。哪怕只是一个简单的逻辑设计,也不可能靠手工完成所有这些计算。

因此,确保所有时序要求都得到满足,是工具的职责。为了做到这一点,工具必须获得完成必要计算所需的全部信息。例如,工具需要知道所有时钟的频率,以及外部器件在时序上的行为。这些信息通过时序约束提供给工具,而时序约束通常由一个具有特殊语法的文本文件构成。

如果时序约束写错了,或者没有覆盖全部必要信息,工具就无法保证逻辑设计可靠运行。工具依赖时序约束提供的信息,所以如果这些信息不正确或不完整,工具所进行的时序计算也会同样不正确或不完整。写得不好的时序约束,是 FPGA 行为不可靠的常见原因。

所以,你与工具之间其实有这样一个不成文约定:我们把工具需要知道的时序信息全部告诉它,工具则负责确保设计中不存在时序违例。

但有时候,工具并没能避免时序违例。发生这种情况时,工具会给出相应的警告信息,说明这一点。这只是警告,不是错误,所以 FPGA 工具仍会继续生成可以加载到 FPGA 中的比特流(bitstream)文件。因此,一定要始终确认工具是否声明时序约束已经实现。这类确认通常以类似 “All timing constraints are met”(所有时序约束均得到满足)的消息形式出现。

然而,问题不仅仅在于时序约束

实际上,你与 FPGA 软件之间的不成文约定范围还要更广:你必须遵守一些关于 FPGA 设计形态的规则,而工具负责保证 FPGA 不会出问题。如果你破坏了规则,工具也会进行报复。

把时序做对,是这些规则中很重要的一部分。而且,时序不只是编写时序约束那么简单。你需要留意三个相互独立的方面。

第一个方面是逻辑设计本身,也就是 Verilog(或 VHDL)代码。当然,一个明显的要求是逻辑要“足够快”(更准确地说,逻辑设计应当允许时钟以期望的频率工作)。除此之外,还有其他几件事需要记住:

第二个方面是编写时序约束。这一部分有时非常简单,有时却需要细致的工作。一个常见错误是从别的设计中复制时序约束(尤其是只复制一条周期约束),然后便以为万事大吉。

第三个方面是生成并阅读时序报告,以确认工具完成了它们的使命,从而保证设计可靠运行。这是最困难的部分,主要是因为这项任务需要理解 FPGA 内部的工作原理:时序报告是按照 FPGA 的最小组成单元来编写的。因此,如果对 FPGA 缺乏这样的理解,就很难从这些报告中得出任何有用的结论。

人们通常是为了解决问题才去读时序报告,尤其是当工具未能满足时序约束要求的时候。解决这类问题的过程,叫做时序收敛(timing closure)。最常见的问题是,某个时钟的频率相对于逻辑设计来说太高(也可以说,逻辑对于这个时钟来说太慢)。

如前所述,强烈建议偶尔检查 FPGA 设计的时序,即使当时时序约束已经满足、一切运转正常。这尤其意味着要查看时序报告,同时也要验证时序约束是否准确反映了逻辑的需求。难点在于,这种检查在短期内不会有回报:它既花时间又花精力,而结果要么是什么都没发现,要么就是发现一个问题。所以,如果检查真有成效,实际上意味着还要为某个谁都看不到的问题做更多工作。

这些时序页面是如何编排的

这些页面的重点,是你与 FPGA 工具之间那个不成文约定的第二和第三个方面:编写时序约束,以及阅读时序报告。要掌握这些技能,既需要理论知识,也需要实用的操作工具。

编写时序约束的实际操作相对容易学习。难点在于准确理解它们的含义,以及它们对设计的影响。本系列的下一页会介绍基础理论概念。在随后的页面中,理论讨论会借助多个时序报告实例继续展开。整个故事的精华,都藏在时序分析的细微之处。

在下一页之后的两页中,将讨论最重要、也最常用的时序约束:周期约束。由于周期约束十分重要,这两页会对时序报告进行详细的讨论。

接下来的两个页面讨论时序收敛。现在谈这个话题可能有点早,但它能解释后续主题的目的:共有五页讨论采用 SDC 语法、与 FPGA 逻辑结构(logic fabric)相关的时序约束,随后还有两页讨论 I/O 时序约束。

本系列的最后一页专门讨论对现有设计的检查。那一页中没有什么新内容,而是把已经讨论过的主题重新过一遍,只是这次以“待检查事项清单”的形式呈现。

各个主题的排列顺序适合从头到尾连续阅读。不过,所有主题之间彼此关联,所以页面中有大量交叉引用。

继续阅读的最佳去处是下一页。多了解一些时序理论,总不会有坏处。

本页由机器从英文翻译而来。如有疑问,请参阅原文
Copyright © 2021-2026. All rights reserved. (dcc38493)