第11章 检测和使用序列的端点(.ended, .matched)

11.1 .ended


                                                图11.1 .ended-序列的端点

在我们学习.ended如何进行工作之前,我们先看看IEEE 1800-2009标准有哪些变化。

 2009标准舍弃了了.ended,并用.triggered取而代之。换句话说,.triggered与.ended具有相同的含义,只有.triggered可以用于.ended使用的位置以及之前版本允许的.triggered被允许的位置。换句话说,.triggered可以用在序列中,也可以用在程序块中,也可以用在电平敏感的'wait'语句中。

从1800-2009LRM:

IEEE Std 1800-2005 17.7.3开始,需要使用。序列表达式中的结尾.ended方法和其他上下文中的.triggered序列方法。由于这两个构造具有相同的含义,但是具有相互排斥的用法上下文,在此版本的标准中,.triggered方法允许在顺序表达式中使用,而且不推荐使用.ended的用法,并且不会出现在此版本的标准。

我仍然会继续解释.ended如何工作,以防万一您没有切换到1800-2009。

 好的,继续.ended...

 如果你主要对序列的结尾感兴趣,不管它开始的时间,.ended就是你需要的。检测序列终点的方法的主要优点是不需要知道序列的开始。所有你关心的是,当一个序列结束时。

图11.1显示了这个行为。序列'分支'是分支完成的完整序列。它可以随时开始。属性endCycle要确保endBranch标志变高时'分支'序列确实结束。换句话说,只要$ rose(endBranch)在下一个时钟被检测为真,分支必须结束。这确实是非常强大和有用的功能。这使得断言也很直观。

但是,如果你简单地在“branch”末端写断言为,看看endBranch在''branch(a,b,c,d)|=>$ rose(endBranch)''中变高。那有什么问题?那么,如果$rose(endBranch)在“分支”仍在执行时变高,该怎么办? $ rose(endBranch)将被忽略,直到序列“branch”结束。.ended运算符可以理解这一点。如果endBranch在序列“branch”仍在执行时变高,则该属性将失败。这是因为endCycle预计'branch'在endBranch走高时结束。由于endBranch可能过早变高,该属性将会看到$ rose(endBranch)中的'branch'序列尚未结束,该属性将失败。前瞻性属性不会抓住这一点。这是非常重要的一点。请记下它。

 另请注意,源序列和目标序列中的时钟必须相同。但是如果你希望源时钟和目的时钟有所不同呢?这就是‘.matched’所做的,很快就会被讨论。

 图11.2 解释了进一步的细微差别。

 

                                            图11.2 .ended与重叠蕴涵运算符

 在这个例子中,$ rose(c)意味着序列aRb必须结束。这里要注意的关键点是蕴涵运算符是重叠的。这意味着当$ rose(c)发生在同一时钟时,序列aRb应该结束。如图11.2所示,当$ rose(c)为真时,在同一时钟$ rose(b)必须发生且前一个时钟$fell(a)。

 图11.3描述了相同的例子,但是具有不重叠的运算符。

 

                                            图11.3 .ended与非重叠蕴涵运算符

 你必须非常仔细地理解这一点,就像看起来那么简单。非重叠蕴涵运算符指出,当$ rose(c)是真的,在下一个时钟时,序列aRb必须结束。因此,如图所示,属性$ rose(c)成立一个时钟后寻找aRb的结束。这很直观,但很容易误解。

 11.2.matched

 

                                                    图11.4 .matched-基础

 .ended和.matched之间的主要区别在于.ended要求源序列和目标序列具有相同的时钟。 .matched允许您在源序列和目标序列中有不同的时钟。

由于时钟可能不同,对匹配的理解会变得有点复杂。但它遵循与多时钟属性相同的规则。如图11.4所示,序列'e1'使用'clk'作为时钟,而序列'e2'使用'sysclk'作为时钟。序列'e2'表示'reset'后; 1个时钟后; 'inst'必须为真,并且在1个时钟后,序列'e1'必须至少匹配一次(即结束),再过1个时钟后,branch_back必须为真。这是一个非常有趣的方式,在一个序列中插入一个.matched(或 .ended)。序列'e1'自己运行。我们真正关心的是它在我们所期望的情况下匹配(结束)。让我们看看一些将使这个概念清晰的例子。

 

                                    图11.5 .matched-不重叠的运算符

 图11.5显示在'c'的上升沿我们想看到aRb序列匹配。让我们看看时序图。当$ rose(c)在clk1(clk1 = 3)的posedge处为真时,它查找序列'aRb'的结尾。序列'aRb'在clk= 3期间开始并且在clk = 4时结束。请注意,'aRb'的结束(即$ rose(bRose)的匹配)正好在clk1边缘之后的下一个'clk'边缘。这就是属性要求的"@(posedge clk1) $rose(c)|=>@(posedgeclk) aRb(a,b).matched;"

 

                                                图11.6 .matched-重叠运算符

 图11.6使用重叠蕴涵运算符和相同的(同相)时钟(时钟必须相同,因为我们使用重叠蕴涵运算符)。因此,当$ rose(c)为真时,它会查找与其(posedge clk)重叠的下一个(posedge clk)。但是下一个(posedgeclk)显然是在1个钟后。因此,在$ rose(c)之后的1个时钟,序列看到aRb匹配(即.ended)。

 11.2.1应用:.matched

 

                                                图11.7 .matched-应用程序

 在图11.7中,序列'RdS'使用Busclk,而属性checkP使用sysclk。 @(negedge sysclk)RdS.matched意味着在sysclk的下降沿,序列RdS(从Busclk运行)必须结束。'RdS'可能比nedgege sysclk稍早完成(即,当Busclk的前一个posedge将到达时)。这没关系,因为我们正在从Busclk转换到sysclk(只要序列RdS在前一个posedge Busclk完成)。

猜你喜欢

转载自blog.csdn.net/zhajio/article/details/80225070