Vivado时序违约小结
1. setup time违约
建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。
1.1 逻辑级数太高
Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能容纳的logic level是不同的。假设7系列的-2速度等级250MHz的设计,电路设计的大部分levels最好不要超过8,否则会造成时序收敛困难
解决方案:
Logic level太大的处理方法就是重定时(Retiming)了,典型的重定时方法就是流水线,将过于冗长的组合逻辑增加寄存器进行打拍。
1.2 Fanout太大
如果工程要运行在125MHz以下,那么扇出数小于5000就可以了,如果工程要运行在250MHz一下,那么扇出数要控制在200以下,如果工程要运行在250MHz以上,那么扇出数要控制在100以下。
解决方案:
- 如果是寄存器的输出扇出很大,可以使用max_fanout属性标记寄存器声明
- 手动复制寄存器
- 如果不是关键时序路径,而且高扇出网络直接连接到触发器,对扇出超过25K的net插入BUFG set_property CLOCK_BUFFER_TYPE BUFG [get_nets netName]
2. hold time 违约
2.1 异步信号处理导致hold time违约
对于一个信号的跨时钟域问题,一般使用双寄存器法(对于慢采快的结绳法这里不讨论)。为了降低MTBF(Mean Time Between Failures,平均无障碍时间),这两个寄存器最好位于同一个slice中。
解决方案:
- 使用tcl语言指定,如:
set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]] - 也可以直接在代码中指定:
(* ASYNC_REG = “TRUE” ) ( keep = “true” *)reg sync0_reg, sysnc1_reg; - 添加缓冲器,增加路径时延