73.Vivado使用误区与进阶——在Vivado中实现ECO功能
关于Tcl在Vivado中的应用文章从Tcl的基本语法和在Vivado中的应用展开,继上篇《用Tcl定制Vivado设计实现流程》介绍了如何扩展甚至是定制FPGA设计实现流程后,引出了一个更细节的应用场景:如何利用Tcl在已完成布局布线的设计上对网表或是布局布线进行局部编辑,从而在最短时间内,以最小的代价完成个别的设计改动需求。
什么是ECO
ECO指的是Engineering Change Order,即工程变更指令。目的是为了在设计的后期,快速灵活地做小范围修改,从而尽可能的保持已经验证的功能和时序。ECO的叫法算是从IC设计领域继承而来,其应用在FPGA设计上尚属首次,但这种做法其实在以往的FPGA设计上已被广泛采用。简单来说,ECO便相当于ISE上的FPGA Editor。
但与FPGA Editor不同,Vivado中的ECO并不是一个独立的界面或是一些特定的命令,要实现不同的ECO功能需要使用不同的方式。
ECO的应用场景和实现流程
ECO的应用场景主要包含:修改cell属性、增减或移动cell、手动局部布线。还有一些需要多种操作配合的复杂场景,例如把RAM(或DSP)的输出寄存器放入/拉出RAMB(或DSP48)内部,或是把设计内部信号接到I/O上作调试probe用等等。
针对不同的应用场景,Vivado中支持的ECO实现方式也略有区别。有些可以用图形界面实现,有些则只能使用Tcl命令。但通常可以在图形化界面上实现的操作,都可以改用一条或数条Tcl命令来实现。
ECO的实现流程如下图所示:

第一步所指的Design通常是完全布局布线后的设计,如果是在工程模式下,可以直接在IDE中打开实现后的设计,若是仅有DCP文件,不论是工程模式或是非工程模式产生的DCP,都可以用open_checkpoint命令打开。
第二步就是ECO的意义所在,我们在布局布线后的设计上进行各种操作,然后仅对改动的部分进行局部布局/布线而无需整体重跑设计,节约大量时间的同时也不会破坏已经收敛的时序。
第三步就是产生可供下载的bit文件了,此时必须在Tcl Console中或是Tcl模式下直接输入命令产生bit文件,而不能使用IDE上的“Generate Bitstream”按钮。原因是后者读到的还是ECO前已经完成布局布线的原始设计,生成的bit文件自然也无法使用。
修改属性
绝大部分的属性修改都能通过IDE界面完成,如下图所示:

比如要修改寄存器的初值INIT或是LUT的真值表,用户只需在Vivado IDE中打开布局布线后的设计(Implemented Design),在Device View中找到并选中这个FF/LUT,接着在其左侧的Cell Properties视图中选择需要修改的属性,直接修改即可。
除了对FF/LUT的操作外,很多时候我们需要对MMCM/PLL输出时钟的相移进行修改。对于这种应用,用户也无需重新产生MMCM/PLL,与上述方法类似,可以在布局布线后的Device View上直接修改。

移动/交换cells
移动/交换cells是对FF/LUT进行的ECO操作中最基本的一个场景,目前也只有这种情况可以通过图形化实现。如要删减cells等则只能通过Tcl命令来进行。
具体操作方法也相当简便,要互换cells位置的情况下,只要在Device View上选中需要的那两个cells,如上图所示的两个FFs,然后右键调出菜单,选择Swap Locations即可。若要移动cells则更简单,直接在图中选中FF拖移到新的位置即可。

当用户移动或改变了cells的位置后会发现与其连接的nets变成了黄色高亮显示,表示这些nets需要重新布线。这时候需要做的就是在图中选中这些nets然后右键调出菜单,选择Route进行局部布线。

局部布线后一定要记得在Tcl Console中使用report_route_status命令检查布线情况,确保没有未完成布线(unrouted)或是部分未完成布线(partial routed)的nets存在。给这个命令加上选项则可以报告出更细致的结果,如下图所示。

如果换个稍复杂些的Tcl命令配合图形化显示,更加直观的同时,也可以方便右键调出命令进行针对性的局部布线。

手动布线
手动布线是一种非常规的布线方式,一次只能针对一根net在图形化界面下进行。所谓手动布线,除了完全手动一个节点一个节点的选择外,也支持工具自动选择资源来布线。通常我们并不建议全手动的方式,Vivado是时序驱动的工具,所以其自动选择的布线结果已经是遵循了时序约束下的最佳选择。
在Device View中选择一根没有布线或是预先Unroute过的net(显示为红色高亮),右键调出菜单并选择Enter Assign Routing Mode… 便可进入手动布线模式。

复杂的ECO场景
篇幅过半,一直在铺垫,其实最有实践意义的ECO还没提到。相信大部分用户最怀念FPGA Editor中的一个功能就是probe了,如何快速地把一根内部信号连接到FPGA管脚上,无需重新布局布线,直接更新bit文件后下载调试。曾经数次被客户问及,很多人还为Vivado中不支持这样的做法而深表遗憾。
其实这样类似的功能在Vivado中一直支持,唯一的问题是暂时还没有图形化界面可以一键操作(相关开发工作已经在进行中)。但受益于Tcl的灵活多变,我们可以更有针对性地实现probe功能,效率也更高。
Tcl操作命令
在UG835中把Vivado支持的Tcl命令按照Category分类,这些列于Netlist目录下的命令就是实现ECO需要用到的那些。

通常涉及到增减cells的ECO基本分为三步实现:首先用create_cell / create_net 等创建相关cell和/或net,然后用disconnect_net / connect_net 等命令修正因为cell和net的改动而影响到的连接关系,最后用route_design加选项完成局部布线。
不同的Vivado版本对此类ECO修改有稍许不同的限制,例如在2014.1之后的版本上,需要在改变cell的连接关系前先用unplace_cell将cell从当前的布局位置上释放,在完成新的连接关系后,再用place_cell放到新的布局位置上。
具体操作上可以根据Vivado的提示或报错信息来改动具体的Tcl命令,但操作思路和可用的命令相差无几。

这是一个在Vivaod上实现probe功能的Tcl脚本,已经写成了proc子程序,简单易懂。可以直接调用,也可以做成Vivado的嵌入式扩展命令。调用其生成probe只需先source这个脚本,然后按照如下所示在Tcl Console中输入命令即可。
Vivado% addProbe inst_1/tmp_q[3] D9 LVCMOS18 my_probe_1
该脚本已经在Vivado2014.3和2014.4上测试过,一次只能完成一个probe的添加,而且必须按照上述顺序输入信号名,管脚位置,电平标准和probe名。因为不具备预检功能,可能会碰到一些报错信息而导致无法继续。例如选择的信号是只存在于SLICE内部的INTRASITE时,则无法拉出到管脚。再比如输入命令时拼错了电平标准等,也会造成Tcl已经部分修改Vivado数据库而无法继续的问题。此时只能关闭已经打开的DCP并选择不保存而重新来过。
用户可以根据自己的需要扩展这个Tcl脚本,也可以仿照这个Tcl的写法来实现其它的ECO需求。例如文章开始举例时提到过一个将RAMB输出一级的FF拉出到Fabric上实现的场景,基本的实现方法和思路也类似:先将RAMB的输出口REG的属性改为0,然后创建一个新的FF,将其输入与RAMB的输出连接,再将FF的输出与原本RAMB输出驱动的cell连接,并完成FF的时钟和复位端的正确连接,然后选择合适的位置放置这个新的FF,最后针对新增加的nets局部布线。
由此可见,用Tcl来实现的ECO虽然不及图形化界面来的简便直观,但是带给用户的却是最大化的自由。完全由用户来决定如何修改设计,那怕是在最后已经完成布局布线时序收敛的结果上,也能直接改变那些底层单元的连接关系,甚至是增减设计。
ECO在Vivado上的发展
经过了两年多的发展,在Vivado上实现ECO已经有了多种方式,除了前面提到的图形化上那些可用的技巧,还有用户自定义的Tcl命令和脚本等。随着Xilinx Tcl Store的推出,用户可以像在App Store中下载使用app一样下载使用Tcl脚本,简化了Tcl在Vivado上应用的同时,进一步扩展了Tcl的深入、精细化使用,其中就包括Tcl在ECO上的应用。
目前Vivado 2014.4版本上新增了很多有用的脚本。安装好Vivado后,只需打开Tcl Store,找到Debug Utilities,点击Install,稍等片刻,即可看到一个add_probe的Tcl proc被安装到了你的Vivado中。

这个add_probe是在上述addProbe例子的基础上扩展而来,不仅可以新增probe,而且可以改变现有probe连接的信号。此外,这个脚本采用了argument写法,点击程序可以看help,所以不一定要按照顺序输入信号、电平标准等选项,输错也没有问题。另外增加了预检和纠错功能,碰到问题会报错退出而不会改变Vivado数据库,效率更高。
此外,Tcl Store上还有很多其它好用的脚本,欢迎大家试用并反馈给我们宝贵意见。虽然里面关于ECO的脚本还很少,但我们一直在补充。此外Tcl Store是一个基于GitHub的完全开源的环境,当然也欢迎大家上传自己手中有用的Tcl脚本,对其进行补充。
总体来说,ECO是一个比较大的命题,因为牵扯到的改动需求太多,其实也很难限制在一个GUI界面中实现。这篇文章的目的就是为了让大家对在FPGA上实现ECO有个基本的认识,梳理看似复杂无序的流程,所谓观一叶而知秋,窥一斑而见全豹,希望能带给更多用户信心,用好Vivado其实一点都不难。
73.Vivado使用误区与进阶——在Vivado中实现ECO功能的更多相关文章
- Python进阶:自定义对象实现切片功能
2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...
- J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())
J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate()) 当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...
- vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb
vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一 ...
- Java进阶4表达式中的陷阱
Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算 ...
- Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身
Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...
- ORM进阶之Hibernate中对象的三大状态解析
ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一 ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
- js进阶 11-18 jquery中操作选择器的方法有哪些
js进阶 11-18 jquery中操作选择器的方法有哪些 一.总结 一句话总结:add().addBack().end() 1.add()方法是干嘛的,举一例? 将add()方法后选择器选择的jqu ...
- js进阶 11-3 jquery中css属性如何操作
js进阶 11-3 jquery中css属性如何操作 一.总结 一句话总结:通过css()方法 1.attr和css是有交叉的,比如width,两者中都可以设置,那么他们的区别是什么? 其实通俗一点 ...
随机推荐
- 【Python】python学习文件的序列化和反序列化
json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...
- UVA12545_Bits Equalizer
题目意思很简单,给你两个串,第一个串为0,1或者?,第二个串为0,1, 每次你可以对第一个串进行三种操作,1.0变为1:2.?变为0或者1:3.交换任意两个数的位置. 现在问你能否把第一个串变为第一个 ...
- stm32f4xx系统总线架构
最近有人在STMCU社区网站咨询如下问题: 由于实验需要,要用到STM32F407的两个DMA并用定时器触发,在使用过程中发现DMA1无法把GPIO的IDR上的数据传输到内存,调试过程中出现DMA1的 ...
- 高斯消元模板(pascal)
洛谷P3389评测 program rrr(input,output); const eps=1e-8; var a:..,..]of double; n,i,j,k:longint; t:doubl ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流
题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...
- QoS专题-第4期-QoS实现之限速
QoS实现之限速 通过前面几篇介绍,大家都知道了MQC是实现QoS的技术,优先级映射是实现QoS的前提条件.读完之后也许无法直观感觉到QoS是如何提升网络服务质量.今天小编给大家介绍限速,通过实验,可 ...
- (三)MySQL学习笔记
[Leecode]175. 组合两个表 解答:由于是组合两个表的信息,很容易想到连接查询,这里使用左连接 select p.Firstname,p.Lastname,q.City,q.State fr ...
- [POI2012]OKR-A Horrible Poem hash
题面:洛谷 题解: 首先我们需要知道一个性质,串s的最小循环节 = len - next[len].其中next[len]表示串s的一个最长长度使得s[1] ~ s[next[len]] == s[l ...
- 洛谷 P1858 多人背包 解题报告
P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...