关于FPGA的延时以及时序等要求,基本上是skew,width,period,hold&set time。
检查时钟和控制信号在指定事件之间的时间间隔,包括:skew、width、period和nochange。 skew:$skew (reference_event, data_event, limit, notifier); 限制最大偏斜 $skew (posedge clk1, posedge clk2, 1, notifier); 当data_event time - reference_event > limit,则会报告skew time violations。 $skew是基于事件(event-based)的,如果监测到一个reference_event,那么就开始评估脉宽,只要监测到一个data_event,就会生成相应的报告,直到监测到下一个reference_event,才重新开始新的监测。如果在监测到一个data_event之前,又监测到一个reference_event,那么就放弃本次评估,重新开始新的评估。 width:$width (controlled_reference_event, limit, threshold, notifier); 限制最小脉宽 $width (posedge in, 2, notifier); 这里data_event是隐含的,它等于reference_event的相反边缘,当width < limit时,就会报告width time violations。 period:$period (controlled_reference_event, limit, notifier); 限制最小周期 $period (negedge clk, 10, notifier); 这里data_event是隐含的,它等于reference_event的相同边缘,当period < limit时,就会报告period time violations。 nochange:$nochange (reference_event, data_event, start_edge_offset, end_edge_offset, notifier); 当leading reference event time - start_edge_offset < data_event < trailing reference event time + end_edge_offset时,就会报告nochange time violations。例如: $nochange (posedge clk, data, 0 , 0); 当在clk高电平期间,data发生任何变化,就会报告nochange time violations。 有时候,路径上的时序检查是在一定条件成立的前提下进行的,这就需要引入条件操作符:&&&。需要注意的是,当存在两个及以上的条件时,要求这些条件首先在specify块外部经过适当的组合逻辑产生一个新的控制信号,然后再引入到specify块内部使用。 例如: and u1 (clr_and_set, clr, set); specify $setup (negedge data, posedge clk &&& clr_and_set, 3, notifier); endspecify
在xilinx里面,我们看post %route里面有个tinming的报告,我们在这里面可以清楚的看到这些东西 |