基于建立/保持时间等的参数化时序分析

说明

本文源自作者读研期间的一份作业报告,主要基于建立时间、保持时间等时间约束参数推导时序分析公式,并通过实验进行验证。

因时间久远,某些实验数据和理论推导可能存在缺失,且难以回忆。若对读者造成理解困难,还请见谅~

相关实验参见以下两篇文章:

采用流水线技术实现8位加法器

Stratix内嵌存储器测试报告

一  基本概念

建立时间(SetUp Time, tsu):触发器在有效时钟沿来到前,其数据输入端的数据必须保持不变的时间;

保持时间(Hold Time, th):触发器在有效时钟沿来到后,其数据输入端的数据必须保持不变的时间。

输入信号应提前时钟上升沿(如上升沿有效)tsu时间到达芯片,这个tsu就是建立时间。如果建立时间和/或保持时间不够,数据将不能在这个时钟上升沿被打入触发器。如下图所示:

图1  建立时间与保持时间

设时钟上升沿位置为t,则数据最短持续时间段为(t – tsu) ~(t + th)。

补充一点,Quartus里定义tsu、th为:


tsu =  <pin to register delay> + <micro setup delay> - <clock to destination register delay>

th  =  <clock to destination register delay> + <micro hold delay> - <pin to register delay>

可知,对于特定的路径,tsu + th = MicrotSU + MicrotH为常数,这也就是数据最短持续时间。其中,MicrotSU/MicrotH指触发器内部固有建立/保持时间,典型值一般小于1ns。

注意,文中建立时间和保持时间均针对时钟而言,在进行时序约束时所指的就是这种;而有些书籍中建立时间和保持时间的概念针对信号而言,所指对象不同,分析结论可能完全相反,请勿混淆。

二  时序分析

2.1 实验一非流水线加法器

打开adder_nonpipe.tan.rpt或Processing->Compilation Report时序分析报告,简化如表1所示:

表1  8位加法器(非流水线/FPGA)时序分析之简表


          Type


     Actual Time


            From


               To


   From Clock


   To Clock


Worst-case tsu


3.391ns


inb[1]


tempb[1]


--


enable


Worst-case tco


8.291ns


sum[4]~reg0


sum[4]


enable


--


Worst-case th


-2.399ns


ina[2]


tempa[2]


--


enable


Clock Setup: ‘inclk‘


period=2.369ns*


tempb[0]


sum[7]~reg0


enable


enable

注:

  1. ..ns* 对应fmax=422.12MHz,实际时钟周期为10ns,占空比为1:1。
  2. tco: from clock "enable" to destination pin "sum[4]" through register "sum[4]~reg0"
  3. tsu取最大值,得数据最前端(ina 8路并不同步);th取绝对值最小者,得数据最末端。

实际最大建立时间和最小保持时间如表2所示:

表2  8位加法器(非流水线/FPGA)时序分析之tsu与th


Actual Maximum tsu


Actual Minimum th


From


To


第一周期内数据位置


3.166ns


-3.056ns


cin


tempc


1.834ns ~ 1.944ns(高)


3.138ns


-2.399ns**


ina[n] (n=0..7)


tempa[n]


1.862ns ~ 2.601ns


3.391ns**


-2.550ns


inb[n] (n=0..7)


tempb[n]


1.609ns ~ 2.450ns

注:..ns**为worst-case情况下的tsu/th时间。

初始化波形如图2所示:

图2  8位加法器(非流水线/FPGA)时序分析之初始波形

仿真结果如图3所示:

图3  8位加法器(非流水线/FPGA)时序分析之仿真图

注意:

1.  对于某些输入数据,cin、ina、inb可以更“窄”。如:

cin:  1.844ns ~ 1.850ns

ina:  1.948ns ~ 2.601ns

inb:  1.619ns ~ 2.450ns

结果也正确,但并不能保证对于所有输入,输出均正确。

红色ns时间不可越界,时间精度为0.001ns。如cin取1.845ns ~ 1.944ns时,输出不正确。

所以,对于建立时间/保持时间确定的数据时间段为(t – tsu) ~(t + th),宜宽不宜窄。

2.  图3中第一个时钟上升沿为5.0ns,下降沿为7.632ns(原时钟下降沿在10ns处)。当时钟下降沿设为7.632ns之前(如7.631ns)时,输出数据正确,但却延迟了两个周期,相当于第二个时钟周期内并未采到数据,直到第二个时钟上升沿到来时才采样输出。不知道为什么会这样。不过,这种脉宽不同的时钟在实际中似乎并无意义。时钟脉宽可以非常窄,但是各个脉宽不同的话,输出不可预料。

2.2 altsyncram测试实验

altsyncram宏单元结构如图4所示:

图4  altsyncram宏单元结构

此处给出宏单元结构,是因为我在做仿真时序分析时,想当然地认为outclk对输入地址和数据采样并输出(读出)。其实图4中清楚地表明,只有inclk上升沿采样锁存读/写地址和数据,经过一段延时后由outclk上升沿触发输出——outclk的功能类似读使能信号!

时序编译报告如表3所示:

表3  altsyncram读写测试时序分析之简表


Type


Actual Time


From


To


From Clock


To Clock


Worst-case tsu


3.523ns


addr_a[1]


porta_address_reg1


--


inclk


Worst-case tco


7.818ns


altsyncram|q_a[5]


q_a[5]


outclk


--


Worst-case th


-2.346ns


data_b[7]


portb_datain_reg0


--


inclk


Clock Setup: ‘inclk‘


period=3.438ns*


porta_datain_reg7


porta_memory_reg7


inclk


inclk

注:

1. ..ns* 对应fmax=290.87MHz,实际时钟周期为8ns,占空比为1:1。

2. tco: from clock "outclk" to destination pin "q_a[*]" through memory "altsyncram0: inst|altsyncram: altsyncram_component|altsyncram_8982: auto_generated|q_a[*]"

实际最大建立时间和最小保持时间如表4所示:

表4  altsyncram读写测试时序分析之tsu和th


Actual Maximum tsu


Actual Minimum th


From


To


To Clock


3.523ns**


-2.626ns


addr_a[n] (n=0..7)


porta_address_regn


inclk


3.510ns


-2.400ns


addr_b[n] (n=0..7)


portb_address_regn


inclk


3.429ns


-2.605ns


data_a[n] (n=0..7)


porta_datain_regn


inclk


3.383ns


-2.346ns**


data_b[n] (n=0..7)


portb_datain_regn


inclk


2.640ns


-2.475ns


wren_a


porta_we_reg


inclk


2.825ns


-2.660ns


wren_b


portb_we_reg


inclk

注:..ns**为worst-case情况下的tsu/th时间。

如前所述,inclk上升沿采样锁存地址和数据,经过一段延时δ后由outclk上升沿触发输出。δ的最小值近似等于电路内部最小时钟周期,即


δmin = Shortest clock path from clock "inclk" to destination memory(2.875ns)

+ Micro clock to output delay of source(0.420ns)

+ Micro setup delay of destination(0.131ns)

- smallest clock skew(-0.012ns)

= 3.438ns

而从outclk上升沿到输出寄存器输出数据的延时即为tco,即最大延迟为7.818ns(最小延时则为6.906ns)。

仿真结果如图5所示:

图5  altsyncram读写测试时序分析之仿真图

inclk、outclk都是上升沿触发,与持续时间无关(即时钟脉冲可以非常窄)。

此处未考虑极限情况。其实 tsu、th、tco等参数就描述了所谓的“极限读写”,而tco指示了与时钟触发沿对应的输出(比照输入输出时很有用)。

分析b路数据。第n个时钟上升沿用inclk_n/outclk_n表示,数据和地址内容用signal_b‘x表示(如data_b为2时表示为data_b‘2)。时钟有效沿之后δ时间处称为δ临界点。

当inclk_1来临时,锁入data_b‘1和addr_b‘1,并在δ临界点之后检测到outclk_2,延时tco时间后输出q_b‘1。

当inclk_2来临时,锁入data_b‘3和addr_b‘3(注意理解tsu和th),并在δ临界点之后检测到outclk_3。但inclk_3也检测到outclk_3,故更新输出寄存器的输入,并延时tco时间后输出q_b‘5。这也意味着要达到连续读写无误,必须在inclk_n的δ临界点之后与inclk_n+1的δ临界点之前这段时间内检测到outclk_n。

后续数据分析原理同上。注意,时序分析时必须考虑tsu和th,切忌单看波形想当然。

下面考虑极限读写:

图6  altsyncram极限读写时序示意图

如图6所示,输入数据a和b的持续时间段为由(t – tsu) ~(t - th)确定。


T  = tsu_a – th_b

T‘ = tsu_a – tsu_b

head_a2 = t2 – tsu_a

               = t+ T – tsu_a = t+ tsu_a – th_b – tsu_a

               = t– th_b

head_b2 = t2 – tsu_b

               = t+ tsu_a – th_b - tsu_b = (t– th_b) + (tsu_a – tsu_b)

               = head_a+ T‘

在T时间内,数据a的前端(head)最靠前,数据b的末端(back)最靠后。当这个head/back分别是所有输入数据的最前/末端时,就得到了极限情况下(Tmax)的时序图。只有满足这个时序要求,才能达到最快速的正确读写。

极限读写仿真结果如图7所示:

图7  altsyncram极限读写测试仿真图

其中inclk、outclk时钟周期均为1.177ns。按“读写周期指连续进行两次读(或写)操作所需要的最小的最短时间间隔”的定义,取1.177ns为写周期。

仿真波形正确,只是会出现如下警告(影响未知):

Warning: Found clock high time violation at 6.45 ns on register "|altsyncram_test|altsyncram0: inst|altsyncram:altsyncram_component|altsyncram_8982: auto_generated|q_a[7]~_SIM_0PORT_B_READ_ENABLE"——(这是因为fMAX超过芯片最大工作频率,时钟的high/low电平持续时间不够)

Warning: Simultaneous write to memory block address 0 at time 6.89 ns in vector source file -- data is invalid in memory block

三  总结建议

将时序分析相关概念弄清楚后,结合编译报告中Timing Analyzer项,得到tsu、th、tco等时序参数,再调整波形做仿真试验,将理论分析与实践相比照,互相验证。仿真时可以先做功能仿真(前仿真),其特点是不考虑电路门延迟与线延迟,主要验证电路的功能是否符合设计要求。然后进行时序仿真(后仿真),主要验证是否满足时间约束关系、延时、最大工作频率和消耗的资源等。我在做altsyncram读写测试时,所采用的波形与师兄完全相同,以期重复他的结果。但很快发现,师兄并没有做时序分析,而是“1纳秒1纳秒试出来的”,这种具体的“数字试验”与选用器件密切相关。比如我把inclk时钟周期也设为6ns时,输出与师兄的结果有出入,甚至输出从未写入的值。后来才明白,当周期为6ns时,输入数据无法满足tsu要求而出现亚稳态(Violating the setup or hold time on the address registers could corrupt the memory contents),改为8ns后输出相符。可见不同的器件时序结果有所不同,但其时序关系是一致的。基于这个认识,我在做读写测试时采用“参数化分析”(tsu、th、tco等时序参数)的方法,这样即使更换器件,也不影响分析结论。

     对于延时不明显的简单电路,可以不考虑时序分析。但当涉及多路寄存器时,一般要进行细致的时序分析,以求设计出来的电路满足时序要求。时序分析时要特别注意三点:其一,必须考虑tsu、th、tco及tpd等参数,不要局限于你所看见的仿真波形,要知道存在大延迟时,时钟沿采到的数据很有可能是之前输入的数据!其二,必须对器件电路或程序对应的电路布局有个整体认识,明确各端口信号的关系,这样可以避免很多不该出现的错误。其三,做到前两点后,做极限测试时建议采用“参数化分析”的方法,因为“1纳秒1纳秒试出来的”的结果往往过于依赖环境变量(如所选器件),调整过程也很麻烦,同时也容易造成实践与理解偏差(前者比如RAM的阵列结构决定了地址线高低位的读取有快慢,从而导致特定地址如5‘b10000“试”出的时序结果,对于其他地址如5‘b00001却不适用;后者就自不待说了)。

四  附注

1. 大部分外围器件的读写周期在50ns以上。即便是最快的静态RAM,其读写周期也在8ns左右。而ROM的速度一般远远低于RAM,其访问周期一般为100ns~200ns。

采用MOS工艺的存储器,存取周期数为数十至数百ns,而双级型RAM存取周期最快可达10ns以下,一般存储周期略大于存取时间,其差别取决于贮存的物理实现细节。

但对于FPGA内置RAM,读写周期似乎可以达到一两纳秒。

2. Matlab小程序(便于计算)

 1 clc,clear all;
 2 N = 2;
 3 DataParam = [3.523,2.626; 3.510,2.400; 3.429,2.605; 3.383,2.346; 2.640,2.475; 2.825,2.660];
 4 Interval = max(DataParam(:,1)) - min(DataParam(:,2));
 5 ClkPosedge = max(DataParam(:,1)) + [0:N-1] * Interval;
 6 for idx = 1:N
 7     idx
 8     Clk = ClkPosedge(idx)
 9     DataElapse = ClkPosedge(idx) - DataParam
10 end

基于建立/保持时间等的参数化时序分析

时间: 2024-08-04 13:24:24

基于建立/保持时间等的参数化时序分析的相关文章

使用mysqlbinlog工具进行基于位置或时间点的数据恢复

使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间.用来进行全备和日志备的工具各种各样,各有其特色,在这里不做描述.本文主要讲解一下在回复完全备份后,如何应用备份的二进制日志来将数据恢复到指定的位置或时间点. 这里有个十分重要的工具--mysqlbinlog,专门用来查看二进制日

注入学习(3) Mysql+php注入 基于bool和时间的盲注

练习三:Mysql+php 基于bool和时间的盲注 今天要用的函数(详细的直接看链接): left()函数:left()得到字符串左部指定个数的字符 left( string, n ) #string为要截取的字符串,n为长度 limit()函数:标准定义找百度 limit(a,b)  #我的理解 从第a个位置,截取b个数据 if语句/if()函数:在MySQL中语法如下 if(a,b,c)  #如果a为真,则if()函数执行b语句; 否则if()函数执行c语句; sleep()函数:函数代码

基于Geoserver发布时间地图

Geoserver它是著名的开源GIS其中软件. 地图服务软件也经常使用的物品.基于geoserver和Openlayers它可以建立一个自由的,开放源码GIS工程. Geoserver公布地图的步骤为: 1.      Geoserver启动 启动Geoserver,并登陆. 登陆后界面如图所看到的 2.      新建工作区. 单击数据栏下的工作区,建立新的工作区,例如以下图所看到的,在Name中输入工作区的名字,本文建立的工作区为karl,命名空间未http://www.cxzx.com,

基于jquery带时间轴的图片轮播切换代码

基于jquery图片标题随小圆点放大切换.这是是一款带时间轴的图片轮播切换代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="decoroll2" class="imgfocus"> <div id="decoimg_a2" class="imgbox"> <div class="decoimg_b2"> <a href=&q

基于Java的时间计算程序

在坐火车去学校的途中,突然想着统计下近三十年的日期的星期分布 到学校就用Java编写代码 很low的代码 首先我的思路是通过时间格式化成月份与日期的结合,如"0904" 然后将其作为数据表的主键,然后再通过设置星期日到星期六最为表的列,初始值均为0, 再通过一个子函数来实现插入 插入的思路为先读取,判断当前日期是否为空 如果为空则插入项,如果不为空则当前项在指定星期的天数自加1: 思路很清晰,代码也很简单 首先是数据库操作的类; CalendarDatabase.java import

基于jQuery的时间轴鼠标悬停动画插件

之前为大家分享了很多jquery插件,这次我们要来分享一款不太常见的jQuery插件,它是一个时间轴,时间轴上的每一个点在鼠标滑过时都可以显示该点的描述信息,并且鼠标滑过时都可以产生一定的动画特效,比如鼠标划过时圆圈的展开动画. 在线预览   源码下载 实现的代码. html代码: <div class="clearfix course_nr"> <ul class="course_nr2"> <li>1993 <div c

Stratix内嵌存储器测试报告

     Stratix和Stratix GX系列器件内嵌TriMatrix存储块包括512-bit M512块.4-Kbit M4K块及512-Kbit M-RAM块.TriMatrix存储结构可对输入和输出RAM块的信号加上寄存器级,实现同步(pipelined) RAM.所有TriMatrix存储器输入均为寄存器级,提供同步写周期.输出寄存器可被旁路(bypassed).全同步的简单或真正双端口TriMatrix存储器的工作速度高达312MHz,可工作于flow-through模式(仅有输

MySQL中基于mysqldump和二进制日志log-bin二进制日志进行逻辑备份以及基于时间点的还原

本文出处:http://www.cnblogs.com/wy123/p/6956464.html 本文仅模拟使用mysqldump和log-bin二进制日志进行简单测试,仅作为个人学习笔记,可能离实际应用还有很大差距,仅参考. 开启MySQL的bin-log二进制日志 模拟还原是需要mysqldump出来的文件和log-bin,因此需要开始log-bin二进制日志. mysql5.7.18在开启二进制日志的时候除了要设置log-bin的位置之外,另外需要设置一个server-id,MySQL之前

基于netty的一个简单的时间服务器的实现(netty学习)

基本功能:与客户端建立连接后立刻发送当前时间 先建立一个时间的类 package timeExample; import java.sql.Date; public class UnixTime { private final long value; public UnixTime() { this(System.currentTimeMillis()/1000L); } public UnixTime(long value) { this.value = value; } public lon