草庐IT

VIVADO时序约束之时序例外(set_false_path)

aaaaaaaa585 2023-09-08 原文

前言

当FPGA设计中的逻辑行为不能满足默认的时序要求时,设计者需要使用时序例外语法对该逻辑行为进行处理,例如:有些结果只需每个一个或多个时钟周期捕获一次。
vivado开发工具支持4个时序例外约束的语法,如下表所示:

命令功能
set_multicycle_path表示从路径的开始到结束传播数据所需的时钟周期数。
set_false_path表示不应分析设计中的逻辑路径。
set_max_delay设置最大路径延迟值。 这将使用用户指定的最大和最小延迟值覆盖默认的建立和保持约束。
set_min_delay设置最小路径延迟值。 这将使用用户指定的最大和最小延迟值覆盖默认的建立和保持约束。

基于运行时间的考虑,vivado工具不支持冲突时序例外的实时分析,可以使用命令report_exceptions对整个工程进行时序例外进行分析和报告。

false路径

false路径指设计中存在的,但是1、不起作用,2、不需要关心时序的路径。因此,false路径常常不做时序分析。常见的false路径包括:
1、跨时钟域信号经两级同步逻辑处理的;
2、上电后,只需要被写一次;
3、复位或者测试逻辑;
4、异步分布式RAM的写入时钟和异步读取时钟之间的路径;

移除false路径的约束的好处

1、减少编译时间:当false路径已从时序分析中移除时,该工具不需要计时或优化那些非功能性路径。 使时序和优化引擎满足的非功能性路径的时序要求,会浪费大量的运行时间;
2、可以提高编译结果的质量:一些时序问题,会极大的影响工具对工程的综合、布局和优化质量;例如,某些非功能性路径存在时序违规,该工具可能会尝试修复这些路径,而不是处理真正的功能性路径。 不仅可能会不必要地增加设计的大小(例如逻辑克隆),而且该工具可能会跳过修复实际问题,因为非功能性路径具有更大的违规,掩盖了其他实际违规。

set_false_path

set_false_path 	[-setup] [-hold] [-rise] [-fall] [-reset_path] 
				[-from <args>] [-rise_from <args>] [-fall_from <args>]
				[-to <args>] [-rise_to <args>] [-fall_to <args>]
				[-through <args>] [-rise_through <args>] [-fall_through <args>]
				[-quiet] [-verbose] 
选项含义
-setup排除路径上的setup分析;
-hold排除路径上的hold分析;
-rise/fall排除路径上的上升沿/下降沿延迟;
-reset_path复位之前该路径上的约束;
-from <args>起始点或时钟列表;
-rise_from <args>作用于路径上上升沿开始的起始点或时钟列表;
–fall_from <args>作用于路径上下降沿开始的起始点或时钟列表;
-to <args>终端点或时钟列表;
-rise_to <args>作用于路径上上升沿接收的终端点或时钟列表;
-fall_to <args>作用于路径上下降沿接收的终端点或时钟列表;
-through <args>pins、cell、nets列表,所有经过该列表的路径均受约束作用;
-rise_through <args>pins、cell、nets列表,所有经过该列表的上升沿路径均受约束作用;
-fall_through <args>pins、cell、nets列表,所有经过该列表的下降沿路径均受约束作用;
-quiet忽略命令错误

使用不带 -from 和 -to 的 -through 选项时要小心,因为它会从时序分析中删除通过此引脚或端口列表的任何路径。 当时序约束是为 IP 或子块设计的,但随后用于不同的环境或更大的项目时,要特别小心。 当单独使用 -through 时,可以删除比预期更多的路径。

实例说明:

1、删除从端口reset到所有寄存器的所有路径的时序分析:

set_false_path -from [get_port reset] -to [all_registers]

2、禁止工具对两个异步时钟域CLKA和CLKB之间,从CLKA到CLKB的路径的时序分析:

set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]

3、非功能路径的约束可以使用-through替代-from -to的选项完成约束:

set_false_path -through [get_pins MUX1/a0] -through [get_pins MUX2/a1]

注意:
-through选项的顺序很重要,下面例子的命令是完全不相同的

set_false_path -through cell1/pin1 -through cell2/pin2
set_false_path -through cell2/pin2 -through cell1/pin1

4、公共的例子:异步双端口分布式RAM。写操作与RAM时钟域是同步的,但是读操作与RAM时钟域是异步的,这种情况下,写时钟域和读时钟域设置false路径是安全的。两种方式实现以上约束:
a、定义RAM前端的写寄存器到RAM后端的读时钟域下寄存器之间的路径为false路径:

set_false_path -from [get_cells <write_registers>] -to [get_cells <read_registers>]
set_false_path -from [get_cells -hier -filter {NAME =~ *gntv_or_sync_fifo.gl0.wr*reg[*]}] -to [get_cells -hier -filter {NAME=~ *gntv_or_sync_fifo.mem*gpr1.dout_i_reg[*]}]

b、定义以写引脚WE为起始点的所有路径为false路径:

set_false_path -from [get_cells -hier -filter {REF_NAME =~ RAM* && IS_SEQUENTIAL && NAME =~ <PATTERN_FOR_DISTRIBUTED_RAMS>}]
set_false_path -from [get_cells -hier -filter {REF_NAME =~ RAM* && IS_SEQUENTIAL && NAME =~ *char_fifo*}]

特别说明:

对于有些同步时钟下的路径,可以适当放松约束,但这些路径仍然必须满足一定的时序要求,可以使用多路径约束替代set_false_path约束。

有关VIVADO时序约束之时序例外(set_false_path)的更多相关文章

  1. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  4. ruby - 为什么 Integer.respond_to?( :even? ) 返回 false? - 2

    我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案

  5. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  6. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  7. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  8. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  9. ruby - 更改 $LOAD_PATH 时,为什么使用 unshift 而不是 push? - 2

    我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果

  10. ruby - Rails 路由 : Giving default values for path helpers - 2

    有什么方法可以为url/path助手提供默认值吗?我有一个可选范围环绕我的所有路线:#config/routes.rbFoo::Application.routes.drawdoscope"(:current_brand)",:constraints=>{:current_brand=>/(foo)|(bar)/}do#...allotherroutesgohereendend我希望用户能够使用这些URL访问网站:/foo/some-place/bar/some-place/some-place为了方便起见,我在我的ApplicationController中设置了一个@current

随机推荐