找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3136|回复: 0
打印 上一主题 下一主题
收起左侧

时序约束中 跨时钟域的时钟约束

[复制链接]
跳转到指定楼层
楼主
ID:104287 发表于 2016-1-31 03:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直做了好久的时序约束,包括源同步输入数据、源同步输出数据以及SDRAM端口的约束,做完这些之后 TimeQuest Timing Analyzer 还是有红色的 slack 也就是值是负的 不满足时序约束:如图:
仔细看其中的错误信息都是dcfifo中错误,当初还以为altera的ipcore需要特殊的约束呢或者是ipcore有问题,但是这种想法是不对的,fifo这种ipcore是很常用的不应该出问题。一天看到what is false path?于是就百度开始查,看到这样一篇博客关于FALSE PATH的理解:
[size=15.714285850524902px] 对FALSE PATH的理解
[size=15.714285850524902px]
[size=15.714285850524902px]
最近做了一点FPGA方面的工作,在用QuartusII对代码进行综合时四处查找资料,总算是对FALSE PATH有了一点点的理解,总得来说,FALSE PATH就是我们在进行综合分析时,不希望综合工具进行分析的那些路径。写出来和大家一起讨论。
在QuartusII的一个培训文档里面解释了什么时候要用到FALSE PATH:
1.           从逻辑上考虑,与电路正常工作不相关的那些路径,比如测试逻辑,静态或准静态逻辑。
2.          从时序上考虑,我们在综合时不需要分析的那些路径,比如跨越异步时钟域的路径。
下面举例说明:
先看图1,MUX_1和MUX_2是两个多路选择器,MUX_1的使能端C接到时钟clk,MUX_2的使能端C接到clk的反。于是可以发现MUX_1的S1端口是不可能经过MUX_2的S1端口到达MUX_2的D端口的,同理MUX_1的S2端口是不可能经过MUX_2的S2端口到达MUX_2的D端口。于是我们就不希望综合工具对这两条路径进行分析,就是说这两条路径就是我们所说的FALSE PATH:
set_false_paths –through Mux_1/S1 –through Mux_2/S1
set_false_paths –through Mux_2/S2 –through Mux_2/S2
[size=15.714285850524902px]
[size=15.714285850524902px]
[size=15.714285850524902px]

[size=15.714285850524902px]图1
[size=15.714285850524902px]
再看图2,模块test_logic表示一个测试逻辑,它并不真正实现我们电路的功能,只是为了测试电路功能。所以我们就不希望综合工具对这这些路径进行分析,就是说这些路径就是我们所说的FALSE PATH:
[size=15.714285850524902px]  
[size=15.714285850524902px]
[size=15.714285850524902px]  
[size=15.714285850524902px]图2
[size=15.714285850524902px]
[size=15.714285850524902px]
set_false_path –fall_from clk1–to [get_pins test_logic|*|datain]
set_false_path –from [get_pins test_logic|*|clk] \
-to [get_pins test_logic|*|datain]
set_false_path –from [get_pins test_logic|*|clk] -to [get_ports test_out]
然后看图3,reg1的输出和reg2的输入跨越了不同的时钟域clk1和clk2,我们不希望综合工具对这这些路径进行分析,就是说这些路径就是我们所说的FALSE PATH:
set_false_path –from [get_pins reg1|clk]–to [get_pins reg2|datain]
[size=15.714285850524902px]
[size=15.714285850524902px]
[size=15.714285850524902px]
[size=15.714285850524902px]  
[size=15.714285850524902px]图3
[size=15.714285850524902px]
[size=15.714285850524902px]最后我们看图4,clk_100和clk_66仍然是两个不同的时钟域,这也是FALSE PATH:
set_false_paths –from [get_clocks clk_100] –to [get_clocks clk_66]
set_false_paths –from [get_clocks clk_66] –to [get_clocks clk_100]
实际上,这两条FALSE PATH可以用一条命令来代替:
set_clock_groups –exclusive –group {clk_100} \
–group {clk_66} –group {clk_200}
这就涉及到set_clock_groups 命令了,我们以后再说。
[size=15.714285850524902px]
[size=15.714285850524902px]
[size=15.714285850524902px]
[size=15.714285850524902px]图4对这两句有感而发
set_false_paths –from [get_clocks clk_100] –to [get_clocks clk_66]
set_false_paths –from [get_clocks clk_66] –to [get_clocks clk_100]
设计中fifo前端时钟域是cmos_pclk在TimeQuest Timing Analyzer ->Core Cock Setup:pll_c0为(Launch Clock),后端时钟域是pll_c0在TimeQuest Timing Analyzer ->Core Cock Setup:pll_c0为(Latch Clock)

这两个是跨时钟域时钟,于是根据文中总结:对于跨时钟域的处理用set_false_path,约束语句如下:
set_false_path  -from  [get_clocks {cmos_pclk}]  -to  [get_clocks {pll_c0}]
set_false_path  -from  [get_clocks {pll_c0}]  -to  [get_clocks {cmos_pclk}]
ok完美解决 没有红色错误, slack都为正值。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表