专栏首页网络交换FPGAVivado设计锁定与增量编译(附工程)

Vivado设计锁定与增量编译(附工程)

在上一篇文章中曾提到为了某些端口信号(上升沿和下降沿同时采样)的时序约束,可以采用Quartus工具把接口模块锁定在FPGA上的分配管脚的相应位置,这样在此基础上可以增加其它模块代码重新综合后,被锁定的接口模块是不会被改变的。这种方式在Vivado中也有,本文针对Vivado中实现的逻辑锁定和增量编译进行的工程实例介绍,文中有对应工程的下载地址。友情提示:(1)增量编译只允许修改当前工程不超过5%的时候才有效,一般应用于较大工程添加修改chipscope监测信号使用;(2)逻辑模块锁定不是解决时序问题的最终办法,仅用来确认某些FPGA管脚的时序问题,实际中常常采用原语例化BUFG之类的处理模块来解决,而内部模块的时序问题还是需要必须认真的修正的!

Quartus的逻辑锁定

该部分引用本公众号上一篇时序约束文章中的内容,在Quartus中采用逻辑锁定的办法来解决FPGA和外部接口的时序问题,也就是输入输出的寄存Rxd/Txd的寄存器到外部器件寄存器的时序问题。

GMII接收数据路径分析

Tpcb是外部PCB板上数据的延时,Tdata_i是数据的输入延时,Gmii_rx_interface相当于Rxd进入FPGA后的第一个寄存器模块(可以专门写一个接口模块,将Rxd数据打一拍,用于接收数据)。如果Gmii_rx_interface距离接口Rxd较远,Tdata_i的路径较长,布局布线时Rxd的八根线时延相差可能就比较大,所以我们应让这个模块放在距离Rxd接口较近的地方。

Quartus软件中有一个LogicLock(物理分区)功能,把Gmii_rx_interface模块建立成一个LogicLock分区但并不对分区位置和大小进行固定,然后重新编译工程。布局布线后就可以在chipplaner工具中看到这个分区的位置,如下图所示(放大可以看清),Gmii_rx_interface模块距离Rxd接口位置很远,布局布线时,输入信号要绕很长一段距离才会到达输入的寄存器,资源占用很多时,Rxd的8根数据线长度不一,很容易造成时序问题。

未固定分区位置时布局布线结果

把Gmii_rx_interface模块分区移动到Rxd接口附近进行固定然后重新编译工程,布局布线后该逻辑分区就会在Rxd接口附近,从而保证输入数据接口进入FPGA的第一个寄存器的时延在一定范围内,保证时序要求。

采用LogicLock后,GMII寄存器接口位置

Vivado设计锁定与增量编译

1、研究目标

希望把之前验证过的模块固定在fpga上某个位置,然后再在这个基础上添加其它代码再进行增量编译,不会影响之前已经固定好的模块。

2、设计锁定与增量编译方法

为了实现对模块的布局(place)、布线(route)的锁定,仅适用增量编译是不够的,因为增量编译的本质目的是为了实现编译时间的缩短,还需要引入设计锁定,设计锁定的TCL命令是:

lock_design–level routing

下面举例说明具体的操作方法。

(1)建立工程:建立一个工程,走完综合实现的流程,如图1所示,该工程将作为样例工程(工程名:incre_compile_demo),将该工程备份一份(工程名:initial_project,后面对比要用到这个工程);

图1 建好的工程

(2)找到dcp文件:增量编译需要有一个参考文件,这个参考文件是“参考设计”实现之后生成的,后缀是“.dcp”,该文件的路径一般在“..\project_1\project_1.runs\impl_1”路径下,如图2所示,新建一个文件夹(名字是dcp_file),将该文件复制到其中,如图3所示;

图2 dcp文件

图3 新建文件夹,复制dcp文件

(3)锁定设计:前面说道,简单的增量编译是不能保证模块固定在某个位置的,为了实现这一点,需要对设计进行锁定,方法是,打开一个新的Vivado界面,然后打开dcp_file文件夹下的dcp文件(注意选择“open checkpoint”),如图4所示;打开后,在TCL Console中输入命令:“lock_design –level routing”,点击左上角保存,如图5所示,做完这一步后,设计就锁定好了,dcp文件就可以用了;

图4 vivado打开dcp界面

图5 锁定设计并保存

(4)增量编译:

1)修改代码,将顶层模块(test_compare.v)line263-line266注释取消,保存,如图6所示;

图6 改代码

2)在主界面菜单栏处,点:Flow> Create Runs;

3)选both,点next,如图7所示;

图7 选both

4)勾选make active,点next,如图8所示;

图8 make active

5)选Do notlaunch now,点next,如图9所示;

图9 Do not launch now

6)完成后如图10所示;

图10 新的run已建好

7)在impl_2右键,选择“Set Incremental Compile”,选择步骤(3)中准备好的dcp文件,示意图如图11所示(注意这只是一个示意图,图中选的文件不是步骤(3)准备好的那个文件)

8)开始综合、实现,完成增量编译过程。

图11 选择参考dcp文件

3、正确性验证

怎么证明增量编译后,原始设计成功锁定了呢?我们来做一个对照实验。

样本1:原始工程,名称是: initial_project;

样本2:增量编译工程,名称是: incre_compile_demo;

样本3:原始工程复制一份出来,不进行增量编译,直接修改代码(见图6),重新综合实现,名称是:modify_project。

打开三个工程,之后open implemented design,选取几个模块,观察其在FPGA上的位置,发现样本1和样本2位置完全一样,而样本3和前两个样本不一样,说明设计锁定是成功的,如图12、13、14所示。

图12 样本1位置观察

图13 样本2位置观察

图14 样本3位置观察

上述实例工程百度网盘下载链接:

链接:https://pan.baidu.com/s/1EuRnBF3aPR3YFrBMCl2e-Q

提取码:v1tr

Vivado下如何锁定设计的模块的布局布线

Xilinx官方论坛上也有相关问题的回答。

https://forums.xilinx.com/t5/Vivado/Vivado%E4%B8%8B%E5%A6%82%E4%BD%95%E9%94%81%E5%AE%9A%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%9D%97%E7%9A%84%E5%B8%83%E5%B1%80%E5%B8%83%E7%BA%BF/td-p/885693。

Vivado下如何锁定设计模块的布局布线

问题:

我现在设计了一个延时模块,应用后需要把该模块的布局和布线全部锁定,然后在别的项目中直接调用。现在布局没有问题。可以通过约束文件来锁定,就是布线不能大范围锁定,否则应用时会失败。我已经尝试过增量编译(调用DCP文件)的功能,发现在增量编译中布局布线并不是全部不变的,个别走线也是会变的。请问有办法把布线也固定下来吗?(Tool: Vivado17.3 Device: K7)

回答1:如果你用的是Ultrascale/Ultrascale+ , 我觉得PR是个不错的选择,你的目标模块可以放在静态部分,只占据很小的一块面积,剩下大块的动态部分.但是7系列有很多primitive不能放在动态,静态的部分包含的逻辑过多,剩下供你修改的逻辑偏少,不太适合目前的应用场景.

回答2:关于锁定某一个net的布线路径,请参考以下步骤:

  1. 打开跑完布局布线的工程,Open Implemented Design
  2. 找到你要锁定布线的net,选中,右键菜单点击Fixed Routing,如下图所示:

3. Tcl Console里面会打印出一些命令,然后在Tcl Console里面敲命令:write_xdc <path>/dirt.xdc

4. 打开导出的xdc,在最下面的部分会有所有元件的位置锁定以及FIXED_ROUTE,示例如下:

5. 另外还需注意的是,负载中有LUT的话需要将LUT的输入pin也锁住。以下图的LUT2为例,在其property窗口中找到Cell pins,信号是连到LUT2的I0端,映射到BEL pin是A3。

因此上述导出的位置锁定约束中还有一个LOCK_PINS的设置:

set_property LOCK_PINS {I0:A3} [get_cells clk_gen_i0/rst_meta_i_1]

6. 将这部分有关锁定的约束拷贝到你工程的约束文件中,重新跑implementation,这条线会按照原先的结果布。

温馨提示:

我们并不建议完全锁死某个模块的所有布线,当合入的工程比较复杂,用到的布线资源较密集时,工具没有灵活性去调整和优化,有很大的概率会布线失败。

划分静态区和动态区

除了上述的逻辑锁定方法之外,Xilinx 的FPGA还提供了静态区和动态区的划分也可以实现逻辑的锁定。只不过静态区占据了大多数的空间,动态区是可以随意修改的小部分空间。

FPGA提供了现场编程和重新编程的灵活性,无需通过改进的设计进行重新制造。部分重配置(PR)进一步提高了这种灵活性,允许通过加载部分配置文件(通常是部分BIT文件)来修改操作FPGA设计。在完整的BIT文件配置FPGA之后,可以下载部分BIT文件以修改FPGA中的可重配置区域,而不会影响在未重新配置的设备部分上运行的应用程序的完整性。

部分可重构的基本前提

如图所示,通过下载几个部分BIT文件A1.bit,A2.bit,A3.bit或A4.bit中的一个来修改在重新配置块A中实现的功能。 FPGA设计中的逻辑分为两种不同的类型,可重构逻辑和静态逻辑。 FPGA块的灰色区域表示静态逻辑,标记为Reconfig Block“A”的块部分表示可重配置逻辑。静态逻辑仍然有效,并且不受加载部分BIT文件的影响。可重配置逻辑由部分BIT文件的内容替换。

为什么在单个FPGA器件上动态地对多个硬件进行时间复用的能力是有利的。这些包括:

•减小实现给定功能所需的FPGA器件尺寸,从而降低成本和功耗

•为应用可用的算法或协议选择提供灵活性

•实现设计安全性的新技术

•提高FPGA容错能力

•加速可配置计算

除了减小尺寸,重量,功耗和成本之外,部分重配置还可以实现没有它的新型FPGA设计。

更详细介绍请参考官方文档:

UG909: Design Considerations and Guidelines for 7 Series and Zynq Devices

有关部分可重构部分的内容请继续关注我们的公众号后续内容,通过ICAP实现对单个LUT的在线实时修改,敬请期待。

实现不同模块的物理隔离

我们还可以通过Xilinx分区技术,来实现不同模块布局布线在同一块FPGA芯片的不同位置,中间可以用隔离栅栏来隔离开。

使用CLB平铺的水平和垂直隔离栅栏的PlanAhead工具视图

通过Xilinx分区技术,可以在单个FPGA中开发出包含多个隔离功能的安全可靠的单芯片解决方案。在使用FPGA设计技术和编码样式时,只需对开发流程进行适度修改即可实现安全或安全关键的解决方案。 IDF开发要求设计人员在设计过程中更早地考虑布局规划,以确保在逻辑,路由和I / O缓冲器(IOB)中实现适当的隔离。除了早期布局规划之外,开发流程是基于分区的(即,用户希望隔离的每个功能必须处于其自己的层次结构级别)。从这里开始,设计师可以采用两种方法中的一种。如果设计者希望确保不会发生不必要的冗余优化,则必须独立于其他分区来合成和实现每个隔离的功能。实现每个分区后,设计将合并为扁平FPGA设计,以进行器件配置。如果设计者希望使用其他技术来防止这种优化,他们可以合成完整的设计,同时小心维护至少一个层次结构,使得IDF约束可以应用于需要隔离的每个分区。虽然这种流程要求FPGA设计人员脱离传统的FPGA开发流程,但分区方法确实具有一定的优势。如果隔离分区在设计周期的后期需要更改,则仅修改该特定功能,而其余分区保持不变。

上图示例设计包括两个冗余高级加密标准(AES)加密模块,其输出发送到比较器(COMPARE)块,以及用于缓冲和隔离数据和键输入的I / O(INOUT)模块。冗余AES加密模块,比较功能和I / O(INOUT)模块都在一个FPGA中实现隔离。该设计可以通过位于其中一个AES引擎上的按钮注入错误。由比较块驱动的LED指示AES模块的输出何时不匹配。

另外,在Zynq-7000系列FPGA内部带有ARM硬核的FPGA内部也是实现了PS部分(ARM硬核)和PL部分(FPGA部分)的隔离。如下图:

更多详情请参考文档:

Developing Secure and Reliable Single Device Designs with Xilinx 7 Series FPGAs or Zynq-7000 AP SoCs Using the Isolation Design Flow。

后面两个部分的文档也可通过百度网盘下载:

链接:https://pan.baidu.com/s/14sVpfXYSWIgPP2mFfuCqKw

提取码:f08u

本文分享自微信公众号 - 网络交换FPGA(gh_cb8502189068)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • c语言内嵌汇编代码之Clobbers的用途到底是什么

    在阅读本文之前,请先阅读gcc的相关文档,确保对如何在c中使用汇编语言有个基本的认识。

    wangyuntao
  • WIFI网络(ESP8266)升级STM32 预热: 单片机定时 使用 http 获取云端文本文件里面的内容,然后显示在液晶屏

    https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%BC%80%E5%8F%91%E6%9D%BF/ESA...

    杨奉武
  • c语言内嵌汇编代码之constraint modifier中 = 和 + 的区别

    在阅读本文之前,请先阅读gcc的相关文档,确保对如何在c中使用汇编语言有个基本的认识。

    wangyuntao
  • Linux搭建FastDFS单机版

    FastDFS特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

    胖虎
  • 18.Llinux-触摸屏驱动(详解)【转】 19.Linux-USB总线驱动分析

    其中事件处理层的函数都是通过input_register_handler()函数注册到input_handler_list链表中

    用户3033338
  • 如何PWN掉西门子工控设备

    在对船舶控制系统进行测试时,我们注意到控制系统对西门子Scalance工业以太网交换机的严重依赖,因此为对其进行了深入研究。经过逆向发现可使用静态密钥对管理密码...

    FB客服
  • 升级STM32 预热: 单片机每隔一定时间 使用 http 获取天气

      1.1  STM32  AT指令控制Wi-Fi以TCP方式连接服务器(天气Web服务器),然后根据提供的API发送获取天气指令.

    杨奉武
  • 关于串口接收处理数据

        无论做的什么串口通信,数据总是一条一条的发送,发送完一条再发送另一条,发送每一条数据之间存在时间间隔,串口接收数据的时候控制一个

    杨奉武
  • Hello World

    呃,看起来好像不大简单的亚子。如果对计算机系统工作机制没有一定了解,理解起来确实会有困难。我们逐一来看。

    运维部落
  • 为什么程序员都不喜欢使用switch,而是大量的 if……else if ?

    OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了。

    ConardLi

扫码关注云+社区

领取腾讯云代金券