时序约束相关想法

TD工具时序约束(标准sdc约束)

抛出问题

如果约束频率比较低,比如20M,软件会过于乐观,从而在布局布线的时候约束不到位,从而最后只能实现19M。这种情况下不能通过约束到30M(实际软件实现29M)来完成目的,因为时序始终是不过的,可能因为某些原因导致跑飞。

从fifo的clkw写到 clkr读出的do,led=&do,我也不明白为啥clkw到led就时序不过了(八竿子打不着啊)
在这里插入图片描述

改了约束之后(从get_nets改为get_clocks)
在这里插入图片描述
slack更少了,负的更多
在这里插入图片描述

逻辑logic level 比较高,需要改逻辑。

把led=&do,插入寄存器后就好了。一是do是32bit进位链长(可以理解为加法器进位链长),因此常用的做法是分为28+4bit,分别寄存之后再计算。

但还是疑惑为啥clkw会到do上。
求教之后,因为clkw会影响到写地址,格雷码,跨时钟域后与读地址生成empty信号,这个信号会控制读地址的增加,而读地址会影响do。所以,还是太狠了。

跨时钟域约束

set_max_delay是约束setup的,需要对关键信号(跨时钟的信号名)作最紧的约束。相当于是clkw和clkr两者的上升沿之间只能有x ns的delay.
set_fasle_path,对clkw和clkr,必须加-hold,因为我们不关心hold(一般hold都不过,所以不分析);但是如果不加-hold就会对跨两个时钟域的所有信号都不检查(上述的set_max_delay也会失效)
此外,如果约束的是子模块里的fifo最好约束到里面模块去,不然可能影响其他信号的检查。如果信号名被工具更名了关系不大,只要约束到源头,其余会自动推断的。

关于时钟约束

pll生成的时钟应该使用create_generate_clock,当然create_clock也可以。标准是用前者。

为什么要约束,是告诉EDA工具这个信号是个时钟,需要做更多的事情(时钟的扇出是很大的)。

因此除了PLL,我们自己使用寄存器分频生成的时钟信号,clk_1M之类的,也需要约束,否则在某些比较紧的情况下就会出问题。一般大学生做的项目时钟,逻辑资源都是够用的,因此没有什么问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值