Vivado时序违约小结

1. setup time违约

建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大,当然也可以尝试通过降频来解决建立时间违约。
Vivado时序违约小结

1.1 逻辑级数太高

Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能容纳的logic level是不同的。假设7系列的-2速度等级250MHz的设计,电路设计的大部分levels最好不要超过8,否则会造成时序收敛困难
Vivado时序违约小结
解决方案:
Logic level太大的处理方法就是重定时(Retiming)了,典型的重定时方法就是流水线,将过于冗长的组合逻辑增加寄存器进行打拍。

1.2 Fanout太大

Vivado时序违约小结
如果工程要运行在125MHz以下,那么扇出数小于5000就可以了,如果工程要运行在250MHz一下,那么扇出数要控制在200以下,如果工程要运行在250MHz以上,那么扇出数要控制在100以下。
解决方案:

  1. 如果是寄存器的输出扇出很大,可以使用max_fanout属性标记寄存器声明
  2. 手动复制寄存器
  3. 如果不是关键时序路径,而且高扇出网络直接连接到触发器,对扇出超过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中。
解决方案:

  1. 使用tcl语言指定,如:
    set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]
  2. 也可以直接在代码中指定:
    (* ASYNC_REG = “TRUE” ) ( keep = “true” *)reg sync0_reg, sysnc1_reg;
  3. 添加缓冲器,增加路径时延

参考链接:https://www.myoschain.com/blog/131788788702642176