承接上一篇文件《 基于xilinx FPGA验证ASIC可能遇到的timing问题》中提到的问题,本文列数一下在vivado中可能用到的约束方法和面对timing问题的解决办法。
(1)详尽的时钟约束
create_clock:和其他FPGA EDA tool一样,在vivado中timing约束越全越好,越细越好,而place约束可以很粗略或者省略调。约束中最常用的语句就是create_clock了,用语法create_clock -name NAME -period PRERIOD get_ports{***}来定义FPGA的外部输入时钟源头,这是FPGA所有MMCM或PLL的时钟源,一般对其只有周期和引脚的约束,需要注意的是引脚最好采用FPGA的时钟专用引脚,对xilinx 7系列FPGA来说就是有MRCC和SRCC属性的引脚,这类引脚可以直接驱动BUFG,保证时钟信号质量,如果设计中不得已采用了一般的GPIO作为时钟输入引脚,在约束中最好加上CLOCK_DEDICADED_ROUTE的property约束,否则在place中可能因为BUFG资源的互相挤压报出error。
create_generated_clock:创建衍生时钟的约束同样非常常用,在FPGA中的design很少只工作在同一时钟下,所以create_generated_clock经常用于对MMCM或者PLL,甚至Flip-Flop分频产生的时钟增加约束,语法create_generated_clock -name NAME -divide_by DIVIDE -multiply_by MULTI -source SOURCE_CLOCK get_pins{***},如果有相位差还要增加相位的参数, create_generated_clock很灵活,可以用rise和fall边沿来定义时钟,这样可以定义占空比特殊的时钟。
set_input_delay:对FPGA的input类型GPIO增加set_input_delay约束,语法set_input_delay -max MAX -clock get_clocks{***} get_ports{***}和set_input_delay -min MIN -clock get_clocks{***} get_ports{***},通常min和max都要加的,这两个delay参数来自于PCB走线。
set_output_delay:同样的,对FPGA output类型的GPIO增加set_output_delay约束,语法也类似set_output_delay -max MAX -clock get_clocks{***} get_ports{***}和set_output_delay -min MIN -clock get_clocks{***} get_ports{***}。
(2)精细的时钟关系
不同时钟之间的关系要做到越全越好,用set_clock_groups语句来定义不同时间的关系,如果用了-async参数,那么不同组之间就是异步关系,相当于加了最强的set_false_path一样,在同一个-group{******}里加的时钟都是有关系的,工具就会检查跨时钟域,如同上一篇文章所说,第一轮的时序约束可以采用最紧的方式,让工具检查出所有的跨时钟域path,简单分析一下各个关键路径,确定有问题的就可以采用set_multicycle_path -from -to -setup N -hold M来约束,这里set_multicycle_path要根据时钟关系来写,源自同一时钟源的,并且是整倍数关系的比较简单,只写-setup就可以了,源自异步时钟或者是小数倍数关系的,要根据从快时钟进入慢时钟,还是从慢时钟进入快时钟的关系,增加-end或-start的参数,组合方式是-setup -start和-hold -end这两种,其影响是检查setup的边沿和检查hold的边沿是否同时进行multicycle的变化。
有一种情况对一个pin定义了两次create_generated_clock,这个pin很可能是个clk_mux的输出,它会工作在两种以上的时钟频率,所以对这两次定义的create_generated_clock要做一个set_clock_groups -logically_exclusive 的约束,说明这两个时钟不会同时存在。