FPGA之道(64)代码中的约束信息(一)保持约束
文章目录
- 前言
- 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)代码中的约束信息(一)保持约束相关推荐
- java代码中获取配置文件信息数据
获取properties文件信息 -- 从properties文件中获取信息 1 创建文件对象 private static Properties config = new Properties(); ...
- FPGA之道(50)复位的设计
文章目录 前言 复位的设计 为什么FPGA设计中要有复位 复位方式的分类 同步复位 异步复位 复位的设计方法 同步信号同步复位 同步信号异步复位 异步信号同步复位 异步信号异步复位 复位高扇出的解决方 ...
- FPGA之道(18)FPGA设计的编译过程
文章目录 前言 FPGA设计的实现过程 编译概述 编译流程之综合 综合的输入 HDL代码 综合设置 综合的输出 综合的工具 编译流程之翻译融合 翻译融合的输入 翻译融合的输出 翻译融合工具 编译流程之 ...
- FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )
文章目录 前言 仿真语法 Graphic Waveform 数字波形简介 从实际到仿真 实际系统检测 软件仿真模拟 "Hello world"之Graphic Waveform 待 ...
- FPGA之道(67)代码中的约束信息(四)状态机的相关约束
文章目录 前言 状态机的相关约束 fsm_extract fsm_style fsm_encoding enum_encoding safe_implementation safe_recovery_ ...
- FPGA之道(66)代码中的约束信息(三)存储器以及寄存器的相关约束
文章目录 前言 存储器的相关约束 ram_extract ram_style rom_extract rom_style 寄存器的相关约束 前言 这是这个话题的第三篇,最重要的前言是本文节选自:< ...
- FPGA之道(65)代码中的约束信息(二)乘法器的相关约束
文章目录 前言 乘法器的相关约束 use_dsp48 mult_style 前言 这是这个话题的第二篇,最重要的前言是本文节选自:<FPGA之道>. 乘法器的相关约束 通常,FPGA开发者 ...
- FPGA之道(80)静态时序分析(六)常用时序约束介绍(基于ISE的UCF文件语法)
文章目录 前言 常用时序约束介绍 时序环境约束 分组时序约束 TNM TNM_NET TIMEGRP 常用时序约束 周期约束 输入时钟周期约束 内部时钟周期约束 关联时钟周期约束 差分时钟周期约束 输 ...
- FPGA之道(44)HDL中的隐患写法
文章目录 前言 有隐患的混写逻辑 VHDL中应该禁止的写法 在时序process中使用variable 在组合process中使用variable 鲁莽的process糅合 Verilog中应该禁止的 ...
最新文章
- 9 岁自学编程、24 岁身价涨至数百万美元,与微软一较高低的大佬多厉害?
- 借花献佛!docker讲解视频
- 浅谈MySQL数据库中的锁与事务
- codeigniter在nginx安装配置及URL重写
- quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)
- java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?
- JS DOM操作基础
- Java 泛型 extends T 和 super T 详解
- python和java哪个好学-到底学python好还是学java比较好 哪个容易学习点
- bzoj 1016: [JSOI2008]最小生成树计数
- 用jQuery实现.net 2.0 treeview客户端无刷新操作的实例
- FillForm网页表单填写插件(用于火狐浏览器,自动填表,自动表单,填写表单)
- QuartusII下载程序报错,无法正常下载
- java数据类型简介
- Flash鼠绘入门第四课:绘制漂亮的梅花-梅花Flash鼠绘方法一
- MySQL数据库简答题
- 【你好,windows】win7(2019版)旗舰纯净版(usb3.0_nvme)2020.3.14
- 无聊,几行python代码写一个聊天机器人陪你聊天
- 【蓝桥杯】 历届试题 国王的烦恼(并查集)
- 如何输入一串带空格的字符串?
热门文章
- VMware vSphere: What’s New [V 5.1]
- 局域网组建与维护(1)
- confluence 编辑器这次没有加载_代码编辑器横评:为什么 VS Code 能拔得头筹
- spark hive udf java_【填坑六】 spark-sql无法加载Hive UDF的jar
- python使用openpyxl读取数据_Python-openpyxl读取和写入数据1
- seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_网站关键词排名常见问题 - 搜狗快速排名...
- acu风格是什么意思_“高街风格”是什么意思?
- oracle 辅助实例,初学rman问题小记三:创建辅助实例遇到的ORA-01031
- zookeeper 客户端_zookeeper进阶-客户端源码详解
- wordpress模版post.php,WordPress主题开发手册