ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA时序图绘制实战:TimeGen 3.2从入门到精通

FPGA时序图绘制实战:TimeGen 3.2从入门到精通 1. 时序图这件小事为什么值得单独拎出来讲做 FPGA 的人都有一个共识代码写得好不好仿真跑一跑就知道但时序关系讲不讲得清一张图就能看出功底。你肯定遇到过这种场景——跟同事讨论一个跨时钟域握手协议嘴上说了十分钟先拉高 valid等两个周期后 ready 有效然后 data 保持到 ready 拉低后的下一个时钟沿对方还是一脸茫然。这时候你打开 TimeGen五分钟画一张时序图甩过去沟通成本瞬间归零。TimeGen 就是干这个的。它是一款专门用来画数字时序图的工具定位非常明确不搞花里胡哨的矢量绘图就是让你快速、准确地画出时钟、信号、总线、状态这些数字设计里最常见的东西。3.2 这个版本在 FPGA 圈子里流传很广体积小、启动快、上手门槛低画出来的图直接能贴进设计文档、专利交底书、项目周报里。这篇文章适合谁看如果你是刚入行的 FPGA 工程师正在为怎么写设计文档发愁如果你是在校学生做课程设计或参加嵌赛需要画时序说明如果你是老手但一直用 Visio 或手绘凑合想找个更专业的工具——那这篇内容你应该能从头看到尾。我会把 TimeGen 3.2 的完整使用流程、参数设置背后的逻辑、以及我这些年踩过的坑全部摊开讲清楚。需要先说明一点网上流传的所谓特殊版本文件来源不明可能捆绑恶意程序或篡改过的可执行文件对开发环境和个人信息都存在风险。我个人的建议是走正规渠道获取授权学生可以看看有没有教育优惠公司项目该买就买省下来的排查时间远比授权费值钱。本文只讲工具本身的使用方法不涉及任何获取途径的讨论。2. 先搞清楚时序图到底在画什么2.1 数字设计里时序图的三层信息很多人画时序图画了半天只是把信号波形摆上去结果关键信息全丢了。一张合格的时序图至少要承载三层信息。第一层是信号的电平变化也就是哪根线在哪个时刻从低变高、从高变低。这是最基础的TimeGen 里用鼠标点几下就能画出来。第二层是时间关系包括时钟周期、建立时间、保持时间、信号之间的先后顺序、某个信号需要维持多少个周期。这层信息决定了你的设计能不能正常工作也是时序图真正的价值所在。第三层是约束和标注比如某个信号必须在另一个信号之后 2ns 到 5ns 之间有效或者某段数据需要保持稳定直到握手完成。我见过太多人只画第一层图看起来挺漂亮但拿给验证工程师看对方第一句话就是这个 data 要保持几个周期——因为图上根本没标。TimeGen 的好处在于它把这三层信息都做进了工具里关键看你会不会用。2.2 为什么不用 Visio 或手绘有人会问Visio 也能画时序图手绘更快为什么要专门用 TimeGen手绘的问题在于不精确。你画一条斜线表示信号上升别人没法判断这是 1ns 还是 10ns 的边沿。Visio 的问题在于效率低画一个时钟信号你得一根一根竖线去摆改一个周期数就得全部重来。TimeGen 的核心优势是参数化你告诉它时钟周期是 10ns它自动帮你把整个时钟波形铺满你告诉它某个信号延迟 3 个周期它自动帮你对齐。改参数的时候整张图跟着变不用手动调。还有一个隐性优势是一致性。团队里大家都用 TimeGen画出来的图风格统一信号命名规范一致评审的时候不会因为图本身的问题浪费时间。这个价值在项目规模大了之后特别明显。2.3 TimeGen 3.2 的界面逻辑打开 TimeGen 3.2界面分成几个区域左边是信号列表中间是波形绘制区上方是工具栏下方是时间轴。这个布局跟大多数波形工具类似但有几个细节需要特别注意。信号列表里每一行代表一根信号线你可以给它命名、设置颜色、选择类型时钟、普通信号、总线、状态机等。波形绘制区是主战场鼠标左键点击切换电平右键拖拽可以框选区域。时间轴默认以格为单位每一格代表一个时间单位这个单位是可以自定义的——你可以设成 1ns、10ns 或者干脆设成1 个时钟周期。工具栏里有几个高频按钮时钟生成、总线编辑、文本标注、箭头工具。这几个是你 90% 时间都会用到的建议先把快捷键记熟。3. 从零开始画一张标准时序图3.1 环境准备与基础设置第一次打开 TimeGen 3.2先别急着画。花两分钟把几个基础设置调好后面能省很多事。时间单位设置。在菜单里找到时间轴设置把基本时间单位设成你项目里最常用的那个。做 FPGA 的话一般设成 1ns 或者直接设成时钟周期。我个人的习惯是设成 1ns因为这样画建立保持时间窗口的时候比较直观。默认时钟参数。TimeGen 允许你预设几个常用时钟频率比如 50MHz、100MHz、200MHz。设好之后插入时钟信号的时候直接选就行不用每次手算周期。50MHz 对应 20ns 周期100MHz 对应 10ns200MHz 对应 5ns这几个数建议背下来画图的时候心里有数。信号命名规范。这个不是软件设置是习惯问题。建议统一用项目里的实际信号名大小写保持一致低有效信号加 _n 或 _b 后缀。别在图上写clk1clk2这种过两天自己都忘了哪个是哪个。网格和对齐。把网格打开设置成合适的大小。画图的时候让信号边沿自动吸附到网格上这样对齐起来快图也整齐。网格太密看着眼花太疏又对不齐一般设成时钟周期的四分之一或者五分之一比较合适。3.2 插入时钟信号与参数计算时钟是时序图的骨架先把时钟画好其他信号才有参照。在 TimeGen 里插入时钟很简单点击工具栏的时钟按钮在波形区点一下一个标准时钟就出来了。但关键是参数怎么设。假设你的系统时钟是 100MHz那周期就是 10ns占空比 50%高电平 5ns低电平 5ns。在时钟属性里把这些数填进去TimeGen 会自动生成对应的波形。如果图上有多个时钟域比如一个 100MHz 的系统时钟和一个 25MHz 的慢速时钟你需要分别设置。这里有个技巧把慢时钟的周期设成快时钟的整数倍这样两个时钟的边沿会对齐画跨时钟域信号的时候看起来清楚。25MHz 周期是 40ns正好是 100MHz 的 4 倍画出来就是每 4 个快时钟周期对应 1 个慢时钟周期。注意时钟的相位关系也要设对。如果两个时钟同源但相位不同比如一个 0 度一个 90 度在属性里把相位差填进去别靠手动拖拽那样不准。3.3 绘制普通信号与总线时钟画好之后开始画控制信号和数据信号。普通信号就是高低电平的切换。在 TimeGen 里鼠标左键点击波形区可以在高、低、高阻三个状态之间切换。画的时候注意几点信号的初始状态要明确别留空边沿要跟时钟对齐除非你就是要画异步信号信号名要跟 RTL 代码里一致。总线信号的画法稍微不同。你需要先定义一个总线给它起个名字比如 data[7:0]然后画的时候可以填入具体的数值。TimeGen 支持在总线上显示十六进制或二进制数值这个功能在画数据通路的时候特别好用。比如你画一个 AXI 的写数据通道总线上依次显示 0x1A、0x2B、0x3C评审的人一眼就能看出数据流。画总线的时候有个细节总线在无效期间应该显示成什么一般有两种画法一种是画成两条平行线中间打叉表示高阻另一种是画成一条粗线表示不确定值。TimeGen 里两种都支持看你的项目规范。我一般用打叉的那种因为更直观。3.4 添加标注、箭头与时间刻度信号画完了但图还不能算完成。标注才是让图会说话的关键。文本标注用来写说明文字比如握手完成数据有效窗口建立时间。TimeGen 里可以插入文本框拖到合适的位置。建议把标注放在信号附近用引线连过去别让读者猜。箭头工具用来表示因果关系或时间关系。比如从 valid 的上升沿画一个箭头到 ready 的上升沿表示valid 拉高后 ready 才可能有效。或者画一个双向箭头标注两个信号之间的时间间隔写上2 个时钟周期。时间刻度是很多人忽略的。TimeGen 可以在图上显示时间标尺标出关键的时间点。比如在某个边沿处标一个 T1在另一个边沿处标一个 T2然后在图下方写T2 - T1 3 个时钟周期。这样即使图被单独截出来读者也能准确理解时间关系。提示标注的颜色要跟信号颜色区分开。信号用深色标注用浅色或者灰色这样图看起来有层次不会乱。4. 进阶技巧让时序图真正服务于设计4.1 跨时钟域信号的画法跨时钟域是 FPGA 设计里最容易出问题的地方时序图画得好不好直接影响你对问题的理解。画跨时钟域信号核心是把两个时钟域的信号分开画然后用标注说明同步关系。比如一个信号从 100MHz 域传到 25MHz 域经过两级触发器同步。图上应该画源时钟域的信号变化、两级同步触发器的输出、目标时钟域的采样结果。每一级之间用箭头标注同步级 1同步级 2。TimeGen 里可以用不同的背景色区分时钟域或者用一条竖线把两个域分开。我习惯用竖线加文字标注简单明了。关键是让读者一眼看出信号是在哪个时钟域里变化的以及跨域的时候经过了什么处理。还有一个技巧把亚稳态窗口画出来。虽然 TimeGen 不是仿真工具画不出真正的亚稳态但你可以用阴影区域表示这个时间段内信号可能不稳定。这个在写设计文档解释为什么需要同步器的时候特别有用。4.2 握手协议的完整表达握手协议是时序图的高频应用场景AXI、AHB、自定义的 valid-ready 协议都属于这一类。画握手协议要抓住几个关键点valid 和 ready 的先后关系、data 的有效窗口、握手完成的判定条件。以最经典的 valid-ready 握手为例规则是valid 拉高后必须保持到 ready 拉高ready 可以在 valid 之前拉高当 valid 和 ready 同时为高的那个时钟沿握手完成data 被采样。在 TimeGen 里画的时候建议把 valid、ready、data 三根信号放在一起用箭头标出握手完成的时刻。如果协议允许 ready 先拉高就画一个场景如果 valid 先拉高再画一个场景。把边界情况都画出来评审的时候就不会有人问如果 ready 先来怎么办。注意握手协议的时序图一定要标清楚是在哪个时钟沿采样。是上升沿还是下降沿是时钟沿到来之前还是之后这些细节决定了设计对不对。4.3 用 TimeGen 画状态机时序状态机的时序图跟普通信号不太一样它更关注状态的迁移和输出。TimeGen 里可以把状态机的状态画成总线形式每个状态对应一个编码。比如 IDLE0x0、READ0x1、WRITE0x2、DONE0x3。然后在状态总线上画出迁移过程配合时钟信号和输入输出信号完整展示状态机的工作过程。画状态机时序图的时候建议把状态迁移条件也标出来。比如从 IDLE 到 READ 的迁移在图上用箭头标注start 信号有效时。这样看图的人不仅知道状态怎么变还知道为什么变。如果状态机比较复杂可以分几张图画。一张画正常流程一张画异常处理一张画复位流程。别把所有情况塞进一张图那样谁都看不清。4.4 导出与文档集成图画完了最终是要放到文档里的。TimeGen 支持导出多种格式常用的有 PNG、BMP、EMF。PNG 适合放到 Word 或 Markdown 文档里清晰度够文件也不大。导出的时候把分辨率设高一点一般 300dpi 以上打印出来才清楚。EMF 是矢量格式放到 Word 里可以无损缩放适合需要打印的正式文档。BMP 基本不用考虑文件太大。导出之前记得检查几件事信号名有没有拼错、时间标注对不对、颜色在黑白打印时能不能区分。我吃过亏图上用红色和绿色区分两个信号结果打印出来全是灰的根本分不清。后来养成习惯重要信号用实线和虚线区分颜色只是辅助。5. 常见问题与排查技巧实录5.1 画图效率低的几个原因很多人用 TimeGen 觉得慢问题往往出在几个地方。不用快捷键。TimeGen 的常用操作都有快捷键比如插入时钟、切换电平、复制粘贴。花十分钟把快捷键过一遍后面画图速度能快一倍。不用模板。如果你们项目经常画类似的时序图比如 SPI 读写、I2C 传输、UART 收发建议做几个模板存起来。下次画的时候直接打开模板改参数比从零开始快得多。不用总线批量编辑。画数据总线的时候一个一个填数值很慢。TimeGen 支持批量输入比如你输入0x00 0x01 0x02 0x03它会自动分配到连续的时钟周期里。这个功能在画长数据流的时候特别省事。网格设置不合理。网格太密鼠标点不准网格太疏信号对不齐。花点时间找到适合你项目的网格大小后面画图会顺很多。5.2 时序图评审常被挑的问题我参加过不少设计评审时序图被挑毛病的地方翻来覆去就那么几个。常见问题具体表现改进方法时间关系不明确信号边沿没有对齐时钟或者没有标注延迟所有同步信号边沿对齐时钟异步信号标注延迟时间缺少边界情况只画了正常流程没画复位、异常、背压补充复位时序、错误处理、反压场景信号命名不一致图上写 clk代码里叫 sys_clk图上信号名与 RTL 代码严格一致缺少时间刻度读者无法判断信号之间隔了多久添加时间标尺或周期数标注总线数值不清晰总线上没有标数值或者数值格式不统一统一用十六进制无效期间明确标注跨时钟域处理未体现信号直接从一个时钟域画到另一个画出同步器标注时钟域边界这张表里的问题我几乎每次评审都能遇到几个。提前检查一遍能省不少返工时间。5.3 文件兼容性与版本问题TimeGen 3.2 是比较老的版本在新系统上运行可能会遇到兼容性问题。常见的有字体显示不正常、导出图片模糊、文件保存后打不开。字体问题一般是系统缺少对应字体装一个通用字体包基本能解决。导出模糊是分辨率设置的问题在导出选项里把 DPI 调高。文件打不开可能是版本不匹配TimeGen 的高版本文件低版本打不开团队里最好统一版本。还有一个坑TimeGen 的文件扩展名是 .tgw有些人会误存成其他格式结果下次打不开。保存的时候注意看扩展名别手滑。提示重要时序图建议同时保存源文件和导出的图片。源文件方便后续修改图片方便直接使用。别只存一种到时候着急用的时候抓瞎。5.4 从时序图到 RTL 代码的对照检查时序图画完之后建议做一次对照检查把图上的每个信号跟 RTL 代码里的信号对一遍把图上的每个时间关系跟代码里的逻辑对一遍。具体怎么做打开你的 RTL 文件找到对应的模块逐个信号核对。比如图上画了 valid 拉高后两个周期 ready 才拉高那代码里是不是真的有两个周期的延迟图上画了 data 在 ready 拉低后保持一个周期代码里是不是真的保持了一个周期这个检查看起来笨但能发现很多隐藏的 bug。我自己的经验是画图的时候觉得逻辑没问题一对照代码就发现少了一个周期或者多了一个寄存器。时序图不只是给别人看的也是给自己做设计检查的。6. 我这些年积累的几个实用心得6.1 建立个人时序图库我从入行第二年开始就有意识地积累时序图。每做一个项目把关键的时序图整理出来按协议类型分类SPI、I2C、UART、AXI、自定义握手……几年下来攒了几十张图。这个图库的价值在于下次遇到类似协议直接翻出以前的图改一改就能用不用从头画。而且这些图经过实际项目验证时间关系都是对的比临时画的靠谱。建议你也建一个用文件夹按协议分类文件名写清楚项目名和日期。6.2 时序图要跟代码一起版本管理时序图是设计文档的一部分应该跟 RTL 代码一起纳入版本管理。代码改了时序图跟着改时序图改了代码也要检查是否一致。我见过太多项目代码更新了好几版时序图还是第一版的评审的时候拿出来的图跟实际设计对不上尴尬不说还容易误导人。把 .tgw 文件跟 .v 文件放在同一个仓库里提交代码的时候顺便检查时序图要不要更新养成习惯就好了。6.3 给初学者的练习建议如果你刚开始用 TimeGen别一上来就画复杂的协议。从最简单的开始画一个时钟和一个分频信号画一个计数器的时序画一个简单的状态机。把这些基础画熟了再挑战握手协议和跨时钟域。练习的时候可以对照现成的协议手册比如 SPI 的时序图手册上怎么画你就怎么画画完对比一下差异。这个过程能帮你理解协议的本质也能帮你熟悉 TimeGen 的操作。还有一个小技巧把你画好的图发给有经验的同事看让他们挑毛病。别人挑出来的问题往往是你自己看不到的盲区。被挑几次之后你画图的时候就会自然而然地避开这些坑。6.4 关于工具选择的个人看法TimeGen 不是唯一的时序图工具市面上还有 WaveDrom、TimingDiagram 等。WaveDrom 是文本驱动的适合喜欢用代码描述波形的人TimeGen 是图形界面的适合习惯鼠标操作的人。选哪个工具不重要重要的是坚持用。工具换来换去每换一次都要重新学时间都浪费在适应工具上了。我选 TimeGen 是因为它够简单打开就能画画完就能用。对于 FPGA 工程师来说时序图是沟通工具不是艺术品够用就行。最后说一句关于版本的事。3.2 版本虽然老但核心功能都有画常规时序图完全够用。如果你有正规渠道获取的新版本当然更好。但不管用什么版本画图的思路和方法是一样的——先把时钟画对再把信号画准最后把标注写清楚。这三步做好了图就不会差。
返回列表