之一就是第一章,这是第二章。在开始之前,要对第一章内容说说我理解到的:
(1)时序分析是节点对节点的分析。(2)这个latch edge是锁存上一个lunch edge输出的(满足建立关系的)值。(3)建立关系和建立时间余量。(4)保持关系和保持时间余量。特别是使用屁股计数就是实际TQ的分析方法。
TimeQuest 模型是用来解决两个点寄存器(节点)之间的建立关系和保持关系问题。但是在一个最简单的 HDL 设计,不可能仅是由两个寄存器就组成,里边可能会有“很多
很多很多”对寄存器。结果 TimeQuest 就会用自己的时序分析模型,逐个检查“很多很多很多”对寄存器之间的“建立关系和保持关系是否合格化”。
在 FPGA 综合的过程中,逻辑资源之间会开始“布线”,把相关的单位连线起来。设计有多大,那么连线的数量就越多,最终这庞大的连线就成为网表。
图 2.2.1 是布线过程的概念图 ... 布线过程就是按软模型,在 FPGA 巨大的资源库里建立硬模型,逻辑资源之间的链接称为连线,所有连线的总和称为网表。
用简单的话来说,当某个实验下载到开发板的时候,它有属于自己的“物理网表(硬模型)”。为了测试这个“物理网表”到底合不合格,所以我们需要用 TimeQuest 这个工具
“仿真”这个“物理网表”,而 TimeQuest 不会直接仿真“物理网表”,而是仿真不同质量的网表,又或者仿真不同质量的硬模型。
TimeQuest 是一个针对各种延迟因数作出约束的静态时序分析工具”。
有一个问题笔者一直无法释怀,当 Modelsim 仿真 HDL 模块之际,如果考虑延迟信息,时序就会出现物理延迟,换之在 Modelsim 界面上出现的波形,事实上也是静态时序的一种,不过 Modelsim 只能看个大概而已,而不能做出实际的分析。所以笔者一直认为,Modelsim 既然要仿真就仿真理想时序而不是物理时序。所以说,物理时序分析的工作我们就交给 TimeQuest 去干。
笔者曾一度认为,TimeQuest 的延迟取值是按实际的物理延迟,不过事实恰恰相反,TimeQuest 对延迟取值是夸张的表现,这话何解呢?
假设有一条路径的物理延迟是 10ns,如果是 worst-case 网表 TimeQuest 就会报 18ns,如果是 best-case 网表 TimeQuest 就会报 12ns。很明显, 18ns 还有 12ns 的报值比起实际的10ns 多出 8ns 还有 2ns,其中这 8ns 和 2ns 的差别就是保险余量。
(注:这里的clk1和clk2不是对齐的,也即是有相移,此时理想的保持关系-180度(-5ns),理想建立时序5ns。)
TimeQuest 有一个评估值,称为 Fmax。Fmax 是用来评估节点的最高频率。每当网表质量越低,节点的延迟取值就会越高, Fmax 也随之会越低。如果 Fmax 越低 fpga 就不能发挥实际的速度和性能,因此我们可以这样说:网表质量越低,保险余量越大,Fmax评估越低,性能限制也越高。
根据理论而言,外部的时钟源比起内部的时钟源更容易产生时间抖动,而时间抖动会给外部时钟路径产生不同延迟,也因此产生多可能性的时序图,如图 3.3.6 所示。笔者在研究时钟抖动的时候吃过不少苦头,而 TimeQuest 也用了一大半的约束命令针对外部时钟路径。
第一层时间要求,第二层时间要求:
第一层时间要求,HDL 不仅可以照顾到 Tdata 的 10ns 时间要求,也可以设计到它。因此 Tdata 可以断定为第一层时间要求。
第二层时间要求,HDL 只可以照顾到 Tdata 的 3ns 时间要求,可是却涉及不了,因此 Tdata 可以断定为第二层时间。
我们知道 TimeQuest 是一个笨蛋,在默认的情况下 TimeQuest 模型都是以单时钟作为基准去分析节点是否合格。有时我们会遇见如图 3.4.5 的情形,这时候我们就要使用相关的约束命令告诉 TimeQuest “某对节点是用 N 个时钟工作”。如此一来, TimeQuest 就会知道某对节点是使用 N 个时间工作。
HDL 涉及不了的时间要求交给 TimeQuest 去做,不过在此之前 HDL 必须尽量做好“理想时序”的部分,最后“物理时序”的部分则交给 TimeQuest 去分析和涉及。
在第一章笔者曾说过,TimeQuest 模型的基本结构是由一对节点组成,不过节点是没有个性的东西,如果节点放在 fpga 内部,它就会成为寄存器,又称 TimeQuest 内部模型。换之如果节点放在 fpga 外部,它就成为 fpga 和外部器件(ic),又称 TimeQuest 外部模型。
不过外部模型不一定是山寨成功,如图 3.5.2 所示,如果主机 fpga 给从机 ic 驱动时钟信号和数据。结果而言 TimeQuest 模型一定会山寨失败,这种情形有 spi, iic, ps/2 时序等。此外,没有时钟信号,而有控制信号或者控制命令之间的数据传输也会让 TimeQuest 模型上寨失败,这种情形有静态 ram,传统 lcd 驱动等。还有一种情形就是单纯的数据传输,也会无法山寨成功 TimeQuest 模型,这种情形有 uart 和 vga 时序等。读者可能会问:“如果外部模型山寨失败的话,那么外部延迟因数又如何约束呢?”这是一个多疑的问题,TimeQuest 只是一匹只懂在模型里打滚的笨蛋而已,如果模型无法成立 TimeQuest 就会无用武之地。此时,我们也只能做好内部模型的分析即可 ... 外边就交个人品和运气。
同学们知道内部模型与外部模型的具体区别吗?内部模型与外部模型的区别就在于知道与不知道,自动与手动。所谓知道与不知道是指,有关内部模型的各种延迟信息
TimeQuest 可以通过综合器取得。换之,外部模型的延迟信息必须人为劳动,透过相关的约束命令告诉 TimeQuest 才行,这就是所谓的自动和手动。
笔者认为约束命令的功用,就是再现分析环境而已,而不是干扰硬模型的实际内容。sdc 文件有如 vt 文件,约束命令好比验证语言 ... 不过 Modelsim 仿真对象是软模型,而TimeQuest 的分析对象是硬模型。Modelsim 只用产生理想时序,看看模块的行为是否达到预期的效果。换之 TimeQuest 只用分析物理时序,看看综合结果是否造就时序违规,或者硬模型能不能在特定的环境下很好运行。
内部延迟因数几乎可以被 TimeQuest 认知,所以也没有什么好谈的;换之,外部延迟因数 TimeQuest 却完全不认识。TimeQuest 模型也有内部与外部之分,内部模型充满内部延迟因数而外部模型充满外部延迟因数。就是因为内部延迟因数 TimeQuest 它什么都知道的关系,所以 TimeQuest 会自动认识,也用不着认为告诉它相关的延迟信息。反之外部延迟因数就是因为 TimeQuest 它什么都不知道,结果我们必须手动透过相关的约束命令,再告诉它相关的外部延迟信息。
最后我们也小谈一下 TimeQuest 模型的山寨行为,实际上不是要 TimeQuest 模型去模仿什么 ... 而是分析 TimeQuest 模型到底能不能在外部成立,典型的外部模型就是 fpga 与sdram。
(注:小字部分,是应用作者的即黑金动力--FPGA的那些事儿)