取消
显示结果 
搜索替代 
您的意思是: 
Highlighted
Xilinx Employee
Xilinx Employee
13,228 次查看
注册日期: ‎04-24-2013

【Vivado使用误区与进阶】在Vivado中实现ECO功能

在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的实现流程如下图所示:

 

 

eco4.png

 

       

        第一步所指的Design通常是完全布局布线后的设计,如果是在工程模式下,可以直接在IDE中打开实现后的设计,若是仅有DCP文件,不论是工程模式或是非工程模式产生的DCP,都可以用open_checkpoint命令打开。

 

        第二步就是ECO的意义所在,我们在布局布线后的设计上进行各种操作,然后仅对改动的部分进行局部布局/布线而无需整体重跑设计,节约大量时间的同时也不会破坏已经收敛的时序。

 

        第三步就是产生可供下载的bit文件了,此时必须在Tcl Console中或是Tcl模式下直接输入命令产生bit文件,而不能使用IDE上的“Generate Bitstream”按钮。原因是后者读到的还是ECO前已经完成布局布线的原始设计,生成的bit文件自然也无法使用。

 

修改属性

 

        绝大部分的属性修改都能通过IDE界面完成,如下图所示:

 

 eco20.PNG

 

        比如要修改寄存器的初值INIT或是LUT的真值表,用户只需在Vivado IDE中打开布局布线后的设计(Implemented Design),在Device View中找到并选中这个FF/LUT,接着在其左侧的Cell Properties视图中选择需要修改的属性,直接修改即可。

 

        除了对FF/LUT的操作外,很多时候我们需要对MMCM/PLL输出时钟的相移进行修改。对于这种应用,用户也无需重新产生MMCM/PLL,与上述方法类似,可以在布局布线后的Device View上直接修改。

 

eco1.png

 

移动/交换cells

 

        移动/交换cells是对FF/LUT进行的ECO操作中最基本的一个场景,目前也只有这种情况可以通过图形化实现。如要删减cells等则只能通过Tcl命令来进行。  

 

        具体操作方法也相当简便,要互换cells位置的情况下,只要在Device View上选中需要的那两个cells,如上图所示的两个FFs,然后右键调出菜单,选择Swap Locations即可。若要移动cells则更简单,直接在图中选中FF拖移到新的位置即可。

 

eco11.PNG


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

 

eco12.PNG

 

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

 

eco15.PNG

 

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

 

eco21.PNG

 

手动布线

         

        手动布线是一种非常规的布线方式,一次只能针对一根net在图形化界面下进行。所谓手动布线,除了完全手动一个节点一个节点的选择外,也支持工具自动选择资源来布线。通常我们并不建议全手动的方式,Vivado是时序驱动的工具,所以其自动选择的布线结果已经是遵循了时序约束下的最佳选择。

 

        在Device View中选择一根没有布线或是预先Unroute过的net(显示为红色高亮),右键调出菜单并选择Enter Assign Routing Mode… 便可进入手动布线模式。

 

eco12.PNG

 

复杂的ECO场景

 

        篇幅过半,一直在铺垫,其实最有实践意义的ECO还没提到。相信大部分用户最怀念FPGA Editor中的一个功能就是probe了,如何快速地把一根内部信号连接到FPGA管脚上,无需重新布局布线,直接更新bit文件后下载调试。曾经数次被客户问及,很多人还为Vivado中不支持这样的做法而深表遗憾。

 

        其实这样类似的功能在Vivado中一直支持,唯一的问题是暂时还没有图形化界面可以一键操作(相关开发工作已经在进行中)。但受益于Tcl的灵活多变,我们可以更有针对性地实现probe功能,效率也更高。

 

Tcl操作命令

 

        UG835中把Vivado支持的Tcl命令按照Category分类,这些列于Netlist目录下的命令就是实现ECO需要用到的那些。

 

eco18.PNG

 

        通常涉及到增减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

 

eco19.PNG

 

        这是一个在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中。

 

eco10.PNG

 

        这个add_probe是在上述addProbe例子的基础上扩展而来,不仅可以新增probe,而且可以改变现有probe连接的信号。此外,这个脚本采用了argument写法,点击程序可以看help,所以不一定要按照顺序输入信号、电平标准等选项,输错也没有问题。另外增加了预检和纠错功能,碰到问题会报错退出而不会改变Vivado数据库,效率更高。

 

        此外,Tcl Store上还有很多其它好用的脚本,欢迎大家试用并反馈给我们宝贵意见。虽然里面关于ECO的脚本还很少,但我们一直在补充。此外Tcl Store是一个基于GitHub的完全开源的环境,当然也欢迎大家上传自己手中有用的Tcl脚本,对其进行补充。

        

        总体来说,ECO是一个比较大的命题,因为牵扯到的改动需求太多,其实也很难限制在一个GUI界面中实现。这篇文章的目的就是为了让大家对在FPGA上实现ECO有个基本的认识,梳理看似复杂无序的流程,所谓观一叶而知秋,窥一斑而见全豹,希望能带给更多用户信心,用好Vivado其实一点都不难。

 

 

medium.jpg 

Ally Zhou  2015-2-9 于 Xilinx San Jose

3 回复数
Highlighted
Visitor
Visitor
12,686 次查看
注册日期: ‎05-12-2015

回复: 【Vivado使用误区与进阶】在Vivado中实现ECO功能

我看了您的这篇关于ECO的文章,并且尝试了一下加debug signal的tcl,有时候成功,有时候失败,我总结了一下,发现了一个问题。

对于SSI器件,如果所加的debug signal的pin所在的SLR和所需连接的net所在的SLR不一致时,往往会在route_design时,报出route conflicting,其log如下。所以我想问一下,是否跨SLR时,由于需要使用SLL布线资源,所以在ECO时如果只是简单的route net就一定会有问题呢?

 

Phase 2 Router Initialization
Phase 2 Router Initialization | Checksum: 10f0939a1

Time (s): cpu = 00:04:28 ; elapsed = 00:03:04 . Memory (MB): peak = 8123.141 ; gain = 478.965 ; free physical = 7975 ; free virtual = 43465
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
 Number of Nodes with overlaps = 30
INFO: [Route 35-24] Router failed to deposit pin-assignments on site SLICE_X404Y449. Reason: SLICE_X404Y449: Conflicting nets for physical connection B5 driven by SLICE_X404Y449.B5.B5: 1: send/Q[0], 2: send/Q[2].
Resolution: For technical support on this issue, please visit http://www.xilinx.com/support
CRITICAL WARNING: [Route 35-275] Interactive router failed to produce legal routing. There are 2 node overlaps.
Resolution: Run report_route_status and review the logfile to identify routing failures.
INFO: [Common 17-83] Releasing license: Implementation
10 Infos, 0 Warnings, 1 Critical Warnings and 0 Errors encountered.
route_design failed
route_design: Time (s): cpu = 00:18:01 ; elapsed = 00:16:26 . Memory (MB): peak = 8788.867 ; gain = 1565.766 ; free physical = 7151 ; free virtual = 42655

0 项奖励
Highlighted
Xilinx Employee
Xilinx Employee
12,666 次查看
注册日期: ‎04-24-2013

回复: 【Vivado使用误区与进阶】在Vivado中实现ECO功能

看起来不见的是跨die的关系,能否根据提示输入report_route_status 看看更详细的布线冲突情况,再来定位问题。

Resolution: Run report_route_status and review the logfile to identify routing failures.

0 项奖励
Highlighted
Visitor
Visitor
12,659 次查看
注册日期: ‎05-12-2015

回复: 【Vivado使用误区与进阶】在Vivado中实现ECO功能

当我看到您的这篇文章之后,就在我们现有的project上试了一下,但有的net可以,有的不可以。所以,我就简化模型,建立了一个很简单的design,选用2000T的FPGA,将两个模块固定在不同的SLR。在route之后,选择了一个net,send/Q[0]这个net,将他probe到AW36这个pin上。你也可以试着复现一下,看看是否也有这个问题,我是用的vivado版本是2014.4。

 

route status如下,code和xdc见附件。

 

INFO: [Common 17-83] Releasing license: Implementation
10 Infos, 0 Warnings, 1 Critical Warnings and 0 Errors encountered.
route_design failed
route_design: Time (s): cpu = 00:18:01 ; elapsed = 00:16:26 . Memory (MB): peak = 8788.867 ; gain = 1565.766 ; free physical = 7151 ; free virtual = 42655
report_route_status
Design Route Status
                                               :      # nets :
   ------------------------------------------- : ----------- :
   # of logical nets.......................... :          63 :
       # of nets not needing routing.......... :          37 :
           # of internally routed nets........ :          37 :
       # of routable nets..................... :          26 :
           # of fully routed nets............. :          22 :
       # of nets with routing errors.......... :           4 :
           # of nets with some unrouted pins.. :           4 :
           # of nets with resource conflicts.. :           4 :
           # of nets with antennas/islands.... :           4 :
   ------------------------------------------- : ----------- :


Nets with Routing Errors:
  send/Q[0]
    Unrouted Pins:
      send/cnt[0]_i_1/I0
      send/cnt[1]_i_1/I0
      send/cnt[2]_i_1/I1
      send/outp[4]_i_1/I2
    Conflicting Routing Nodes and Site Pins:
      2x    CLBLM_R_X221Y449/CLBLM_M_B4
      2x    CLBLM_R_X221Y449/CLBLM_M_B5
      3x    CLBLM_R_X221Y449/CLBLM_M_C2
      INT_R_X221Y449/IMUX29
    Antenna Nodes:
      CLBLM_R_X221Y449/CLBLM_M_A3
      CLBLM_R_X221Y449/CLBLM_M_B5
  send/Q[1]
    Unrouted Pins -- only the first 10 are listed, use -show_all to get the full list:
      send/cnt[1]_i_1/I1
      send/cnt[2]_i_1/I0
      send/cnt[3]_i_1/I1
      send/outp[0]_i_1/I2
      send/outp[4]_i_1/I1
      yima/outp[10]_i_1/I3
      yima/outp[11]_i_1/I2
      yima/outp[14]_i_1/I3
      yima/outp[15]_i_1/I0
      yima/outp[3]_i_1/I2
    Conflicts with Site Pins:
      2x    CLBLM_R_X221Y449/CLBLM_M_C4
      2x    CLBLM_R_X221Y579/CLBLM_M_A4
      2x    CLBLM_R_X221Y591/CLBLM_M_B4
      2x    CLBLM_R_X221Y591/CLBLM_M_D3
    Antenna Nodes:
      CLBLM_R_X221Y449/CLBLM_M_A1
      CLBLM_R_X221Y449/CLBLM_M_B1
      CLBLM_R_X221Y449/CLBLM_M_C4
      CLBLM_R_X221Y579/CLBLM_M_A4
      CLBLM_R_X221Y591/CLBLM_M_A1
      CLBLM_R_X221Y591/CLBLM_M_B1
      CLBLM_R_X221Y591/CLBLM_M_D5
  send/Q[2]
    Unrouted Pins -- only the first 10 are listed, use -show_all to get the full list:
      send/cnt[2]_i_1/I2
      send/cnt[3]_i_1/I2
      send/outp[0]_i_1/I0
      send/outp[4]_i_1/I3
      yima/outp[10]_i_1/I0
      yima/outp[11]_i_1/I0
      yima/outp[12]_i_1/I2
      yima/outp[13]_i_1/I1
      yima/outp[1]_i_1/I0
      yima/outp[2]_i_1/I0
    Conflicts with Site Pins:
      CLBLM_R_X221Y449/CLBLM_M_B2
      2x    CLBLM_R_X221Y449/CLBLM_M_B5
      2x    CLBLM_R_X221Y449/CLBLM_M_C4
      2x    CLBLM_R_X221Y575/CLBLM_M_A4
      2x    CLBLM_R_X221Y586/CLBLM_M_A3
      2x    CLBLM_R_X221Y591/CLBLM_M_A2
      2x    CLBLM_R_X221Y591/CLBLM_M_A4
      2x    CLBLM_R_X221Y591/CLBLM_M_B2
      2x    CLBLM_R_X221Y591/CLBLM_M_B4
      2x    CLBLM_R_X221Y591/CLBLM_M_C2
    Antenna Nodes:
      CLBLM_R_X221Y449/CLBLM_M_B2
      CLBLM_R_X221Y449/CLBLM_M_C1
      CLBLM_R_X221Y575/CLBLM_M_A3
      CLBLM_R_X221Y586/CLBLM_M_A3
      CLBLM_R_X221Y591/CLBLM_M_A4
      CLBLM_R_X221Y591/CLBLM_M_B4
      CLBLM_R_X221Y591/CLBLM_M_C2
  send/Q[3]
    Unrouted Pins -- only the first 10 are listed, use -show_all to get the full list:
      send/cnt[3]_i_1/I3
      send/outp[0]_i_1/I1
      send/outp[4]_i_1/I0
      yima/outp[10]_i_1/I2
      yima/outp[11]_i_1/I1
      yima/outp[12]_i_1/I3
      yima/outp[13]_i_1/I2
      yima/outp[14]_i_1/I2
      yima/outp[15]_i_1/I3
      yima/outp[1]_i_1/I1
    Conflicting Routing Nodes and Site Pins -- only the first 10 are listed, use -show_all to get the full list:
      CLBLM_R_X221Y449/CLBLM_M_B2
      2x    CLBLM_R_X221Y449/CLBLM_M_B4
      3x    CLBLM_R_X221Y449/CLBLM_M_C2
      2x    CLBLM_R_X221Y575/CLBLM_M_A4
      2x    CLBLM_R_X221Y579/CLBLM_M_A4
      2x    CLBLM_R_X221Y586/CLBLM_M_A3
      2x    CLBLM_R_X221Y591/CLBLM_M_A2
      2x    CLBLM_R_X221Y591/CLBLM_M_A4
      2x    CLBLM_R_X221Y591/CLBLM_M_B2
      2x    CLBLM_R_X221Y591/CLBLM_M_C2
    Antenna Nodes:
      CLBLM_R_X221Y449/CLBLM_M_B4
      CLBLM_R_X221Y449/CLBLM_M_C2
      CLBLM_R_X221Y575/CLBLM_M_A4
      CLBLM_R_X221Y579/CLBLM_M_A1
      CLBLM_R_X221Y586/CLBLM_M_A4
      CLBLM_R_X221Y591/CLBLM_M_A2
      CLBLM_R_X221Y591/CLBLM_M_B2
      CLBLM_R_X221Y591/CLBLM_M_C3
      CLBLM_R_X221Y591/CLBLM_M_D3

 

0 项奖励