【Vivado使用误区与进阶】在Vivado中实现ECO功能
2015-03-05
关于Tcl在Vivado中的应用文章从Tcl的基本语法和在Vivado中的应用展开,继上篇xilinx" title="xilinx">《用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文件自然也无法使用。
ECO的实现流程
绝大部分的属性修改都能通过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命令,但操作思路和可用的命令相差无几。
Add Probe
这是一个在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其实一点都不难。