XDC
## Timing Assertions Section
# Primary clocks
# Virtual clocks
# Generated clocks
# Clock Groups
# Bus Skew constraints
# Input and output delay constraints
## Timing Exceptions Section
# False Paths
# Max Delay / Min Delay
# Multicycle Paths
# Case Analysis
# Disable Timing
## Physical Constraints Section
# located anywhere in the file, preferably before or after the timing constraints or stored in a separate constraint file
1. 基本时钟
1) 一个输入端口
2) 一个吉比特收发器输出引脚
2. 虚拟时钟
指的是没有物理连接设计中任何网表元器件的时钟
1) 外部设备IO参考时钟设计中的一个时钟
2) FPGA IO路径和一个内部生成时钟相关,但是不能正确地对该生成时钟进行定时。
3) 设计者只想为IO延迟约束相关的时钟致命不同的抖动和延迟,但是不修改内部时钟特性
3. 生成时钟
1) 通过命令create_generated_clock定义用户所需要的时钟
2) 将其连接到一个网表对象,最好是时钟树根引脚
Create_clock –name clkin –period 10 [get_ports clkin]
Create_generated_clock –name clkdiv2 –source [get_pins REGA/C] –divide_by 2
[get_pins REGA/Q] 或
Create_generated_clock –name clkdiv2 –source [get_ports clkin] –divide_by 2
[get_pins REGA/Q]
4. 时钟组
Set_clock_groups 命令禁止在所标识的时钟组之间,以及在一个时钟组内的时钟进行时序分析。
5. IO延迟约束
输入延迟
1) 最小和最大输入延迟命令选项
最小延迟分析(保持/去除)
最大延迟分析(建立/恢复)
Create_clock –name sysclk –period 10 [get_ports clk0]
Set_input_delay –clock sysclk –max 4 [get_clock DIN]
Set_input_delay –clock sysclk –min 1 [get_clock DIN]
2) 时钟下降输入延迟命令选项
-clock_fall
3) 添加输入延迟命令选项 –add_delay
1) 存在一个最大(最小)输入延迟约束
2) 设计者想在相同端口上添加第二个最大(最小)输入延迟
输出延迟
Create_clock –name clk_ddr –period 6 [get_ports DDR_CLK_IN]
Set_output_delay –clock clk_ddr –max 2.1 [get_ports DDR_DOUT]
Set_output_delay –clock clk_ddr –min 0.9 [get_ports DDR_DOUT]
Set_output_delay –clock clk_ddr –max 1.9 [get_ports DDR_DOUT]
-clock_fall –add_delay
Set_output_delay –clock clk_ddr –min 1.1 [get_ports DDR_DOUT]
-clock_fall –add_delay
6. 时序例外
多周期路径
命令 |
功能 |
---|---|
Set_multicycle_path |
指明将数据从路径开始传播到路径结束时,所需要的时钟周期数 |
Set_false_path |
指明在设计中不进行分析的路径 |
Set_max_delaySet_min_delay |
设置最小和最大路径延迟值,这将使用用户指定的最大和最小延迟值覆盖默认的建立保持约束 |
Set_case_analysis |
使用逻辑常熟或者在端口/引脚的逻辑跳变执行时序分析,以限制通过设计的信号传播 |
源时钟(-start),发送沿移动 |
目的时钟(-end),接受沿移动 |
|
---|---|---|
建立 |
向后 |
向前(默认) |
保持 |
向前(默认) |
向后 |
定义带有建立因子N的多周期路径
情景 |
多周期约束 |
---|---|
相同时钟域或同步时钟域 |
Set_multicycle_path N –setup –from CLK1 –to CLK2Set_multicycle_path N-1 –hold –from CLK1 –to CLK2 |
从慢到快时钟的同步时钟域 |
Set_multicycle_path N –setup –from CLK1 to CLK2Set_multicycle_path N-1 –hold –end –from CLK1 to CLK2 |
从快到慢时钟的同步时钟域 |
Set_multicycle_path N –setup –start –from CLK1 to CLK2Set_multicycle_path N-1 –hold –from CLK1 to CLK2 |
伪路径
1) 没有起作用
2) 不需要确定时序
A. 跨时钟域,其中添加了2倍频合成器逻辑
B. 在上电时,可能被写一次的寄存器
C. 复位或者测试逻辑
D. 当可应用的时候,忽略一个分布式RAM写和异步读时钟之间的路径
去除从reset端口到所有寄存器的时序路径
Set_false_path –from [get_ports reset] to [all_registers]
禁止两个异步时钟域之间的时序路径
Set_false_path –from [get_clocks CLKA] to [get_clocks CLKB]
禁止两个时钟域任何方向的所有路径
Set_false_path –from [get_clocks CLKA] to [get_clocks CLKB]
Set_false_path –from [get_clocks CLKB] to [get_clocks CLKA]
从RAM前的写寄存器到RAM后接收读时钟的寄存器之间定义假路径
Set_false_path –from [get_cells <wirte_registers>] –to
[get_cells <read_registers>]
从RAM写引脚开始定义假路径
Set_false_path –from [get_cells –hier –filter
REF_NAME=~RAM*&&IS_SEQUENTIAL&&NAME=~
PATTERN_FOR_DISTRIBUTED_RAMS>}]
最大/最小延迟
1) 使用最大延迟约束覆盖一个路径上的默认建立要求
2) 使用最小延迟约束覆盖默认保持要求
Case分析
在一些设计中,某些信号在特定模式下是一个常数。
set_case_analysis <value><pins or ports objects>
value 的值可以是0、1、rise、rising、fall、falling
例子:
Create_clock –name clk_1 –period 10 [get_pins clock_sel/I0]
Create_clock –name clk_2 –period 5 [get_pins clock_sel/I1]
Set_case_analysis 1 [get_pins clock_sel/S] //选择信号S为固定值
- 剑指offer——年龄排序问题
- Mysql Group Replication介绍
- 剑指offer——快速排序
- 架构高性能网站秘笈(四)——反向代理缓存
- 架构高性能网站秘笈(一)——了解衡量网站性能的指标
- MYSQL5.6&5.7编译安装
- 架构高性能网站秘笈(三)——浏览器缓存
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 跟着柴毛毛学Spring(4)——面向切面编程![这里写图片描述](http://img.blog.csdn.net/20171031111402095)
- MYSQL数据闪回方式
- 剑指 offer代码解析——面试题39判断平衡二叉树
- 跟着柴毛毛学Spring(3)——简化Bean的配置
- 剑指 offer代码解析——面试题39二叉树的深度
- 跟着柴毛毛学Spring(2)——Bean的配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP的命令行扩展Readline相关函数学习
- Goland中使用Golang命令行工具
- MHA搭建之ssh互信打通脚本
- pt-slave-restart工具
- 二叉树:层序遍历登场!
- 二叉树:前中后序迭代方式的写法就不能统一一下么?
- 二叉树:听说递归能做的,栈也能做!
- 二叉树:一入递归深似海,从此offer是路人
- 关于二叉树,你该了解这些!
- 双指针法:总结篇!
- 栈与队列:总结篇!
- Appium移动端自动化测试--元素操作与触摸动作【移动端自动化测试教程奉上】
- 接口测试Mock利器--moco runner是如何工作的?
- Java中类型判断的几种方式
- 如何实现类似@Component的Spring动态注入功能