之一就是第一章,这是第二章。在开始之前,要对第一章内容说说我理解到的:

(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的那些事儿)

TIMEQUEST学习之黑金动力(二)的更多相关文章

  1. timequest学习之黑金动力(一)

    黑金动力的资料还是非常有价值的.通过建模篇,对于给定的时序关系,我总能实现.但是,这总是很初级的能力.也只是为后面的建模服务.所以,现阶段我的能力还是非常有限.我相信我一定会成为牛人,能够独挡一面.借 ...

  2. TIMEQUEST学习之黑金动力(三)

    不知不觉,学到的第四章.但是对于TQ的内部模型和外部模型的完整分析还是没有很好的理解.接着学习......... 我们也了解静态时序分析的第一步骤,亦即时钟方面的约束.此外,也稍微对 Report T ...

  3. TIMEQUEST学习之黑金动力(四)

    现在知道时序约束主要是FPGA to ic,或者ic to FPGA. 上图可以表示FPGA to IC, IC to FPGA. fpga2ic:fpga2ext 是 fpga 致 ic 信号的走线 ...

  4. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  5. css学习归纳总结(二) 转

    原文地址:css学习归纳总结(二) 标签与元素 <p>标签和p元素有什么区别呢?大多数时候他们表示的是同一样东西,但仍有细微的区别.<p>.<div>等指的是HTM ...

  6. 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

    [Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...

  7. Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

    Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

  8. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  9. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

随机推荐

  1. split方法的使用

    // 分隔竖线 String[] param = text.split("\\|");   //分隔问号 String name = singleResource.get(&quo ...

  2. Linux 下硬链接和软链接的说明

    Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln 命令产生硬链接. 硬连接 硬连接指通过索引节点来进行连接.在 Li ...

  3. LeetCode OJ:Search for a Range(区间查找)

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  4. New Concept English three (40)

    23w/m 48 errors It has never been explained why university students seem to enjoy practical jokes mo ...

  5. React 实现 Table 的思考

    琼玖 1 年前 (写的零零散散, 包括github不怎么样) Table 是最常用展示数据的方式之一,可是一个产品中往往很多非常类似的 Table, 但是我们碰到的情况往往是 Table A 要排序, ...

  6. 视图框架:Spring MVC 4.0(1)

    目录 一.表单标签库 1.1.简介 1.2.常用属性 1.3.form标签与input标签 1.4.checkbox标签 1.5.radiobutton标签 1.6.password标签 1.7.se ...

  7. Intellij IDEA带参数启动Springboot注意事项

    问题 不同版本的spring-boot-maven-plugin的jvm参数配置有所不同,同时与通过main方法启动springboot程序传递参数也有所不同. 分析 在运行main方法时,可以通过j ...

  8. c++使用http协议上传文件到七牛云服务器

    使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...

  9. 给UIButton设置阴影及动画组

    //设置“开启旅程”按钮 UIButton *startBtn = self.startBtn; CGFloat btnW = ; CGFloat btnH = ; CGFloat btnX = (s ...

  10. 最全的Javascript编码规范(推荐)

    1.嵌入规则 Javascript程序应该尽量放在.js的文件中,需要调用的时候在页面中以<script src="filename.js">的形式包含进来.Javas ...