黑金动力的资料还是非常有价值的。通过建模篇,对于给定的时序关系,我总能实现。但是,这总是很初级的能力。也只是为后面的建模服务。所以,现阶段我的能力还是非常有限。我相信我一定会成为牛人,能够独挡一面。借用同学的一句话:仰望星空,脚踏实地。现在来学习FPGA的时序约束。
时序约束,是要对时序有要求为前提才有时序约束。以前的建模都是想像时序是否满足,也有实际约束过但是这里的时序约束是为了熟悉TQ,而做的约束。也就是没有具体的时序要求。直到最近遇到了,模块的最高运行频率。比如在64位加法器,4级流水线实现提高运算速度。其中的最高运行频率,我一直不知道它是怎么得到的。直到昨天,一个偶然的机会,估计是使用TQ分析得出是一种好的方法(应该还有其他的时序分析工具)。即现在是有时序要求的,比如需要64位的全加器最高运行频率到100MHz。那怎么分析建模是否满足最高频率呢?这就能通过TQ得到。这也是我要使用TQ约束的原因。
第一张图:理想时序的建立关系
理想的保持关系图:
硬件物理建立余量:
建立关系值(Setup Relationship)是评估(计算)建立余量(setup lack)的一个过程。
上图可以建立余量:数据锁存时间(DataRequireTime) -数据到达时间(DataArriveTime) = (10 + 2 -1.4) - (Tclk1+Tco+Tdata)=10.6 -4 = 6.6ns。
建立余量正值和reg1 与 reg2 之间的建立关系合不合格到底有什么关系? 只要建立余量大于 0,那么两个寄存器之间的建立关系就没有问题。
锁存沿时间基本上就是“理想的建立关系值”,理想的建立关系值见前面。理想建立关系值和锁存沿时间在评估数据锁存时间是等价的关系。
硬件物理保持余量:
“保持时间”在寄存器的概念中是表示:寄存器在读取某个数据以后,需用一段最小时间来“确保数据锁存”的稳定。
然而“保持余量”的定义是指:在两个节点(寄存器)之间,在分析保持关系的过程中“到底有多少剩时间可以提供给寄存器用来确保已存数据的稳定”。
数据保持时间 Data Hold Time = 启动沿 + Tclk1 + Tco + Tdata + 数据周期时间。(寄存器1数据输出保持不变的时间)
数据锁存(读取| 获取)时间 Data Required Time = 锁存沿 + Tclk2 + Th。
保持余量 = 数据保持时间 - 数据锁存(获取| 读取)时间。
保持余量=(数据保持时间)(10+3.2+0.8) - (数据锁存(获取| 读取)时间)(10+2+1.4)=0.6
在这里我要多说一句:在触发沿建模时,我总是担心一个脉冲的高电平能否在条件判断中检测到。原来是我对时序分析不够理解。现在我的答案是要进行时序分析。如果满足建立和保持关系即可以在条件判断中检测到。
无论是理想的建立关系值或者理想的保持关系值”它们的作用出了供参考以外,还有简化 TimeQuest模型。
因为“保持余量”的求出过程实在太猥琐了,在此为了简化求出保持余量的过程,保持余量和建立余量共享同一个公式,那么这个“理想保持关系值”是必须的。
数据抵达时间 Data Arrival Time = 启动沿 + Tclk1 + Tco + Tdata (注意:此时不是数据保持时间 Data Hold Time,所以也没有加入数据周期时间)
数据锁存(获取| 读取)时间 Data Required Time = 锁存沿 + Tclk2 + Th= 理想保持关系值 + Tclk2 + Th
(注意:这个评估锁存沿受延迟因素影响的公式和求得建立余量时数据锁存时间的公式非常类似)
数据抵达时间 Data Arrival Time = 启动沿 + Tclk1 + Tco + Tdata = 0 + 3.2 + 0.2 + 0.6= 4ns
数据锁存(获取| 读取)时间 Data Required Time = 锁存沿 + Tclk2 + Th= 理想保持关系值 + Tclk2 + Th= 0ns + 2ns + 1.4ns= 3.4ns
保持余量 = 数据抵达时间 - 数据锁存(获取| 读取)时间= 4ns - 3.4ns= 0.6ns
我的理解:很明显这是正确的。因为reg2的latch edge 是reg1的lunch edge,即它们的时间点是重合的(当然这是在理想的时序)。在物理硬件的时序,虽然有时延但是它们的理想保持关系是不变的。或者说:不管clk1和clk2如何延时变化,但是它们的周期都是10ns。如下图
图 1.6.9 是用屁股求得保持余量的方法,换句话说就是“用下一个启动沿的红色部分减掉当前锁存沿绿色的部分”,其中就要用到“理想保持关系值”。
求得建立余量的公式是 :
保持余量 = 数据锁存时间 - 数据抵达时间 Setup Slack = Data Required Time - Data Arrival Time
数据抵达时间 Data Arrival Time = 启动沿 + Tclk1 + Tco + Tdata
数据获取时间 Data Required Time = 锁存沿 + Tclk2 - Tsu= 理想建立关系值 + Tclk2 - Tsu
求得保持余量的公式是:(用屁股的话)
保持余量 = 数据抵达时间 - 数据获取时间 Hold Slack = Data Arrival Time - Data Required Time
数据抵达时间 Data Arrival Time = 启动沿 + Tclk1 + Tco + Tdata
数据获取时间 Data Required Time = 锁存沿 + Tclk2 + Th= 理想保持关系值 + Tclk2 + Th
此外,笔者也大概的讲解 TimeQuest 模型中用到的公式和物理时序中出现的东东。如果按照一般方法去学习 TimeQuest 的话,很容易撞墙而已,又或者会被训练成为纯公式的使用者。TimeQuest 模型是一个很有趣的东西,如果用纯公式的方法去使用的话,就无法体验到 TimeQuest 的有趣之处以外,也不能享受学习的乐趣。
下面是我的约束:
这是我的一个时钟模块。只是约束了系统时钟。以上的时序图是min_o_r[0]到min_o_r[0]的保持余量。根据波形图可以看到(1)在保持余量时latch edge 和lunch edge是满足理想的保持关系(hold relationship)。
(2)数据保持时间= clock delay + data delay = 2.679 + 1.069 = 3.748(和右边的Data Arrival Time 一致)
(3)数据锁存时间= clock delay + uTh= 2.679 + 0.266 = 2.955。
(4)数据保存余量=Data Arrival Time - Data Required Time = 3.748 - 2.955 = 0.803。
这是传说中的使用屁股算保持余量。
建立余量:
这是sec_o_r[3]到led_r1[4]建立时间分析图。根据此图可以得出:
(1)数据锁存沿latch edge在数据启动沿lunch edge的一个时钟周期,即理想的保持关系。
(2)数据到达时间= lunch edge + Clock Delay + Data Delay = 2.681 + 7.186 = 9.867
(3)数据锁存时间= latch edge(setup relationship) + Clock Delay - uTsu = 20 + 2.670 - (-0.036) =22.706(这里uTsu是负号表示的)
(4)数据建立余量= Data Require time - Data Arrival Time = 22.706 - 9.867 = 12.839
至此,第一章结束了。!!!!