文章目录

  • 前言
  • HDL中的常用约束示例
  • 保持约束
    • keep
    • keep_hierarchy

前言

这一节的内容很有意思也很有用,对于我们主动地操作我们的Verilog代码很有帮助。众所周知,通过设置工具的综合策略,实现策略等也可以实现对综合以及实现的操作,但这是对于整体地、宏观地操作,如果我们需要对其中的某些模块,某些功能进行操作,使其按照我们的想法来综合、实现等等,就需要我们用到本节的内容,在代码中添加约束信息。我曾在Vivado系列的博客也写过这方面的内容,确实这部分内容是几乎每一个系列都要写的,可见其重要性。
最重要:本系列以及本文节选自《FPGA之道》,让我们一起站在巨人的肩膀上来学习下代码中的相关的约束信息。

HDL中的常用约束示例

HDL中可以加入的约束信息有很多种,本章节就以Xilinx公司的FPGA芯片的集成开发环境为例,介绍一些常用的嵌入到HDL中的约束示例。而其它厂商的FPGA芯片的代码内约束添加方法均是雷同的。
需要说明的是,嵌入在HDL代码当中的这些约束信息也可以集中写在一个约束文件中,这样更加方便管理,只不过此时语法略有不同,且需要明确指定每条约束所约束对象的绝对路径。

保持约束

keep

keep是一个高级的映射和综合约束。
当编译器在对FPGA设计进行映射时,一些线网将会被吸纳进逻辑块中,而这一操作将使得这些线网无法在项目的物理设计数据库中显示出来。例如,如果某个线网连接的几个元件都被映射到了同一个逻辑块中,那么该线网通常也会被被该逻辑块吸收。这样一来,由于在设计的物理设计数据库找不到该线网,因此后续的一些针对于该线网的约束信息也就无法约束成功。
不过keep的出现改变了这种状况,当为某一线网信号添加了keep类型的约束后,编译器会将其理解为“不允许合并”的意思,因此该线网将不会被吸收进逻辑块,进而也就能在物理设计数据库中被找到。
下面列举出在HDL中嵌入keep约束的语法:
– VHDL syntax
– 第一步,先要声明keep约束;
attribute keep : string;
– 第二步,为keep语法指定约束线网名称和属性取值;
attribute keep of <signal_name>: signal is “{TRUE|FALSE}”;
– 注意,VHDL的约束信息通常都需要放在architecture的声明和定义部分

// Verilog syntax
(* KEEP = “{TRUE|FALSE}” *)
// 上述约束会作用于紧随其后定义的线网
在为FPGA内部产生的时钟信号添加时序约束时,keep约束经常会被用到。因为这些内部时钟线网大多由逻辑生成,因此容易出现被逻辑块吸收的情况。这样一来,由于在物理设计数据库中找不到与该时钟信号名称相关的物理线网(其实该时钟网络可能有了一个完全不同的、新的名称),进而也就难以成功添加针对该时钟信号的相关时序约束(详细的时序约束介绍将会在【时序分析篇->常用时序约束】章节中进行介绍),最终很可能导致设计失败。而使用keep约束则可以避免这种情况的出现,例如:
– VHDL example
signal clk50MHz : std_logic; – 内部生成的时钟信号

attribute keep : string; -- keep约束声明attribute keep of clk50MHz: signal is "TRUE"; -- keep约束加至clk50MHz线网上

// Verilog example
(* KEEP = “TRUE” *) // keep约束
wire clk50MHz; // 内部生成的时钟信号
通过在HDL代码中嵌入上述约束信息后,就可以非常方便的在后续的用户约束文件(ucf文件)中成功添加如下约束信息:

NET "clk50MHz" TNM_NET = UserGClk1;
TIMESPEC TS_UserGClk1 = PERIOD "UserGClk1" 20 ns;

以上便是keep约束的一个应用示例。除此以外,根据keep属性的说明,我们可以发现它还可以被用来进行一些故意的逻辑冗余设计,详见【时序分析篇->根据时序报告修改设计->常见问题及修改->使用综合约束】小节。

keep_hierarchy

keep_hierarchy是一个综合和实现方面的约束。
当Xilinx的综合工具XST更倾向于平化HDL代码的层级结构,即将一级级的模块调用机制转换为一个没有子模块的超大模块,这样做的好处是能够进行更好的设计优化工作,因为平化操作去除了原有实体或模块之间的边界限制。
不过有些时候,XST的这种平化工作是我们所不希望的,这时keep_hierarchy语法便派上了用场。使用keep_hierarchy约束能够使综合工具保留指定部分的层级关系,这样一来,在后续的实现阶段也将保留这种层级关系。与此同时,也可以生成用于仿真的具有层级关系的网表。下图就很形象的说明了使用keep_hierarchy约束和不使用keep_hierarchy约束在综合及实现后的区别:

下面列举出在HDL中嵌入keep_hierarchy约束的语法:
– VHDL syntax
– 第一步,先要声明keep_hierarchy约束;
attribute keep_hierarchy : string;
– 第二步,为keep_hierarchy语法指定约束线网名称和属性取值;
attribute keep_hierarchy of <architecture_name>: architecture is “{TRUE|FALSE|SOFT}”;

// Verilog syntax
(*KEEP_HIERARCHY = “{TRUE|FALSE|SOFT}” *)
// 上述约束会作用于紧随其后调用的模块
从上述语法可以看出,keep_hierarchy约束具有三种属性值,其中false自然是不保留层级关系,而true和soft的区别就是,true会将这种约束传递给后续的实现环节,而soft则仅仅是在综合环节保留层级关系。
下面给出一个利用keep_hierarchy实现三模冗余的示例(注,三模冗余是航空、航天系统中经常用到的一种技术,简要来说,就是由于空间中的射线等原因,会一定几率引起电子产品尤其是基于SRAM的FPGA发生一种称作“单粒子翻转”的效应。“单粒子翻转”即1变成0、0变成1,这样将会导致系统运行出错。因此为了提高系统的稳定性和可靠性,人们想了很多种方法来应对空间中较为恶劣的工作环境,其中一种就是三模冗余,即通过3倍的冗余,结合3中取2的少数服从多数仲裁机制,来提高FPGA设计的抗干扰能力)。

-- VHDL example-- file lock.vhdlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity lock isport (clk : in    std_logic;rst : in std_logic;din : in std_logic;dout : out std_logic);end lock;architecture Behavioral of lock isbeginprocess(clk)beginif(clk'event and clk = '1')thenif(rst = '1')thendout <= '0';elsedout <= din;end if;end if;end process;end Behavioral;// file mode3.vhdlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity mode3 isport (clk : in   std_logic;rst : in std_logic;din : in std_logic;dout : out std_logic);end mode3;architecture Behavioral of mode3 issignal a, b, c : std_logic;COMPONENT lockPORT(clk : in std_logic;rst : in std_logic;din : in std_logic;dout : out std_logic);END COMPONENT;attribute keep_hierarchy : string; attribute keep_hierarchy of m0: architecture is “TRUE”; attribute keep_hierarchy of m1: architecture is “TRUE”; attribute keep_hierarchy of m2: architecture is “TRUE”;beginm0: lock PORT MAP(clk => clk,rst => rst, din => din,dout => a); m1: lock PORT MAP(clk => clk,rst => rst, din => din,dout => b); m2: lock PORT MAP(clk => clk,rst => rst, din => din,dout => c);process(clk)beginif(clk'event and clk = '1')thenif(rst = '1')thendout <= '0';elseif(b /= c)thendout <= a;elsedout <= b;end if;end if;end if;end process;end Behavioral;
// Verilog example
// file lock.vmodule lock(input clk,input rst,  input din,  output reg dout);    always@(posedge clk)beginif(rst)begindout <= 1'b0;endelsebegindout <= din;endend endmodule
// file mode3.vmodule mode3 (input clk,input rst,   input din,  output reg dout);    wire a, b, c;  (* KEEP_HIERARCHY = "TRUE" *) lock m0 (.clk(clk), .rst(rst), .din(din), .dout(a));   (* KEEP_HIERARCHY = "TRUE" *)  lock m1 (.clk(clk), .rst(rst), .din(din), .dout(b));       (* KEEP_HIERARCHY = "TRUE" *)  lock m2 (.clk(clk), .rst(rst), .din(din), .dout(c)); always@(posedge clk)beginif(rst)begin      dout <= 1'b0;endelsebeginif(b != c)begindout <= a;endelse begindout <= b;endendend    endmodule

采用上例这种keep_hierarchy的约束添加方式,就可以成功确保在FPGA中实现了三个功能一模一样的模块。否则,由于这三个模块在功能上面完全等价,编译器便会优化掉其中的两个,而最终只保留一个模块,但是这样就无法实现“三模冗余”的保护功能了。

FPGA之道(64)代码中的约束信息(一)保持约束相关推荐

  1. java代码中获取配置文件信息数据

    获取properties文件信息 -- 从properties文件中获取信息 1 创建文件对象 private static Properties config = new Properties(); ...

  2. FPGA之道(50)复位的设计

    文章目录 前言 复位的设计 为什么FPGA设计中要有复位 复位方式的分类 同步复位 异步复位 复位的设计方法 同步信号同步复位 同步信号异步复位 异步信号同步复位 异步信号异步复位 复位高扇出的解决方 ...

  3. FPGA之道(18)FPGA设计的编译过程

    文章目录 前言 FPGA设计的实现过程 编译概述 编译流程之综合 综合的输入 HDL代码 综合设置 综合的输出 综合的工具 编译流程之翻译融合 翻译融合的输入 翻译融合的输出 翻译融合工具 编译流程之 ...

  4. FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )

    文章目录 前言 仿真语法 Graphic Waveform 数字波形简介 从实际到仿真 实际系统检测 软件仿真模拟 "Hello world"之Graphic Waveform 待 ...

  5. FPGA之道(67)代码中的约束信息(四)状态机的相关约束

    文章目录 前言 状态机的相关约束 fsm_extract fsm_style fsm_encoding enum_encoding safe_implementation safe_recovery_ ...

  6. FPGA之道(66)代码中的约束信息(三)存储器以及寄存器的相关约束

    文章目录 前言 存储器的相关约束 ram_extract ram_style rom_extract rom_style 寄存器的相关约束 前言 这是这个话题的第三篇,最重要的前言是本文节选自:< ...

  7. FPGA之道(65)代码中的约束信息(二)乘法器的相关约束

    文章目录 前言 乘法器的相关约束 use_dsp48 mult_style 前言 这是这个话题的第二篇,最重要的前言是本文节选自:<FPGA之道>. 乘法器的相关约束 通常,FPGA开发者 ...

  8. FPGA之道(80)静态时序分析(六)常用时序约束介绍(基于ISE的UCF文件语法)

    文章目录 前言 常用时序约束介绍 时序环境约束 分组时序约束 TNM TNM_NET TIMEGRP 常用时序约束 周期约束 输入时钟周期约束 内部时钟周期约束 关联时钟周期约束 差分时钟周期约束 输 ...

  9. FPGA之道(44)HDL中的隐患写法

    文章目录 前言 有隐患的混写逻辑 VHDL中应该禁止的写法 在时序process中使用variable 在组合process中使用variable 鲁莽的process糅合 Verilog中应该禁止的 ...

最新文章

  1. MPB:亚热带生态所谭支良组-基于微生物成分数据的差异zOTU分析流程
  2. php设置低于设定值不能用,php memory limit怎么设置不限制
  3. AssetManager asset使用
  4. 字节、快手、阿里、腾讯这两年的广告推荐技术进展 | AICon
  5. Java程序员的发展前景
  6. speaking class onOct 13
  7. 分布式缓存-Memcached
  8. 如何在Kubernetes上运行PostgreSQL
  9. Python编程及应用师资研修班--昆明
  10. python判断图片相似度_Python比较两个图片相似度的方法
  11. 利用alpha matte提取图片前景
  12. Redis配置优化和使用
  13. no tests were found异常springBoot配置
  14. php 字符串编码方式转换,php字符串编码转换的常用几种方法_PHP教程
  15. struts全局视图与局部视图
  16. gateway跨域问题解决方法
  17. 网站点击弹窗微信二维码功能纯CSS
  18. uniapp 安卓app 实现app加固(360加固)
  19. 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时
  20. 你会正确卸载数据库吗?

热门文章

  1. clion配置_Ubuntu16.04系统下用CLion编译器调试ROS代码详细教程
  2. 华为p4支持鸿蒙功能吗_吹过的牛都一步一步给实现了!明年华为手机支持升级鸿蒙系统!...
  3. 中心极限定理_统计学基础知识3——正态分布与大数定律、中心极限定理
  4. 面试官问我:spring、springboot、springcloud的区别,我笑了
  5. ionic 定位 android,ionic3定位 (android)
  6. mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)
  7. hybriddb mysql移植_HybridDB for MySQL 实现在线与离线数据分离的实践
  8. mysql init file_关于MySQL的init-file选项的用法实例
  9. mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性
  10. IN-12辉光数码管:俄罗斯进口的器件