目录
一、前言
Set_maximum_time_borrow约束是设置锁存器用于优化时序可以从下一个阶段中借用的最大时间。下面对setup_maximum_time_borrow的使用场景进行介绍。
存储电路设计有两种类型:触发器(Flip Flop)和锁存器(Latch)。
a)使用触发器的设计
数据从时钟的上升沿启动,必须在下一个时钟上升沿到达前的set up时间内到达目的触发器,如果两个触发器的组合逻辑时延太大,那么数据将没法被捕获触发器所捕获,捕获的数据将不稳定,如果数据到达的时间太早,造成时间资源浪费
b)使用锁存器的设计
当锁存器是传输状态时将透传数据,如果锁存器前的组合逻辑时延较大时,将借用下一个周期的时间,所以当需要设计有较高的性能时,会使用锁存器
时间借用的场景:从设计中的锁存器借用,借用的时间用于设计中的触发器。
时钟波形如下,周期为10ns,占空比为50%。
当数据从触发器FF1出发,理想情况下(setup、hold和时钟延迟,时钟偏斜都为0)在下一个时钟周期10ns后到达触发器FF2,如果数据到达FF2的时间大于10ns,则无法被FF2捕获,同样的在20ns后到达FF3被捕获。
将路径图中的FF2换成锁存器Latch,如下图
如果数据从FF1出发到达Latch的输入端口D早于10ns,此时锁存器由于CLK为低电平不工作,不会影响数据的获取,和使用FF的场景相同。
如果数据从FF1出发到达Latch的输入端口D大于10ns,如12ns时到达,如果Latch为FF2时数据将无法被捕获,此时为锁存器,只有数据在10ns-15ns时到达,数据依旧传输到了FF3,这时通过借用下一个周期的时间,12ns到达时相比使用寄存器FF2,锁存器提供了2ns的优势。
在这个例子中锁存器所能借用的最大时间为5ns(一个周期中高电平的有效时间),但从锁存器到寄存器FF3的时间减少了,原先是10ns,借用后必须8ns内到达,以便FF3在20ns时能获取到数据,因为从FF1到FF3总的20ns时间关系是不变的。
因此,在使用寄存器的设计中,组合逻辑的延时不能超过一个时钟周期,除非一些特殊设置,如多周期约束路径和false路径。在使用锁存器的设计中,大的组合逻辑延时可以通过下一级更短的组合逻辑延时来补偿。
二、set_max_time_borrow
下面将结合设计来对set_max_time_borrow进行详细说明
2.1 工程设计
module time_borrow( in,clk,GE,clr,ff2);
input in,clk,GE,clr;
output reg ff2;
reg ff1;
always @(posedge clk)
ff1<=in;
LDCE #(
.INIT(1'b0), // Initial value of latch, 1'b0, 1'b1
// Programmable Inversion Attributes: Specifies the use of the built-in programmable inversion
.IS_CLR_INVERTED(1'b0), // Optional inversion for CLR
.IS_G_INVERTED(1'b0) // Optional inversion for G
)
LDCE_inst (
.Q(o_latch), // 1-bit output: Data
.CLR(clr), // 1-bit input: Asynchronous clear
.D(ff1), // 1-bit input: Data
.G(clk), // 1-bit input: Gate
.GE(GE) // 1-bit input: Gate enable
);
always@(posedge clk)
ff2<=o_latch;
endmodule
约束文件
create_clock -period 10.000 -name clk -waveform {0.000 1.000} [get_ports clk]
网表连接图,两个触发器中间连接了一个锁存器,ff1_reg->LDCE_inst->ff2_reg,设计存在两条时序路径,ff1_reg->LDCE_inst和LDCE_inst->ff2_reg
2.2 无set_max_time_borrow
在未设置set_max_time_borrow约束时,时序分析结果中路径path1:ff1_regC->LDCE_inst软件已经自动进行了Timing Borrowing了0.531ns
借用的时间用于destination clock的时钟延时中,从而使得setup没有出现为负的情况
再看后一级的路径path2:LDCE_inst->ff2_reg,data path中因为已经借出了0.531给path1用于改善路径path1的setup违例问题,因为在数据路径上延时增加0.531ns(time given to startpoint)
2.3 set_max_time_borrow约束值偏小
上一小节的分析中,time borrow软件自动借用到满足path1的setup的slack不满足,如果要从锁存器中借用指定的时间,则需要使用set_max_time_borrow,以借用0.01ns为例
set_max_time_borrow 0.01 [get_clocks "*"]
此时path1的setup将出现slack不满足,符合预期
2.4 set_max_time_borrow约束值偏大
根据之前小节提到要path1的setup正常,则至少需要从锁存器借用0.531ns,但如果借用过多时,以1ns为例,由分析结果可知,并不会实际借用1ns,依旧为0.531ns,可知最大借用值为满足上一级时序路径的setup正常的值
2.5 hold路径
设置set_max_time_borrow将只针对setup分析,hold分析不受影响
2.6 setup不违例
在设计中,当path1的setup本身不违例时,无论设不设置set_max_time_borrow约束,都不会进行时间借用,下面例子通过set_max_delay -from [get_cells ff1_reg] 1.0,使得路径path1的setup不违例,再进行set_max_time_borrow,最终summary中无time borrow
调整set_max_delay -from [get_cells ff1_reg] -1.0 使得path1的setup不违例,同时设置set_max_time_borrow为1ns,分析结果中time borrow最大借用1ns生效,但依旧不满足,setup让违例
调整set_max_time_borrow为1.6ns,此时已满足setup不违例,为0ns
三、总结
1)设计锁存器时间借用的场景,软件会自动分析借用时间来满足上一级路径的setup时序
2)只有latch与上一级触发器的setup违例时,set_max_time_borrow约束才有效
3)time borrow对hold分析结果无影响
4)set_max_time_borrow用于约束锁存器时间借用场景中的最大借用时间值
四、参考资料
用户手册:ug903-vivado-using-constraints-en-us-2023.2.pdf