当前位置: 首页 > news >正文

时序约束进阶二:set_max_time_borrow详解

目录

一、前言

二、set_max_time_borrow

2.1 工程设计

2.2 无set_max_time_borrow

2.3 set_max_time_borrow约束值偏小

2.4 set_max_time_borrow约束值偏大

2.5 hold路径

2.6 setup不违例

三、总结

四、参考资料


一、前言

    ​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


http://www.mrgr.cn/news/17029.html

相关文章:

  • 【网络安全】XSS之HttpOnly防护(附实战案例)
  • 华为云征文|下一代云服务器,Flexus X实例选购指导
  • (3) 插入排序
  • 个人笔记总结
  • minio最新源码编译(处理安全扫描中跨域访问、.js.map等不安全问题) 版本:RELEASE.2024-06-26T01-06-18Z
  • SOMEIP_ETS_076: Wrong_Method_ID
  • 随笔1:数学建模与数值计算
  • 报错记录3:imx6ull适配ov2640摄像头无法获取默认摄像头分辨率与格式参数
  • 深入探讨Java JSON解析与HTML标签清除:详解与实例
  • p2p、分布式,区块链笔记: Merkle-DAG和Merkle-Tree的区别与联系
  • 编译原理简介
  • 滑动窗口系列(不定长滑动窗口长度) 9/1
  • 据传:英特尔正考虑剥离制造代工部门
  • 实战项目:俄罗斯方块(一)
  • ubuntu架设FRPC 服务器端方法
  • 基于自适应狮群算法优化GRU神经网络进水量预测,gsclst-gru进水量预测,基于黄金正弦改进的狮群算法优化GRU进水量预测
  • 华为OD机试真题 - 字符成环找偶数O - 滑动窗口(Java/Python/JS/C/C++ 2024 E卷 100分)
  • 创建表与删除表
  • 百度飞浆目标检测PPYOLOE模型在PC端、Jetson上的部署(python)
  • Python知识点:如何使用Jenkins与Python进行CI/CD集成