关于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功能的更多相关文章

  1. Python进阶:自定义对象实现切片功能

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  2. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  3. vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb

    vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一 ...

  4. Java进阶4表达式中的陷阱

    Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算 ...

  5. Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身

    Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...

  6. ORM进阶之Hibernate中对象的三大状态解析

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一 ...

  7. js进阶 12-13 jquery中one方法和trigger方法如何使用

    js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...

  8. js进阶 11-18 jquery中操作选择器的方法有哪些

    js进阶 11-18 jquery中操作选择器的方法有哪些 一.总结 一句话总结:add().addBack().end() 1.add()方法是干嘛的,举一例? 将add()方法后选择器选择的jqu ...

  9. js进阶 11-3 jquery中css属性如何操作

    js进阶 11-3  jquery中css属性如何操作 一.总结 一句话总结:通过css()方法 1.attr和css是有交叉的,比如width,两者中都可以设置,那么他们的区别是什么? 其实通俗一点 ...

随机推荐

  1. 第116天: Ajax运用artTemplate实现菜谱

    Ajax运用artTemplate实现菜谱 一.获取接口数据 1.聚合数据API    https://www.juhe.cn,在这上面找到菜谱大全数据接口文档 具体使用是这样的: key后面的数据是 ...

  2. UVA11737_Extreme Primitive Society

    这是隐藏的最深的一个水题.其隐藏性能如此之好,是因为题目的描述十分蛋疼,写了好多好多的废话. 让我们这种过不了六级的孩子情何以堪啊. 是这样的,给你若干个矩形,每次在所有的矩形中两两组合形成许多许多新 ...

  3. 洛谷 P2057 善意的投票(网络流最小割)

    P2057 善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法 ...

  4. [您有新的未分配科技点]博弈论入门:被博弈论支配的恐惧(Nim游戏,SG函数)

    今天初步学习了一下博弈论……感觉真的是好精妙啊……希望这篇博客可以帮助到和我一样刚学习博弈论的同学们. 博弈论,又被称为对策论,被用于考虑游戏中个体的预测行为和实际行为,并研究他们的应用策略.(其实这 ...

  5. Django对应的路由名称

    1. 名字很长,修改起来很麻烦 2.Django提供了一种方法 在urls.py中修改了名字以后,html中会自动对应做修改.这样提交表单的时候就会比较方便了.跳转到写死的某个URL. 3.根据名字i ...

  6. linux-----遇到的问题----tab键不补全sh文件不能运行

    在linux上部署tomcat,进入bin目录后 遇到了tab键不补全sh文件不能运行的情况. 如果自己输入sh文件名后也会报错: [x@web bin]$ ./startup.shbash: ./s ...

  7. 省选模拟赛 LYK loves graph(graph)

    题目描述 LYK喜欢花花绿绿的图片,有一天它得到了一张彩色图片,这张图片可以看做是一张n*m的网格图,每个格子都有一种颜色去染着,我们用-1至n*m-1来表示一个格子的颜色.特别地,-1代表这个颜色是 ...

  8. jetbrains phpstorm插件开发环境搭建

    2018.04.14 重要更新: 使用 gradle 进行构建可以免去下面大部分步骤,使用 gradle 我们仅需下载安装 JDK.Idea. 使用 gradle 的方法是,新建 Project,然后 ...

  9. 利用StringUtils可以避免空指针问题

    这篇文章的来源于在项目中的空指针问题,利用StringUtils可以避免这个空指针问题. 有时候代码中是会出现如下情况if("".equals(str) && st ...

  10. ThinkPHP+Memcache的缓存方案总结

    简介: ThinkPHP用S()方法可以缓存数据,这在访问数据库时非常有用,可以在有限时间内当数据库无变化时从缓存取数据,有变化时从数据库取数据. Memcached+Memcache是一个将数据保存 ...