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之类的,也需要约束,否则在某些比较紧的情况下就会出问题。一般大学生做的项目时钟,逻辑资源都是够用的,因此没有什么问题。