基于TimeQuest时序优化原理和方法

news2024/9/24 6:21:19

分析最坏路径

  通过前面对TimeQuest软件的理解,基本上可以找到关键路径,此文章主要对关键路径时序进行优化,使设计达到时序要求,以TFT屏驱动为案例,介绍插入寄存器优化时序的方法;
在这里插入图片描述

图1 将TFT驱动模块设为顶层模块

  将TFT_CTRL设置为顶层之后,ctrl+L对工程进行全编译;
在这里插入图片描述

图2 TTF_CTRL设置为顶层模块

  全编译之后打开TimeQuest,读取网表,Read SDC之后,查看最高频率为270.12MH,显然无法达到默认时钟1000MHZ,但是这就是设计的最高频率了?不能在提升了?当然可以提升。
在这里插入图片描述

图3 time quest查看最大时钟频率

  查看最坏传输路径:
在这里插入图片描述

图4 查看最坏路径

  可以在报告界面,直接选中 vcounter[2]这个节点,然后鼠标右击,依次选择“Locate-> Locate in Design File”来定位到该路径对应在代码中的位置,如下图所示:
在这里插入图片描述

图5 查看最坏路径对应的代码

  点击后,软件会自动跳转到代码的第 85 行,如下图所示。在此可以看到,vcount_r的变化是受 hcount_ov 和 vcount_ov 控制的,而 vcount_ov 则是跟随 vcount_r 的值变化的。所以起点和终点就都找到了。
在这里插入图片描述

图6 最坏路径对应代码

  在上述路径中,vcount_r 信号要想影响到 vcount_r 的变化,首先是经过一级组合逻辑构成的比较器,在该比较器中,与一个常量(vline_end)做比较,当两者相等时,输出为 1,其他情况下为 0,输出的信号名为 vcount_ov。vcount_ov 的值才来决定 vcount_r 的值是否变化,因此,整个传输路径可以总结为下图:
在这里插入图片描述

图7 最坏路径传输模型

  通过上图可以看到,vcount_r[3]要驱动 vcount_r[2]发生变化。中间一定要经过一级组合逻辑,既然经过了组合逻辑,就一定会引入组合逻辑延迟。而且,整个的路径其实不止这一个组合逻辑,事实上,vcount_ov 有效后,具体 vcount_r[2]是否发生变化,还与 vcount_r 这个寄存器中的其他位的值相关,所以理论上应该是 vcount_ov 信号还会再进入下一级组合逻辑中参与运算,然后才能最终决定 vcount_r[2]的值是否发生变化。这个组合逻辑在图中被放置在了与 D 触发器 vcount_r[2]同一个 LE 内,这种情况下理论来说延迟是最小的,但是事实上很可能这个组合逻辑并不会与 D 触发器 vcount_r[2]放置在同一个 LE 内,那样的话,延迟就更大了。所以,整个传输路径中至少有 2 级组合逻辑延迟,因为加入了产生 vcount_ov 这个信号的组合逻辑,导致传输延迟变长了。既然这样,只需要将vcount_r[3]到 vcount_r[2]之间的组合逻辑减少,应该就能提升最大运行时钟频率了。

RTL 级路径优化

  如何优化路径呢?优化路径的指导思路又是什么呢?其实思路很简单,核心思路就是减少寄存器到寄存器之间的组合逻辑链路。本例中 vcount_r[3]要驱动 vcount_r[2],中间至少经历两级组合逻辑,如果能够将寄存器到寄存器之间的组合逻辑数量减少一级,是不是就能提升运行的时钟频率了呢?

  vcount_r[3]的输出传递到 vcount_r[2],首先是经历了一级 LUT 实现的查找表,然后查找表的输出再进入另一个查找表,最后才到达 vcount_r[2],那么,如果能够让第一级查找表输出后,也经过 D 触发器后再送往下一级查找表,那么整个路径就被切为了两段,每段路径都只包含 1 级组合逻辑了,那样的话,传输延迟就会小很多了。如下图所示:
在这里插入图片描述

图8 最坏路径优化模型

  通过此图可以看到,vcount_ov 不再是直接由 LUT 直接输出,而是 LUT 之后马上进入了该 LE 的 D 触发器中,再由 D 触发器输出。也就是说,此种方式是在原本的时序路径中,插入了一级寄存器,从而将原本较长的组合逻辑链路路径切割为了两段较短的组合逻辑路径。从而让寄存器到寄存器之间的传递组合逻辑延迟更短,提升了系统运行频率。

  看上去好像很有道理的样子,那这个操作在原本代码工程中该怎么修改才能实现呢?其实方法非常简单,只需要将 vcount_ov 的产生语句改为时序逻辑即可,当然不要忘记了将该信号的定义也由 wire 改为 reg。具体修改内容为:

  1、 代码 49 行,“wire vcount_ov”改为“reg vcount_ov”,如下图所示:

在这里插入图片描述

图9 修改vcount_ov类型

2、代码 94 行对 vcount_ov 的 assign 赋值语句采用注释的方式屏蔽掉,加上新的时序逻辑描述的代码,如下图所示:
在这里插入图片描述

图10 修改Vcount_ov处代码

  这里将组合电路改为时序电路,vcount_ov 是会延迟一个时钟周期的,为什么不把条件vcount_r ==vline_end 改为vcount_r ==vline_end -1去弥补这一个时钟周期?因为 vcount_r 的变化不是每个时钟都有可能的,只有在 hcount_r 每计满一次才会变化一次,所以这一个时钟周期的延迟没有影响。

  那么,上述操作真的就能提升系统性能吗?能提升多少呢?这个嘛,就可以通过修改设计后重新编译,再对设计进行时序分析来知晓了。全编译之后再看一下,结果如下所示:
在这里插入图片描述

图11 优化结果

  300.48MHZ???哈哈,一顿操作猛如虎,之前是270.12MHZ,现在是 300.48MHZ,提升了近 30MHzZ了。

  首先来说,经过这一波操作,确实没有明显提升最大运行主频,但是这并不代表此方法错了,或者说此方法是没用的,只能说操作还没完。时序分析和约束的过程是一个“约束—>分析—>再约束/修改—>再分析”的往复循环的过程,一次操作只能解决部分问题,当执行了修改之后,也许之前的关键路径解决了,但是马上又会有新的路径成为关键路径,需要再对新的关键路径进行分析,直到最后满足设计需求或者再也无法优化。既然如此,那就继续分析吧,看看经过修改之后,成为新的影响系统运行时钟频率的关键路径是哪个。

  通过查看 Worst-Case Timing Paths 下面的 Setup ‘Clk9M’选项,可以看到,此次 vcount_r到vcount_r的这条路径,已经没有提示时序余量为负了,甚至都没有出现在Worst-Case Timing Paths 里面,那么这里,我想留个疑问在这里,供有心的童鞋去思考:此时,hcount_r 到 vcount_r的余量是多少,该怎么看,或者,问个更意外的问题,该条路径是否还在?本笔记不对该问题作答,仅供有心的童鞋去思考。

  此次 vcount_r 到 vcount_r 的这条路径,已经没有提示时序余量为负了,时序余量最小的路径是hcount_r[4]到 vcount_r[3],该路径时序余量为-2.328。
在这里插入图片描述

图12 优化后的最坏路径如上图

  定位到该路径相关的代码位置,经过分析发现,vcount_r 的计数条件除了和 vcount_ov相关以外,还和 hcount_ov 相关,而 hcount_ov 的产生方法和 vcount_ov 的完全一致,也是使用的组合逻辑直接产生的。

  既然这样,那就借鉴前面优化 vcount_ov 的思路,使用同样的方法把 hcount_ov 也优化了,既把 hcount_ov 的产生也改写为时序逻辑。

  1、 代码 48行,“wire hcount_ov”改为“reg hcount_ov”,如下图所示:
在这里插入图片描述

图13 修改hcount_ov信号类型

  2、代码 79 行对 hcount_ov 的 assign 赋值语句采用注释的方式屏蔽掉,加上新的时序逻辑描述的代码,如下图所示:
在这里插入图片描述

图14 修改hcount_ov处代码

  至于图中为啥是 hpixel_end – 1 而不是原来的 hpixel_end ,因为这是寄存器输出,会有一个时钟周期的延迟,所以为了和之前没有修改的时序一致,需要提前一个时钟周期产生该信号。

  全编译之后再看一下,结果如下所示:

在这里插入图片描述

图15 优化后系统最坏路径

  最坏路径的时序余量为-1.518ns,则:Fmax = 1 / (Tclk - Tslack) = 1 / (1 – (-1.518)) = 397.1406MHZ

  再看下报告里的 Fmax Summary,也是一样的值:

在这里插入图片描述

图16 优化后系统最大时钟频率

  此时hcount_r 到hcount_r的延迟已经不能够依靠更改RTL代码进行优化了,只能通过更改触发器内部结构才能继续优化,但是这已经不是用户该考虑的问题了;

总结

  到此为止,已经优化到了一个比较高的程度了,要再优化,就要从计数器的结构入手了,通过修改计数器的结构来优化,这就很烧脑了。对于当前这个代码,能在 Cyclone IV E 上跑出 393MHz 的频率,相信大家已经很满意了。所以呢关于优化的内容,讲到这里,也就基本差不多了。方法很简单,也就是常说的,插入寄存器大法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RibbitMQ 入门到应用 ( 一 ) 基本概念

1.什么是RabbitMQ 1.0.什么是MQ 1.1.RabbitMQ简介 消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中&#…

基于YOLOV5的钢材缺陷检测

数据和源码见文末 1.任务概述 数据集使用的是东北大学收集的一个钢材缺陷检测数据集,需要检测出钢材表面的6种划痕。同时,数据集格式是VOC格式,需要进行转化,上传的源码中的数据集是经过转换格式的版本。 2.数据与标签配置方法 在数据集目录下,train文件夹下有训练集数据…

机器学习基本概念总结

深度学习是机器学习的一个特定分支,要想充分理解深度学习,就必须对机器学习的基本原理有深刻的理解。机器学习的本质属于应用统计学,其更多地关注如何用计算机统计地估计复杂函数,而不太关注为这些函数提供置信区间,大…

HTTP、HTTPS

目录 1.HTTP 1.1.概述 1.2.报文结构 1.2.1.请求报文 1.2.2.响应报文 1.3.方法 2.HTTPS 1.HTTP 1.1.概述 HTTP,超文本传输协议,WEB体系选用了该协议作为应用层协议。 1.2.报文结构 1.2.1.请求报文 HTTP的请求报文(request&#xff0…

idea集成chatGPT

idea集成chatGPT 一、idea安装chat GPT插件 1.在Plugins中搜索chatGPT,找到如图所示的这个并点击安装,安装完成后点击apply 插件安装成后会出现chatGPT的图标 2.点击点击工具窗口的扳手按钮,将进行插件的初始设置,这里选择官方…

Linux GPIO模块-RK3588 GPIO驱动分析

1.简介 GPIO是可编程的通用I/O外设。如下图所示,RK3588 GPIO控制器包含3个部分;APB接口模块和SoC内部的APB总线连接,负责与SoC交换数据,位宽为32位;I/O port接口模块管理外部的引脚,引脚的输入和输出都要经…

C++复习笔记7

1.C内存分区 C内存分区:代码区:存放函数体的二进制代码,由操作系统管理 全局区:存放全局变量静态变量和常量。 栈区:编译器分配,存放函数的参数值和局部变量等。 堆区:由程序员分配和释放&a…

IntelliJ IDEA 创建JavaFX项目运行

IntelliJ IDEA 创建JavaFX项目运行JavaFX官网文档:https://openjfx.io/openjfx-docs/ JavaFX 2008年12月05日诞生,是一个开源的下一代客户端应用程序平台,适用于基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司的协作努力&#…

函数栈帧的创建和销毁(C语言)

函数栈帧的创建和销毁(C语言)前言主体前言 函数栈帧是一个非常重要的概念,是重点也是难点,当然涉及底层方面的知识都会很难,但是对我们理解函数的创建和运用有非常重要的作用。本篇博客的目的就是了解函数栈帧的创建和…

go 命令行工具整理

这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。 比方说&#x…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析

目录 一、单选题(共25题,共50分) 二、判断题(共10题,共20分) 三、编程题(共2题,共30分) 青少年软件编程(图形化)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 小明想在开始…

【博学谷学习记录】超强总结,用心分享 | 架构师 Spring源码学习总结

文章目录Spring的循环依赖1.循环依赖的定义&&原因2.循环依赖的场景1.构造器注入引起循环依赖2.Field属性setter注入的循环依赖3.循环依赖解决思路4.三级缓存5.面试题[三级缓存]AOP源码深度剖析概述Spring AOP的前世今生实现机制**JDK 动态代理****CGLIB 代理**流程总结…

六十分之十三——黎明前

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地,对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.吴军系列硅谷来信1听书、香帅的北大金融…

成都哪家机构的Java培训比较好,求一个不坑的?

关于这个问题,相信你会得到很多条答案,以及很多家机构的自荐。既然如此,不如也了解一下老牌IT职业教育机构:有足够丰富的教学经验,丰富的教学产品资源以及成熟的就业保障体系,还有就是承担风险的能力。 很…

计算机网络7:传输层相关

目录1-传输层1.1 UDP 和 TCP 的特点1.1.1 UDP用户数据报格式1.1.2 TCP首部格式1.1.2.1 常用端口号1.2 TCP的三次握手1.2.1 三次握手的原因1.3 TCP四次挥手1.3.1 四次挥手的原因1.3.2 TIME_WAIT为什么是2MSL1.4 TCP的可靠传输有效机制1.4.1 TCP可靠传输-超时重传1.4.2 TCP流量控…

封装、继承、Super、重写、多态instanceof类型转换的使用以及个人见解

这里写目录标题封装继承supersuper和this的区别重写多态instanceof类型转换封装 之前我们调用共有的属性,是直接可以调用的 但是属性私有后,无法在直接.调用 只能通过getset调用 继承 super 可以直接调用父类中属性和方法,私有的无法做 其…

TCP详解及面试相关问题

文章目录1、计算机模型2、客户端和服务端通信——TCP协议(1)socket套接字(2)TCP三次握手——创建socket(3)连接的本质(4)TCP四次挥手——释放socket资源(5)TC…

如何用PHP实现消息推送

什么是消息推送 通过服务器自动推送消息到客户端(浏览器,APP,微信)的应用技术。 2. 为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据…

SSH 服务详解 (八)-- vscode 通过 SSH 远程连接 linux 服务器

vscode 通过 SSH 远程连接 linux 服务器 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 (三)-- 使用 SSH 代理 SSH 服务详解 (四)-- 本地调用远程主机的命令 SSH 服务详解 (五)-- 远程文件拷贝…

零信任-微软零信任介绍(2)

微软零信任是什么? Microsoft Zero Trust 是一种安全架构,旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术,以确保每个请求和资源的安全性。 零信任不假定任何内部用户或设备是安全的&#xff…