<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://simhard.com/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://simhard.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Valentin</id>
		<title>Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://simhard.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Valentin"/>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Valentin"/>
		<updated>2026-04-12T21:12:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.21.3</generator>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-02-17T08:22:58Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.4 Операторы повторения SERE  ([*n], [=n], и [-&amp;gt;n]) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого - сильный SERE, выполняется только, если будет достигнут цикл, в котором встречается &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;. Другими словами, слабая версия SERE позволяет нам принимать тракт, который является “слишком коротким”, в то время как сильная версия предполагает, что мы должны добраться до конца SERE. Таким образом, в то время как свойство 5.7a выполняется на тракте 5.7(i), также как и на тракте 5.7(ii), свойство 5.7b, сильная версия, выполняется в тракте 5.7(ii), но не в тракте 5.7(i).       &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.7: Слабый SERE выполняется даже, если тракт “слишком короткий”, в то время как сильный SERE,&lt;br /&gt;
должен “достигать конца”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 Оператор &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; применимый в SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой способ использования SERE состоит в описании событий, которые никогда не произойдут. Например, утверждение 5.8a показывает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не должен быть утвержден в двух последовательных циклах, и таким образом не выполняется в тракте 5.8(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой пример, рассмотрим утверждение 5.9a. Оно показывает, что признанный высоко приоритетный запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; вместе с &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, следует циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) не может быть прерван (утверждение &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Таким образом, оно выполняется на тракте 5.9(i), но не выполняется в тракте 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.8: Оператор never &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.9: Еще об опрераторе never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.4 Операторы повторения SERE  (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До теперешнего момента, мы видели основу SERE состоящую из Булевых выражений, разделенных точкой с запятой. В данном разделе мы рассмотрим операторы SERE, которые позволяют вам построить более сложные SERE, используя вариации операторов повторения SERE &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Последовательные операторы повторения предоставляют возможность получения одинаковых под-SERE во времени. Оператор &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; это аббревиатура для n повторений SERE. Например, вместо того, чтобы писать &amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; в утверждении 5.10a, мы можем использовать &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;, как в утверждении 5.10b. Утверждения 5.10a и 5.10b показывают, что после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), мы ожидаем увидеть предопределение (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) с последующими тремя циклами, в которых утверждается сигнал &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с последующим утверждением сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.10(i) пример тракта, в которых выполняются утверждения 5.10a и 5.10b.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.10: Операторы &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вместо отдельного написания числа повторений, мы можем определить диапазон, от i до j, вот так: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Таким образом, утверждение 5.10c одинаково с утверждением 5.10b, но вместо точно требуемых трех утверждений сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, мы требуем между тех и пяти. Утверждение 5.10c выполняются в тракте 5.10(i), также как и в тракте 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верхняя граница диапазона может быть бесконечность, которая обозначается &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; в SystemVerilog, ''null'' в GDL и inf в Verilog, VHDL и SystemC. Например, SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; предполагает пять или более повторений &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем повторять не только Булевы выражения, но и SERE. Например, свойство 5.11а выполняется, если после предопределенного запроса (утверждение сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; последует утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), мы видим три передачи данных, с последующим утверждение сигнала &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, где передача данных это утверждение сигнала &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, с последующим утверждение сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с полседующим утверждением сигнала &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.11(i) это пример тракта, в котором выполняется свойство 5.11a.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если мы пропустим &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, в результате SERE выберет произвольное число повторений Булевого выражения или SERE, которое повторялось. Например, утверждение свойства 5.11b показывает, что после предопределенного запроса, мы ожидаем увидеть некое число передач данных, сопровождаемых утверждением &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Свойство 5.11b выполняется на тракте 5.11(i), также как и трактах 5.11(ii) и 5.11(iii). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; предполагает любое количество повторений, в том числе и их отсутствие. Таким образом, свойство 5.11b выполняется на тракте 5.11(iv). Если мы хотим определить любое ненулевое число повторений, нужно использовать &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Таким образом, свойство 5.11c аналогично свойству 5.11b, но оно предполагает минимум одну передачу данных перед утверждением сигнала done. Таким образом, свойство 5.11с не выполняется на тракте 5.11(iv), но выполняется на трактах 5.11(i), 5.11(ii) и 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вместо того, чтобы опустить n, мы можем опустить Булево выражение или SERE и оставить повторение &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; в одиночестве. Одинокий &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; эквивалентен &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. Другими словами, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; определяет любые n циклов (потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; выполняется во всех циклах). Другой вариант восприятия этого, это понимание того, что таким образом мы можем “пропустить” &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; циклов. Таким образом, свойство 5.12a аналогично свойству Property 5.11b, но вместо подтверждения (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), выполняющегося сразу после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), это происходит четырьмя циклами позже. Свойство 5.12a выполняется на тракте 5.12(i).     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Непоследовательный оператор повторения (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) предоставляет возможность описания повторений, которые происходят на непоследовательных циклах. Это может применять только для Булевых выражений. Например, для описания требования, что после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), мы ожидаем увидеть подтверждение (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) в сопровождении некоторого количества циклов, включая три необязательно последовательных утверждения сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, в сопровождении  утверждения сигнала &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, утверждение 5.13a. Утверждение 5.13a выполняется на тракте Trace 5.13(i). Обратите внимания на циклы отмеченные “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” в тракте 5.13(i). Они не начинаются с утверждением сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; , при этом они не заканчиваются после одного. Непоследовательный оператор повторения &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; определяет последовательность циклов, в которой &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; необязательно последовательное повторение Булевого выражения, включая последовательности циклов, в которых “padding” вначале и/или в конце. Другими словами, он определяет любую  последовательность циклов, в которой число утверждений  Булевого выражения повторится &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; раз.   &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If you want at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если вы хотите запретить заполнение в конце, используйте оператор повторения goto [-&amp;gt;n]. Оператор повторения [-&amp;gt;n] идентичен непоследовательному оператору повторения, за исключением того, что последовательность циклов будет описываться с утверждение Булевого выражения, которое должно повторяться, в конце. Другими словами, он показывает последовательность циклов, начиная с текущего цикла и заканчивая после вашего “go to” n-го вхождения в Булево выражение (использование -&amp;gt; предназначено для упоминания, что по стрелки вы переходите к инструкции n). Таким образом утверждение 5.13b не выполняется в тракте 5.13(i), но выполняется в тракте 5.13(ii), потому что третий busy сопровождается утверждением сигнала done.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
n может быть опущен для оператора повторения goto, в этом случаи n по-умолчанию равняется 1. Другими словами, b[-&amp;gt;] эквивалентно [-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Как и последовательные операторы повторения, непоследовательный оператор и оператор goto могут принимать диапазон. Таким образом, утверждение 5.14a требует три - пять не обязательных последовательных утверждений busy, после утверждения сигнала ack и перед утверждением done, в то время как утверждение 5.14b требует тоже самое, и в дополнение, то что утверждение сигнала done появляется, незамедлительно, после 3-го, 4-го или 5-го утверждения сигнала busy. Таким образом, утверждение 5.14a выполняется на трактах 5.14(i) и 5.14(ii), в то время как утверждение 5.14b выполняется на тракте 5.14(ii), но не на тракте 5.14(i).&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-02-07T11:07:50Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.4 Операторы повторения SERE  ([*n], [=n], и [-&amp;gt;n]) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого - сильный SERE, выполняется только, если будет достигнут цикл, в котором встречается &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;. Другими словами, слабая версия SERE позволяет нам принимать тракт, который является “слишком коротким”, в то время как сильная версия предполагает, что мы должны добраться до конца SERE. Таким образом, в то время как свойство 5.7a выполняется на тракте 5.7(i), также как и на тракте 5.7(ii), свойство 5.7b, сильная версия, выполняется в тракте 5.7(ii), но не в тракте 5.7(i).       &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.7: Слабый SERE выполняется даже, если тракт “слишком короткий”, в то время как сильный SERE,&lt;br /&gt;
должен “достигать конца”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 Оператор &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; применимый в SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой способ использования SERE состоит в описании событий, которые никогда не произойдут. Например, утверждение 5.8a показывает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не должен быть утвержден в двух последовательных циклах, и таким образом не выполняется в тракте 5.8(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой пример, рассмотрим утверждение 5.9a. Оно показывает, что признанный высоко приоритетный запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; вместе с &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, следует циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) не может быть прерван (утверждение &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Таким образом, оно выполняется на тракте 5.9(i), но не выполняется в тракте 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.8: Оператор never &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.9: Еще об опрераторе never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.4 Операторы повторения SERE  (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До теперешнего момента, мы видели основу SERE состоящую из Булевых выражений, разделенных точкой с запятой. В данном разделе мы рассмотрим операторы SERE, которые позволяют вам построить более сложные SERE, используя вариации операторов повторения SERE &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Последовательные операторы повторения предоставляют возможность получения одинаковых под-SERE во времени. Оператор &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; это аббревиатура для n повторений SERE. Например, вместо того, чтобы писать &amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; в утверждении 5.10a, мы можем использовать &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;, как в утверждении 5.10b. Утверждения 5.10a и 5.10b показывают, что после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), мы ожидаем увидеть предопределение (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) с последующими тремя циклами, в которых утверждается сигнал &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с последующим утверждением сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.10(i) пример тракта, в которых выполняются утверждения 5.10a и 5.10b.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.10: Операторы &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вместо отдельного написания числа повторений, мы можем определить диапазон, от i до j, вот так: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Таким образом, утверждение 5.10c одинаково с утверждением 5.10b, но вместо точно требуемых трех утверждений сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, мы требуем между тех и пяти. Утверждение 5.10c выполняются в тракте 5.10(i), также как и в тракте 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верхняя граница диапазона может быть бесконечность, которая обозначается &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; в SystemVerilog, ''null'' в GDL и inf в Verilog, VHDL и SystemC. Например, SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; предполагает пять или более повторений &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем повторять не только Булевы выражения, но и SERE. Например, свойство 5.11а выполняется, если после предопределенного запроса (утверждение сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; последует утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), мы видим три передачи данных, с последующим утверждение сигнала &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, где передача данных это утверждение сигнала &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, с последующим утверждение сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с полседующим утверждением сигнала &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.11(i) это пример тракта, в котором выполняется свойство 5.11a.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если мы пропустим &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, в результате SERE выберет произвольное число повторений Булевого выражения или SERE, которое повторялось. Например, утверждение свойства 5.11b показывает, что после предопределенного запроса, мы ожидаем увидеть некое число передач данных, сопровождаемых утверждением &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Свойство 5.11b выполняется на тракте 5.11(i), также как и трактах 5.11(ii) и 5.11(iii). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; предполагает любое количество повторений, в том числе и их отсутствие. Таким образом, свойство 5.11b выполняется на тракте 5.11(iv). Если мы хотим определить любое ненулевое число повторений, нужно использовать &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Таким образом, свойство 5.11c аналогично свойству 5.11b, но оно предполагает минимум одну передачу данных перед утверждением сигнала done. Таким образом, свойство 5.11с не выполняется на тракте 5.11(iv), но выполняется на трактах 5.11(i), 5.11(ii) и 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вместо того, чтобы опустить n, мы можем опустить Булево выражение или SERE и оставить повторение &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; в одиночестве. Одинокий &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; эквивалентен &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. Другими словами, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; определяет любые n циклов (потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; выполняется во всех циклах). Другой вариант восприятия этого, это понимание того, что таким образом мы можем “пропустить” &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; циклов. Таким образом, свойство 5.12a аналогично свойству Property 5.11b, но вместо подтверждения (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), выполняющегося сразу после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), это происходит четырьмя циклами позже. Свойство 5.12a выполняется на тракте 5.12(i).     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Непоследовательный оператор повторения (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) предоставляет возможность описания повторений, которые происходят на непоследовательных циклах. Это может применять только для Булевых выражений. Например, для описания требования, что после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), мы ожидаем увидеть подтверждение (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) в сопровождении некоторого количества циклов, включая три необязательно последовательных утверждения сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, в сопровождении  утверждения сигнала &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, утверждение 5.13a. Утверждение 5.13a выполняется на тракте Trace 5.13(i). Обратите внимания на циклы отмеченные “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” в тракте 5.13(i). Они не начинаются с утверждением сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; , при этом они не заканчиваются после одного. Непоследовательный оператор повторения &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; определяет последовательность циклов, в которой &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; необязательно последовательное повторение Булевого выражения, включая последовательности циклов, в которых “padding” вначале и/или в конце. Другими словами, он определяет любую  последовательность циклов, в которой число утверждений  Булевого выражения повторится &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; раз.   &lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-30T10:57:28Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.4 SERE repetition operators ([*n], [=n], and [-&amp;gt;n]) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого - сильный SERE, выполняется только, если будет достигнут цикл, в котором встречается &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;. Другими словами, слабая версия SERE позволяет нам принимать тракт, который является “слишком коротким”, в то время как сильная версия предполагает, что мы должны добраться до конца SERE. Таким образом, в то время как свойство 5.7a выполняется на тракте 5.7(i), также как и на тракте 5.7(ii), свойство 5.7b, сильная версия, выполняется в тракте 5.7(ii), но не в тракте 5.7(i).       &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.7: Слабый SERE выполняется даже, если тракт “слишком короткий”, в то время как сильный SERE,&lt;br /&gt;
должен “достигать конца”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 Оператор &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; применимый в SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой способ использования SERE состоит в описании событий, которые никогда не произойдут. Например, утверждение 5.8a показывает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не должен быть утвержден в двух последовательных циклах, и таким образом не выполняется в тракте 5.8(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой пример, рассмотрим утверждение 5.9a. Оно показывает, что признанный высоко приоритетный запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; вместе с &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, следует циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) не может быть прерван (утверждение &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Таким образом, оно выполняется на тракте 5.9(i), но не выполняется в тракте 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.8: Оператор never &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.9: Еще об опрераторе never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.4 Операторы повторения SERE  (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До теперешнего момента, мы видели основу SERE состоящую из Булевых выражений, разделенных точкой с запятой. В данном разделе мы рассмотрим операторы SERE, которые позволяют вам построить более сложные SERE, используя вариации операторов повторения SERE &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Последовательные операторы повторения предоставляют возможность получения одинаковых под-SERE во времени. Оператор &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; это аббревиатура для n повторений SERE. Например, вместо того, чтобы писать &amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; в утверждении 5.10a, мы можем использовать &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;, как в утверждении 5.10b. Утверждения 5.10a и 5.10b показывают, что после запроса (утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), мы ожидаем увидеть предопределение (утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) с последующими тремя циклами, в которых утверждается сигнал &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с последующим утверждением сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.10(i) пример тракта, в которых выполняются утверждения 5.10a и 5.10b.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.10: Операторы &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вместо отдельного написания числа повторений, мы можем определить диапазон, от i до j, вот так: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Таким образом, утверждение 5.10c одинаково с утверждением 5.10b, но вместо точно требуемых трех утверждений сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, мы требуем между тех и пяти. Утверждение 5.10c выполняются в тракте 5.10(i), также как и в тракте 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верхняя граница диапазона может быть бесконечность, которая обозначается &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; в SystemVerilog, ''null'' в GDL и inf в Verilog, VHDL и SystemC. Например, SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; предполагает пять или более повторений &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем повторять не только Булевы выражения, но и SERE. Например, свойство 5.11а выполняется, если после предопределенного запроса (утверждение сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; последует утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), мы видим три передачи данных, с последующим утверждение сигнала &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, где передача данных это утверждение сигнала &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, с последующим утверждение сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, с полседующим утверждением сигнала &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Тракт 5.11(i) это пример тракта, в котором выполняется свойство 5.11a.  &lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-30T09:42:20Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.3 The never operator applied to a SERE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого - сильный SERE, выполняется только, если будет достигнут цикл, в котором встречается &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;. Другими словами, слабая версия SERE позволяет нам принимать тракт, который является “слишком коротким”, в то время как сильная версия предполагает, что мы должны добраться до конца SERE. Таким образом, в то время как свойство 5.7a выполняется на тракте 5.7(i), также как и на тракте 5.7(ii), свойство 5.7b, сильная версия, выполняется в тракте 5.7(ii), но не в тракте 5.7(i).       &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.7: Слабый SERE выполняется даже, если тракт “слишком короткий”, в то время как сильный SERE,&lt;br /&gt;
должен “достигать конца”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 Оператор &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; применимый в SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой способ использования SERE состоит в описании событий, которые никогда не произойдут. Например, утверждение 5.8a показывает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не должен быть утвержден в двух последовательных циклах, и таким образом не выполняется в тракте 5.8(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой пример, рассмотрим утверждение 5.9a. Оно показывает, что признанный высоко приоритетный запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; вместе с &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, следует циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) не может быть прерван (утверждение &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; циклом позже &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Таким образом, оно выполняется на тракте 5.9(i), но не выполняется в тракте 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.8: Оператор never &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Утверждение 5.8a не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.9: Еще об опрераторе never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-30T09:26:46Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.2 Слабый и сильный SERE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого - сильный SERE, выполняется только, если будет достигнут цикл, в котором встречается &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;. Другими словами, слабая версия SERE позволяет нам принимать тракт, который является “слишком коротким”, в то время как сильная версия предполагает, что мы должны добраться до конца SERE. Таким образом, в то время как свойство 5.7a выполняется на тракте 5.7(i), также как и на тракте 5.7(ii), свойство 5.7b, сильная версия, выполняется в тракте 5.7(ii), но не в тракте 5.7(i).       &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.7: Слабый SERE выполняется даже, если тракт “слишком короткий”, в то время как сильный SERE,&lt;br /&gt;
должен “достигать конца”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-30T09:05:08Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.2 Weak and strong SEREs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Слабый и сильный SERE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и временные операторы, SERE могут быть слабыми и сильными, и как и временные операторы, сильные версии SERE обозначаются восклицательным знаком (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Таким образом, свойство 5.7а, правая сторона которого   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-30T08:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.1 Суффиксная импликация (|-&amp;gt; и |=&amp;gt;) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). Отметим, что в тракте 5.5(i) утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; в цикле 16 завершает then-часть второй и третьей if-then пары. Для более глубокого объяснения этого феномена,смотрите раздел 13.4.2.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойства 5.6a и 5.6b выполняются в тракте 5.6(i), потому что не существует последовательности циклов согласованных с левой стороной, т.о. else-часть по-умолчанию утверждается в каждом цикле.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Свойства 5.6a и 5.6b выполняются&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.6: else-часть суффиксной импликации по-умолчанию утверждена&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Weak and strong SEREs==&lt;br /&gt;
&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-27T10:27:51Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.1 Суффиксная импликация (|-&amp;gt; и |=&amp;gt;) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, то, конечно же, мы должны были бы идентифицировать множественные if-then пары, как показано в тракте 5.5(i). Отметим, что if-часть другой if-then пары может начинаться, перед завершение выполнения if-части или  then-части предыдущей if-then пары. Например, вторая if-then пара начинается в седьмом цикле, перед тем, как выполнится then-часть первой пары. Третья if-then прара начинается в цикле 8, перед тем как выполнятся then-часть первой пары и if-часть второй пары. Мы могли видеть такой вид перекрытия ранее, в трактах 2.2(ii) и 2.3(iii). &lt;br /&gt;
&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Properties 5.6a and 5.6b both hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.6: The else-part of a suffix implication defaults to true&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Weak and strong SEREs==&lt;br /&gt;
&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-24T12:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 5.1 Суффиксная импликация (|-&amp;gt; и |=&amp;gt;) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Напомним, что логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) может интерпретироваться, как if-then выражение, с безоговорочно утвержденной else-частью. Суффиксный оператор импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) может восприниматься также. Разница между логическим оператором импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) и суффиксным оператором импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) во временных взаимоотношениях между if- и then-частями. В то время, как текущий цикл then-части для оператора логической импликации     &lt;br /&gt;
(-&amp;gt;) тот же, что и для if-части, текущий цикл then-части суффиксного оператора импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) это первый цикл ''суффикса'' тракта, который остается после того, как сменяется if-часть. Это показано для свойств 5.4a и 5.4b в трактах 5.4(i) и 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Тракт имеет множественные if-then пары. Свойство 5.5a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.5:  if-часть другой if-then пары может начаться перед тем, как if-часть или &lt;br /&gt;
then-часть предыдущей if-then пары выполниться&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
в трактах 5.4(i) и 5.4(ii) присутствует единичное утверждение сигнала &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Если бы здесь было множественные утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;,  &lt;br /&gt;
&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Properties 5.6a and 5.6b both hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.6: The else-part of a suffix implication defaults to true&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==5.2 Weak and strong SEREs==&lt;br /&gt;
&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-09T16:22:01Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Стиль SERE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: SERE - это свойство, но свойство это не всегда SERE. Таким образом, пока мы можем использовать SERE, как операнд временного оператора, мы не можем вставить временной оператор, такой как &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, внутрь SERE. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сейчас предположим, что у нас есть ситуация похожая на свойство 5.2a, но в которой грант (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) появляется циклом ''позже'' утверждения &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. Мы можем попробовать заменить булево выражение &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; временным выражением &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, как в свойстве 5.3a. Однако, вспомним урок раздела 3.4: в свойстве 5.3a текущий цикл  лева-ориентированной стороны &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; тот же самый, что и текущий цикл право-ориентированной стороны (потому что они соединены булевым оператором &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Таким образом, текущий цикл &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (который является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;) - это тот же текущий цикл для SERE (который также является операндом оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;). Это немного запутанно, и действительно свойство 5.3а не принадлежит простому подмножеству PSL, которые мы обсуждали в главе 9.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Давайте модифицируем свойство 5.3а, как показано в свойстве 5.3b. Сейчас один оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; применяется для обоих, &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE, которые являются операндами оператора &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;. Свойство 5.3b эквивалентно свойству 5.3a, но оно из просто подмножества, делая более простым отслеживание временной выборки между &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; и SERE. Если мы подразумеваем, что текущий цикл SERE должен быть циклом ''позже'' &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, мы можем манипулировать свойством 5.3b, добавляя &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, как в свойстве 5.3c. Однако, суффиксная импликация операторов предоставляет более простой путь.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a отмечает 1 и 2. SERE 5.1b отмечает 1, но не 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.1: Два простых SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Свойство 5.2a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.2:  SERE - свойство&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.3: Свойство 5.3a не из простого подмножества. Свойства 5.3b и 5.3c из простого подмножества,&lt;br /&gt;
 но они сложны для чтения. Эти свойства можно выразить проще, используя суффиксную импликацию.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Суффиксная импликация (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы ''суффиксной импликации'' (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) предоставляют возможность ссылаться на два SERE таким образом, что право-ориентированная сторона начинает работать, когда лева-сторонняя сторона заканчивает работы. Параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует “когда лева-ориентированная сторона заканчивает работать” также, как “в том же цикле, когда лева-ориентированная сторона заканчивает работать”, в то время как не параллельный оператор суффиксной импликации (&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) интерпретирует это, как “цикл после цикла, в котором лева-ориентированная сторона завершила работу”. Таким образом, свойство 5.4а эквивалентно свойству 5.3b, и свойство 5.4b эквивалентно свойству 5.3c. Оба свойства 5.4a и 5.4b легче для понимания, чем эквивалентное свойство без суффиксной импликации  , и оба принадлежат простому подмножеству из главы 9.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 5.4: Суффиксная импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) A trace having multiple if-then pairs. Property 5.5a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.5: The if-part of another if-then pair may begin before the if-part or the&lt;br /&gt;
then-part of a previous if-then pair has completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Properties 5.6a and 5.6b both hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.6: The else-part of a suffix implication defaults to true&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.2 Weak and strong SEREs==&lt;br /&gt;
&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style</id>
		<title>PSL/A Practical Introduction to PSL/SERE Style</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/SERE_Style"/>
				<updated>2014-01-06T15:40:28Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* SERE Style */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
=Стиль SERE=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Up until now, we have seen PSL properties that are built of Boolean expres-&lt;br /&gt;
sions and temporal operators in LTL style. Another way to build properties is&lt;br /&gt;
to use SEREs – Sequential Extended Regular Expressions. SEREs are similar&lt;br /&gt;
in spirit to standard regular expressions, like those used for pattern matching&lt;br /&gt;
in many applications. One difference is that the atoms of a SERE are Boolean&lt;br /&gt;
expressions, whereas the atoms of a standard regular expression are single&lt;br /&gt;
characters.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
До этого момента, мы видели свойства PSL, построенные на булевых выражениях и временных операторах в стиле LTL. Другой путь построения свойств использует SERE - Последовательные расширения регулярных выражений. SERE по-сути тоже самое, что и регулярные выражения, как те, которые используются для сопоставления во многих приложениях. Отличие лишь в том, что атом SERE - булево выражение, в то время, как атомы стандартного регулярного выражения - отдельные символы. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A SERE is typically enclosed in curly braces, and the atoms of the SERE&lt;br /&gt;
are typically separated by semi-colons. For instance, &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; is a SERE, and&lt;br /&gt;
SERE 5.1a is a more complicated SERE. SERE 5.1a describes a sequence of&lt;br /&gt;
cycles in which &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; is asserted on the first cycle, then &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt;&lt;br /&gt;
is asserted for zero or more cycles, indicated by the consecutive&lt;br /&gt;
repetition operator &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, and finally ack is asserted. Thus, SERE 5.1a matches&lt;br /&gt;
the sequence of cycles labeled as “1” in Trace 5.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
SERE  обычно заключается в фигурные скобки, и атом SERE обычно разделен точкой с запятой. Например,  &amp;lt;code&amp;gt;{a;b;c}&amp;lt;/code&amp;gt; - это SERE, и SERE 5.1a - это более сложный SERE. SERE 5.1a описывает последовательность циклов, в которых утверждается &amp;lt;code&amp;gt;(req_out &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; на первом цикле, далее &amp;lt;code&amp;gt;(busy &amp;amp;&amp;amp; !ack)&amp;lt;/code&amp;gt; утверждается нуль или более циклов, показанный последовательным оператором повторения &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt;, и в итоге утверждается ack. Таким образом, SERE 5.1a отмечает последовательность циклов, под лейблом “1” в тракте 5.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Don’t be tempted into reading more into a SERE than is actually there:&lt;br /&gt;
SERE 5.1a matches the sequence of cycles labeled as “2” in Trace 5.1(i) as well.&lt;br /&gt;
SERE 5.1a does not prohibit the assertion of busy during the last cycle of the&lt;br /&gt;
SERE. If it is important to exclude such behavior, busy must be mentioned&lt;br /&gt;
explicitly, as shown in SERE 5.1b. SERE 5.1b matches the sequence of cycles&lt;br /&gt;
labeled as “1” shown in Trace 5.1(i), but does not match the sequence of&lt;br /&gt;
cycles labeled as “2” in that trace.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Не поддавайтесь искушению в трактовке SERE более, чем показано здесь: SERE 5.1a показывает последовательность циклов под лейблом “2” в тракте 5.1(i). SERE 5.1a не запрещает утверждения занятости в течение последнего цикла SERE. Если важно исключить такое поведение, занятость может быть явно указана, как показано в SERE 5.1b. SERE 5.1b показывает последовательность циклов под лейблом “1”, показанная на тракте 5.1(i), но не показывает последовательность циклов под лейблом “2” в этом же тракте.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
How is a SERE used? First, since a SERE is a property, it can be used&lt;br /&gt;
as a sub-property. For example, Property 5.2a holds if whenever there is an&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; then starting on the next cycle we see a sequence&lt;br /&gt;
of cycles matching SERE 5.1a. Property 5.2a holds on Trace 5.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как использовать SERE? Во-первых, SERE может также быть под-свойством. Например, свойство 5.2a выполняется, если существует утверждение  &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt;, далее начиная со следующего цикла, мы видим последовательность циклов отмеченных SERE 5.1a. Свойство 5.2a выполняется на тракте 5.2(i).&lt;br /&gt;
 &lt;br /&gt;
NOTE: A SERE is a property, but a property is not a SERE. Thus, while&lt;br /&gt;
you can use a SERE as an operand of a temporal operator, you cannot embed&lt;br /&gt;
a temporal operator such as &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; inside of a SERE.&lt;br /&gt;
&lt;br /&gt;
Suppose now that we have a situation similar to that of Property 5.2a, but&lt;br /&gt;
in which a grant (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) is given the cycle ''after'' the assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;. We could try to replace the Boolean expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; gnt&amp;lt;/code&amp;gt; with&lt;br /&gt;
the temporal expression &amp;lt;code&amp;gt;req_in &amp;amp;&amp;amp; next gnt&amp;lt;/code&amp;gt;, as in Property 5.3a. However,&lt;br /&gt;
remember the lesson of Section 3.4: in Property 5.3a the current cycle of the&lt;br /&gt;
left-hand side &amp;lt;tt&amp;gt;(req_in &amp;amp;&amp;amp; next gnt)&amp;lt;/tt&amp;gt; is the same as the current cycle of the&lt;br /&gt;
right-hand side (because they are connected by the Boolean operator &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Thus, the current cycle of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; (which is the operand of a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator) is&lt;br /&gt;
the same as the current cycle of the SERE (which is also the operand of &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator). &lt;br /&gt;
This is slightly confusing, and indeed Property 5.3a is not in&lt;br /&gt;
the simple subset of PSL discussed in Chapter 9.&lt;br /&gt;
&lt;br /&gt;
Let’s modify Property 5.3a as shown in Property 5.3b. Now a single &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is applied to both &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE, which are both operands of&lt;br /&gt;
the &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; operator. Property 5.3b is equivalent to Property 5.3a, but is in the&lt;br /&gt;
simple subset, making the timing between &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; and the SERE easier to see. If&lt;br /&gt;
we mean that the current cycle of the SERE should be the cycle ''after'' that of&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, we can manipulate Property 5.3b by adding a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; as in Property 5.3c.&lt;br /&gt;
However, the suffix implication operators provide a much easier way.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) SERE 5.1a matches both 1 and 2. SERE 5.1b matches 1, but not 2.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}                 (5.1a)&lt;br /&gt;
{(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack &amp;amp;&amp;amp; !busy}        (5.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.1: Two simple SEREs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Property 5.2a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; gnt) -&amp;gt;                                    (5.2a)&lt;br /&gt;
  next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.2: A SERE is a property&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center width=80%&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always ((req_in &amp;amp;&amp;amp; next gnt) -&amp;gt;                            (5.3a)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack})&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3b)&lt;br /&gt;
   {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
always (req_in -&amp;gt; next (gnt -&amp;gt;                             (5.3c)&lt;br /&gt;
   next {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.3: Property 5.3a is not in the simple subset. Properties 5.3b and 5.3c are&lt;br /&gt;
in the simple subset, but are difficult to read. These properties can be&lt;br /&gt;
expressed more easily using suffix implication.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.1 Suffix implication (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
The ''suffix implication'' operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) provide a way to link two&lt;br /&gt;
SEREs in such a way that the right-hand side starts when the left-hand side&lt;br /&gt;
finishes. The overlapping suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt;) interprets “when&lt;br /&gt;
the left-hand side finishes” as “at the same cycle as the cycle in which the&lt;br /&gt;
left-hand side finishes”, while the non-overlapping suffix implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) interprets it as “the cycle after the cycle in which the left-hand side fin-&lt;br /&gt;
ishes”. Thus, Property 5.4a is equivalent to Property 5.3b, and Property 5.4b&lt;br /&gt;
is equivalent to Property 5.3c. Both Property 5.4a and Property 5.4b are eas-&lt;br /&gt;
ier to grasp than the equivalent property without suffix implication, and both&lt;br /&gt;
belong to the simple subset, discussed in Chapter 9.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                              (5.4a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                              (5.4b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.4: Suffix implication&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recall that the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) can be understood as an&lt;br /&gt;
if-then expression, with the else-part being implicitly true. The suffix implica-&lt;br /&gt;
tion operators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) can be understood the same way. The difference&lt;br /&gt;
between the logical implication operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) and the suffix implication op-&lt;br /&gt;
erators (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is in the timing relationship between the if- and the&lt;br /&gt;
then-parts. While the current cycle of the then-part of a logical implication&lt;br /&gt;
operator (-&amp;gt;) is the same as the current cycle of its if-part, the current cycle&lt;br /&gt;
of the then-part of a suffix implication operator (&amp;lt;code&amp;gt;|-&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt;) is the first cycle&lt;br /&gt;
of the ''suffix'' of the trace that remains once the if-part has been seen. This is&lt;br /&gt;
illustrated for Properties 5.4a and 5.4b in Traces 5.4(i) and 5.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) A trace having multiple if-then pairs. Property 5.5a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                       (5.5a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.5: The if-part of another if-then pair may begin before the if-part or the&lt;br /&gt;
then-part of a previous if-then pair has completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Traces 5.4(i) and 5.4(ii) there is a single assertion of signal &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;.&lt;br /&gt;
If there are multiple assertions of &amp;lt;code&amp;gt;req_in&amp;lt;/code&amp;gt;, then of course we will be able to&lt;br /&gt;
identify multiple if-then pairs, as shown in Trace 5.5(i). Note that the if-part of&lt;br /&gt;
another if-then pair may begin before the if-part or the then-part of a previous&lt;br /&gt;
if-then pair has completed. For instance, the second if-then pair starts at cycle&lt;br /&gt;
7, before the then-part of the first if-then pair has completed. The third if-&lt;br /&gt;
then pair starts at cycle 8, before the then-part of the first if-then pair has&lt;br /&gt;
completed, and before the if-part of the second if-then pair has completed.&lt;br /&gt;
We have seen this kind of overlapping previously, in Traces 2.2(ii) and 2.3(iii).&lt;br /&gt;
Note that in Trace 5.5(i), the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; at cycle 16 completes the then-&lt;br /&gt;
part of the second and of the third if-then pair. For a deeper discussion of this&lt;br /&gt;
phenomenon, see Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Properties 5.6a and 5.6b hold on Trace 5.6(i) because there is no sequence&lt;br /&gt;
of cycles matching the left-hand side, thus the else-parts default to true at&lt;br /&gt;
every cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Properties 5.6a and 5.6b both hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |-&amp;gt;                               (5.6a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                               (5.6b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.6: The else-part of a suffix implication defaults to true&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.2 Weak and strong SEREs==&lt;br /&gt;
&lt;br /&gt;
Like temporal operators, SEREs come in weak and strong versions, and like&lt;br /&gt;
temporal operators, the strong version of a SERE is indicated by an exclama-&lt;br /&gt;
tion point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;). Thus, Property 5.7a, whose right-hand side is a weak SERE,&lt;br /&gt;
holds even if signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is never asserted (as long as the rest of the SERE is&lt;br /&gt;
not violated). Property 5.7b, whose right-hand side is a strong SERE, holds&lt;br /&gt;
only if we eventually reach a cycle where &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; occurs. In other words, the weak&lt;br /&gt;
version of a SERE allows us to accept a trace that is “too short”, whereas&lt;br /&gt;
the strong version requires that we “reach the end” of the SERE. Thus, while&lt;br /&gt;
Property 5.7a holds on Trace 5.7(i) as well as Trace 5.7(ii), Property 5.7b, the&lt;br /&gt;
strong version, holds on Trace 5.7(ii) but not on Trace 5.7(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7a)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}&lt;br /&gt;
always {req_in;gnt} |=&amp;gt;                                  (5.7b)&lt;br /&gt;
    {(req_out &amp;amp;&amp;amp; !ack) ; (busy &amp;amp;&amp;amp; !ack)[*] ; ack}!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.7: A weak SERE holds even if the trace is “too short”, while a strong SERE&lt;br /&gt;
must “reach the end”&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.3 The &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; operator applied to a SERE==&lt;br /&gt;
&lt;br /&gt;
Another way to use a SERE is in describing sequences of events that should&lt;br /&gt;
never happen. For example, Assertion 5.8a states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; should never&lt;br /&gt;
be asserted for two consecutive cycles, and thus does not hold on Trace 5.8(i).&lt;br /&gt;
&lt;br /&gt;
As another example, consider Assertion 5.9a. It states that an acknowl-&lt;br /&gt;
edged high priority request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; together with &amp;lt;code&amp;gt;high_pri&amp;lt;/code&amp;gt;, followed&lt;br /&gt;
a cycle later by &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) cannot be canceled (assertion of &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; the cycle after&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Thus it holds on Trace 5.9(i), but not on Trace 5.9(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req;req};                     (5.8a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.8: The never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.9.png]]&lt;br /&gt;
|-&lt;br /&gt;
| (i) Assertion 5.8a does not hold&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert never {req &amp;amp;&amp;amp; high_pri ; ack ; cancel};           (5.9a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.9: More about the never operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.4 SERE repetition operators (&amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;)==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen basic SEREs composed of (possibly repeated)&lt;br /&gt;
Boolean expressions separated by semi-colons. In this section, we examine&lt;br /&gt;
SERE operators that allow you to build more sophisticated SEREs, using&lt;br /&gt;
variations on the SERE repetition operators &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[-&amp;gt;n]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consecutive repetition operators provide a shortcut to typing the same&lt;br /&gt;
sub-SERE a number of times. The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; operator is an abbreviation for&lt;br /&gt;
n repetitions of the SERE it is applied to. For example, instead of typing&lt;br /&gt;
&amp;lt;code&amp;gt;busy;busy;busy&amp;lt;/code&amp;gt; in Assertion 5.10a, we can use the abbreviation &amp;lt;code&amp;gt;busy[*3]&amp;lt;/code&amp;gt;,&lt;br /&gt;
as in Assertion 5.10b. Assertions 5.10a and 5.10b state that after a request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by three cycles in which signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is asserted, followed by&lt;br /&gt;
an assertion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.10(i) is an example of a trace on which&lt;br /&gt;
Assertions 5.10a and 5.10b hold.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig5.10.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always {req} |=&amp;gt; {ack;busy;busy;busy;done};       (5.10a)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3] ; done};         (5.10b)&lt;br /&gt;
assert always {req} |=&amp;gt; {ack ; busy[*3:5] ; done};       (5.10c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 5.10: The &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instead of a specific number of repetitions, we can specify a range, i&lt;br /&gt;
through &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, like this: &amp;lt;code&amp;gt;[*i:j]&amp;lt;/code&amp;gt;. Thus, Assertion 5.10c is similar to Asser-&lt;br /&gt;
tion 5.10b, but instead of requiring exactly three assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;,&lt;br /&gt;
we require between three and five. Assertion 5.10c holds on Trace 5.10(i) as&lt;br /&gt;
well as on Trace 5.10(ii).&lt;br /&gt;
&lt;br /&gt;
The upper bound of a range can be infinity, which is indicated by a &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; in&lt;br /&gt;
the SystemVerilog flavor, by ''null'' in the GDL flavor, and by inf in the Verilog,&lt;br /&gt;
VHDL, and SystemC flavors. For instance, the SERE &amp;lt;code&amp;gt;{b[*5:inf]}&amp;lt;/code&amp;gt; matches&lt;br /&gt;
five or more repetitions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We can repeat not only a Boolean expression, but a SERE as well. For&lt;br /&gt;
example, Property 5.11a holds if after an acknowledged request (an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;), we see three data transfers&lt;br /&gt;
followed by an assertion of signal &amp;lt;code&amp;gt;d_end&amp;lt;/code&amp;gt;, where a data transfer is an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; followed by an assertion of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; followed by an assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Trace 5.11(i) is an example of a trace on which Property 5.11a&lt;br /&gt;
holds.&lt;br /&gt;
&lt;br /&gt;
If we omit the &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, the resulting SERE matches any number of repetitions of&lt;br /&gt;
the Boolean expression or SERE that is being repeated. For example, asserting&lt;br /&gt;
Property 5.11b indicates that after an acknowledged request, we expect to see&lt;br /&gt;
any number of data transfers followed by an assertion of &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Property 5.11b&lt;br /&gt;
holds on Trace 5.11(i), as well as on Traces 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;[*]&amp;lt;/code&amp;gt; repetition matches any number of repetitions, including none. Thus,&lt;br /&gt;
Property 5.11b holds on Trace 5.11(iv) as well. If you want to specify any&lt;br /&gt;
non-zero number of repetitions, use the &amp;lt;code&amp;gt;[+]&amp;lt;/code&amp;gt;. Thus, Property 5.11c is similar&lt;br /&gt;
to Property 5.11b, but it requires at least one data transfer before signal done&lt;br /&gt;
is asserted. Thus, Property 5.11c does not hold on Trace 5.11(iv), but it does&lt;br /&gt;
hold on Traces 5.11(i), 5.11(ii) and 5.11(iii).&lt;br /&gt;
&lt;br /&gt;
Instead of omitting the n, we can omit the Boolean expression or SERE&lt;br /&gt;
and let the repetition &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; stand alone. A stand-alone &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; is equivalent&lt;br /&gt;
to &amp;lt;code&amp;gt;‘true[*n]&amp;lt;/code&amp;gt;. In other words, &amp;lt;code&amp;gt;[*n]&amp;lt;/code&amp;gt; matches any n cycles (because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles). Another way to think of it is that it allows us to “skip”&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cycles. Thus, Property 5.12a is similar to Property 5.11b, but instead of&lt;br /&gt;
the acknowledge (assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) coming immediately following the&lt;br /&gt;
request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), it comes four cycles later. Property 5.12a&lt;br /&gt;
holds on Trace 5.12(i).&lt;br /&gt;
&lt;br /&gt;
The nonconsecutive repetition operator (&amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;) provides a way to describe&lt;br /&gt;
repetitions that happen on not necessarily consecutive cycles. It can be ap-&lt;br /&gt;
plied only to a Boolean expression. For example, to describe the requirement&lt;br /&gt;
that after a request (assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;), we expect to see an acknowledge&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) followed by some number of cycles including three&lt;br /&gt;
not necessarily consecutive assertions of signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, followed by an asser-&lt;br /&gt;
tion of signal &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, we can code Assertion 5.13a. Assertion 5.13a holds on&lt;br /&gt;
Trace 5.13(i). Note the cycles marked “&amp;lt;code&amp;gt;busy[=3]&amp;lt;/code&amp;gt;” in Trace 5.13(i). They do&lt;br /&gt;
not start with an assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, nor do they end with one. The noncon-&lt;br /&gt;
secutive repetition operator &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt; will match any sequence of cycles in which&lt;br /&gt;
there are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; not necessarily consecutive repetitions of the Boolean expression&lt;br /&gt;
being repeated, including sequences of cycles in which the “padding” is at&lt;br /&gt;
the beginning and/or at the end. In other words, it will match any sequence&lt;br /&gt;
of cycles in which the number of assertions of the Boolean expression being&lt;br /&gt;
repeated is ''equal to'' &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (thus the use of the equals sign in &amp;lt;code&amp;gt;[=n]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
If you want to disallow the padding at the end, use the goto repetition op-&lt;br /&gt;
erator [-&amp;gt;n]. The goto repetition operator [-&amp;gt;n] is similar to the nonconsec-&lt;br /&gt;
utive repetition operator, except that the sequence of cycles being described&lt;br /&gt;
ends with an assertion of the Boolean expression being repeated. In other&lt;br /&gt;
words, it will match any sequence of cycles starting at the current cycle and&lt;br /&gt;
ending after you “go to” the nth occurrence of the Boolean expression (the&lt;br /&gt;
use of the -&amp;gt; is intended to remind you of an arrow instructing you to go to&lt;br /&gt;
n). Thus Assertion 5.13b does not hold on Trace 5.13(i), but it does hold on&lt;br /&gt;
Trace 5.13(ii) because the third busy is immediately followed by an assertion&lt;br /&gt;
of signal done.&lt;br /&gt;
&lt;br /&gt;
The n can be omitted for the goto repetition operator, in which case n&lt;br /&gt;
defaults to 1. In other words, b[-&amp;gt;] is equivalent to b[-&amp;gt;1].&lt;br /&gt;
&lt;br /&gt;
Like the consecutive repetition operators, the nonconsecutive repetition&lt;br /&gt;
operator and the goto repetition operator can take a range. Thus, Asser-&lt;br /&gt;
tion 5.14a requires three to five not necessarily consecutive assertions of busy&lt;br /&gt;
after the assertion of signal ack and before the assertion of done, while Asser-&lt;br /&gt;
tion 5.14b requires the same, and in addition that the assertion of signal done&lt;br /&gt;
occur immediately after the 3rd, 4th, or 5th assertion of signal busy. Thus As-&lt;br /&gt;
sertion 5.14a holds on Traces 5.14(i) and 5.14(ii), while Assertion 5.14b holds&lt;br /&gt;
on Trace 5.14(ii) but not on Trace 5.14(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.5 Concatenation (;) and fusion (:)==&lt;br /&gt;
&lt;br /&gt;
We have already seen the concatenation operator, a semi-colon, which is used&lt;br /&gt;
to join two SEREs (or two Boolean expressions, or a Boolean expression and&lt;br /&gt;
a SERE) in such a way that the right-hand SERE starts the cycle after the&lt;br /&gt;
left-hand SERE ends. The fusion operator, a colon, is used to join two SEREs&lt;br /&gt;
(or two Boolean expressions, or a Boolean expression and a SERE) in such a&lt;br /&gt;
way that there is a single cycle of overlap between them: the right-hand SERE&lt;br /&gt;
starts the same cycle that the left-hand SERE ends.&lt;br /&gt;
&lt;br /&gt;
For example, consider the case that we want to specify the behavior of As-&lt;br /&gt;
sertion 5.14b, and in addition, following the assertion of signal done, we should&lt;br /&gt;
see a data transfer, which consists of the assertion of signal data for some num-&lt;br /&gt;
ber of cycles (might be zero), followed by an assertion of signal d end. Using&lt;br /&gt;
the concatenation operator, we can write Assertion 5.15a. Trace 5.15(i) is a&lt;br /&gt;
trace on which Assertion 5.15a holds. The first assertion of signal req gets&lt;br /&gt;
three cycles of data before the assertion of d end, while the second assertion&lt;br /&gt;
of signal req sees four cycles of data before seeing d end.&lt;br /&gt;
&lt;br /&gt;
If the data transfer should start the same cycle as signal done is asserted,&lt;br /&gt;
then we can use the fusion operator as in Assertion 5.16a. Trace 5.16(i) is an&lt;br /&gt;
example of a trace on which Assertion 5.16a holds. It is similar to Trace 5.15(i),&lt;br /&gt;
except that the data transfer starts the same cycle as that in which done is&lt;br /&gt;
asserted, rather than the cycle following the assertion of signal done.&lt;br /&gt;
&lt;br /&gt;
Note that while it may be tempting to understand the concatenation op-&lt;br /&gt;
erator (;) as a delay, the operator does not necessarily “eat” a cycle. For in-&lt;br /&gt;
stance, in the case of the SERE {a ; b[*] ; c}, the b[*] may match zero,&lt;br /&gt;
one, or more cycles, as illustrated in Trace 5.17(i). The first match shown in&lt;br /&gt;
Trace 5.17(i) is only two cycles long, thus, the second concatenation operator&lt;br /&gt;
(;) did not “eat” a delay. A better way to think of it is that concatenation&lt;br /&gt;
gives you an ordered list of things to happen – some of them may consume&lt;br /&gt;
one cycle, some more, and some no cycles at all.&lt;br /&gt;
&lt;br /&gt;
Further note that fusion requires an overlap of at least one cycle. Thus,&lt;br /&gt;
while the {b[*]} in {b[*] ; c} may match an empty sequence of cycles,&lt;br /&gt;
replacing the concatenation operator with the fusion operator like this: {b[*]: c}&lt;br /&gt;
results in a SERE with at least one assertion of b (otherwise there is&lt;br /&gt;
nothing to overlap with the assertion of c). In both cases, the match may&lt;br /&gt;
consist of a single cycle. The difference is that in the case of {b[*] ; c} the&lt;br /&gt;
single cycle may not include an assertion of b (because there may be zero&lt;br /&gt;
assertions of b preceding c), while in the case of {b[*] : c}, the single cycle&lt;br /&gt;
must include an assertion of b (which overlaps with the assertion of c).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.6 Compound SEREs==&lt;br /&gt;
&lt;br /&gt;
Compound SEREs are SEREs built from other SEREs through operations&lt;br /&gt;
other than concatenation and fusion. The available operators allow you to&lt;br /&gt;
“and” or “or” together two or more SEREs, as well as to express the situation&lt;br /&gt;
where a match of one SERE occurs within a sequence of cycles matched by&lt;br /&gt;
another.&lt;br /&gt;
&lt;br /&gt;
Consider the case that we want to say that signal read complete is as-&lt;br /&gt;
serted on the last data cycle of every read operation, where we have two kinds&lt;br /&gt;
of read operations: a short read consists of an assertion of signal short rd fol-&lt;br /&gt;
lowed by eight not necessarily consecutive assertions of data, and a long read&lt;br /&gt;
consists of an assertion of signal long rd followed by 32 such assertions. We&lt;br /&gt;
could code two separate properties, as shown in Properties 5.18a and 5.18b.&lt;br /&gt;
Alternatively, we could use the SERE “or” operator (|) to “or” the two SEREs&lt;br /&gt;
together, as in Property 5.18c.&lt;br /&gt;
&lt;br /&gt;
The SERE “and” operator comes in two types: length-matching and non-&lt;br /&gt;
length-matching. Both the length-matching (&amp;amp;&amp;amp;) and the non-length-matching&lt;br /&gt;
(&amp;amp;) “and” operators match a sequence of cycles if starting at the current cycle,&lt;br /&gt;
the left-hand side and the right-hand side are matched. The difference is that&lt;br /&gt;
in addition, the length-matching “and” operator requires that the lengths of&lt;br /&gt;
the sequences matched by both the left- and right-hand sides are the same,&lt;br /&gt;
while the non-length-matching operator matches even if they are different. A&lt;br /&gt;
length-matching “and” between SEREs R and S is illustrated in Trace 5.19(i),&lt;br /&gt;
and a non-length-matching “and” between SEREs R and S is illustrated in&lt;br /&gt;
Traces 5.20(i), 5.20(ii) and 5.20(iii).&lt;br /&gt;
&lt;br /&gt;
When a non-length-matching “and” is used on the left-hand side of a con-&lt;br /&gt;
catenation or a fusion, the current cycle of the right-hand side of the concate-&lt;br /&gt;
nation or fusion is determined by the longer of the two subsequences making&lt;br /&gt;
up the non-length-matching “and”. For instance, in the SERE {{{a;b[*5];c}&lt;br /&gt;
&amp;amp; {d[*];e}} ; f}, the current cycle of f is the cycle after the cycle in which&lt;br /&gt;
the longer of the two SEREs {a;b[*5];c} and {d[*];e} completes. This is&lt;br /&gt;
illustrated in Traces 5.21(i) and 5.21(ii). Note that in each of the traces, sig-&lt;br /&gt;
nal f is asserted twice: once after the completion of {a;b[*5];c}, and once&lt;br /&gt;
after the completion of {d[*];e}. However, in each trace, only the assertion&lt;br /&gt;
of signal f that happens after the completion of the longer of the two SEREs&lt;br /&gt;
participates in the “match” of SERE {{{a;b[*5];c} &amp;amp; {d[*];e}} ; f}.&lt;br /&gt;
&lt;br /&gt;
NOTE: A length-matching “and” such as {a;b;c} &amp;amp;&amp;amp; {d} is legal, but&lt;br /&gt;
makes no sense (because there is no sequence which is both 3 cycles long to&lt;br /&gt;
match {a;b;c} and 1 cycle long to match {d}). Many tools will probably issue&lt;br /&gt;
a warning for such a SERE.&lt;br /&gt;
&lt;br /&gt;
As an example of the use of the length-matching “and”, consider the case&lt;br /&gt;
that a read request (assertion of signal read req) that is granted (assertion of&lt;br /&gt;
signal gnt within 5 cycles of the request) should be followed by a data transfer&lt;br /&gt;
(assertion of signal data start followed by some number of consecutive as-&lt;br /&gt;
sertions of data, followed by an assertion of data end), unless it is canceled.&lt;br /&gt;
A cancel is an assertion of signal cancel any time between the assertion of&lt;br /&gt;
read req and the assertion of gnt, inclusive. We can express this using As-&lt;br /&gt;
sertion 5.22a. Assertion 5.22a holds on Trace 5.22(i): the first read request is&lt;br /&gt;
followed by a data transfer, while the second read request is not followed by&lt;br /&gt;
a data transfer, but is not required to be since it is canceled.&lt;br /&gt;
&lt;br /&gt;
In the case of Assertion 5.22a, we needed the length-matching “and”.&lt;br /&gt;
To see why, consider what would have happened had we used the non-&lt;br /&gt;
length-matching “and” as in Assertion 5.22b. In the case of Assertion 5.22b,&lt;br /&gt;
the left-hand side SERE {{read req ; [*0:4] ; gnt} &amp;amp; {cancel[=0]}} is&lt;br /&gt;
matched not only by the sequence of cycles starting at cycle 2 and ending at&lt;br /&gt;
cycle 5, but also by the sequences of cycles starting at cycle 2 and ending at&lt;br /&gt;
any of the cycles 6 through 16. Thus, Assertion 5.22b requires that we see a&lt;br /&gt;
data transfer starting not only at cycle 6, but also at cycles 7, 8, 9, 10 and so&lt;br /&gt;
on. Obviously, this is not what we wanted.&lt;br /&gt;
&lt;br /&gt;
As an example where we want the non-length-matching “and” rather than&lt;br /&gt;
the length-matching “and”, consider the case that signal global print req&lt;br /&gt;
indicates that we should see a print on each of printers 1, 2, and 3 (comple-&lt;br /&gt;
tion of which is indicated by assertions of p1 done, p2 done, and p3 done,&lt;br /&gt;
respectively), and that following completion of the last print job, we should&lt;br /&gt;
see an assertion of signal print success. We can express this as shown in&lt;br /&gt;
Assertion 5.23a. Assertion 5.23a holds on Trace 5.23(i) because following the&lt;br /&gt;
assertion of signal global print req, we see assertions of each of the signals&lt;br /&gt;
p1 done, p2 done and p3 done, the last of which is followed by an assertion&lt;br /&gt;
of print success.&lt;br /&gt;
&lt;br /&gt;
The non-length-matching “and” was needed for Assertion 5.23a. To see&lt;br /&gt;
why, consider what would have happened if we had used the length-matching&lt;br /&gt;
“and”, as in Assertion 5.23b. Assertion 5.23b does not hold on Trace 5.23(i)&lt;br /&gt;
because the use of the length-matching “and” means that p1 done[-&amp;gt;],&lt;br /&gt;
p2 done[-&amp;gt;] and p3 done[-&amp;gt;] must all have the same length, i.e., that&lt;br /&gt;
p1 done, p2 done and p3 done must all be asserted at the same time.&lt;br /&gt;
&lt;br /&gt;
The SERE within operator is useful if you want to describe a situation&lt;br /&gt;
where one SERE occurs within the time frame of another. For instance, sup-&lt;br /&gt;
pose that the normal behavior of the design is to complete a high priority&lt;br /&gt;
request first, even if there is a pending low priority request that started be-&lt;br /&gt;
fore it. However, if signal no nesting is asserted when the low priority re-&lt;br /&gt;
quest is issued, then this is prohibited. In other words, the situation shown&lt;br /&gt;
in Trace 5.24(i) is not allowed. We can describe the prohibited situation as&lt;br /&gt;
shown in Assertion 5.24a. Assertion 5.24a does not hold on Trace 5.24(i)&lt;br /&gt;
because there is a match of {high pri begin ; high pri end[-&amp;gt;]} that is&lt;br /&gt;
entirely enclosed within the match of {(low pri begin &amp;amp;&amp;amp; no nesting) ;&lt;br /&gt;
low pri end[-&amp;gt;]}.&lt;br /&gt;
&lt;br /&gt;
NOTE: If the left and right operands of a within operator are s and t&lt;br /&gt;
respectively, then the within operator is simply a shorthand for a length-&lt;br /&gt;
matching “and” between {[*] ; s ; [*]} and {t}. That is, s within t is&lt;br /&gt;
equivalent to {[*] ; s ; [*]} &amp;amp;&amp;amp; {t}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.7 More about suffix implication==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have seen the suffix implication operators (|-&amp;gt; and |=&amp;gt;)&lt;br /&gt;
used with SEREs on both the left- and the right-hand sides. While the left-&lt;br /&gt;
hand side of a suffix implication operator must be a SERE, the right-hand&lt;br /&gt;
side of a suffix implication operator can be any property. Thus, if we want to&lt;br /&gt;
express the requirement that whenever we have a request that is acknowledged&lt;br /&gt;
(assertion of req followed by an assertion of ack) we should see a grant&lt;br /&gt;
(assertion of signal gnt within three cycles of the acknowledge), we can code&lt;br /&gt;
as in Assertion 5.25a.&lt;br /&gt;
&lt;br /&gt;
This is illustrated in Trace 5.25(i). In the trace, there are three occurrences&lt;br /&gt;
of the SERE {req;ack}. The first is followed by an assertion of ack after two&lt;br /&gt;
cycles, the second after three cycles, and the third after a single cycle. Thus,&lt;br /&gt;
Assertion 5.25a holds on the trace.&lt;br /&gt;
&lt;br /&gt;
Of course, we could have written Assertion 5.25a entirely in SERE style,&lt;br /&gt;
as shown in Assertion 5.25b, or entirely without SEREs, as in Assertion 5.25c.&lt;br /&gt;
Assertions 5.25a, 5.25b and 5.25c are equivalent, thus the issue is purely one&lt;br /&gt;
of style. Some people prefer using only one style, others find a mix of styles,&lt;br /&gt;
depending on the particular property, to be easier to understand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.8 The built-in function ended()==&lt;br /&gt;
&lt;br /&gt;
The built-in function ended() takes a SERE as an argument and returns true&lt;br /&gt;
in any cycle where that SERE has just ended.1 For example, Trace 5.26(i) has&lt;br /&gt;
been annotated with a waveform labeled ended({a ; b[*] ; c}) to show&lt;br /&gt;
the value of the call to ended() at each cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;1 - In previous versions of PSL, the role of the built-in function ended() was played by&lt;br /&gt;
endpoints. Endpoints are no longer a part of the language – use built-in function&lt;br /&gt;
ended() instead.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How is ended() used? Consider that a complete data transfer consists of&lt;br /&gt;
an assertion of signal data start followed by some number of assertions of&lt;br /&gt;
data, followed by an assertion of data end. Consider further that we have a&lt;br /&gt;
signal data transfer complete that should be asserted when a data trans-&lt;br /&gt;
fer is completed, and that we would like to specify the correct behavior of&lt;br /&gt;
this signal. A good start would be Assertion 5.27a. Assertion 5.27a ensures&lt;br /&gt;
that data transfer complete is asserted at the conclusion of every data&lt;br /&gt;
transfer. But what about the other direction? That is, what about ensuring&lt;br /&gt;
that whenever data transfer complete is asserted, a complete data trans-&lt;br /&gt;
fer has indeed concluded? Assertion 5.27a does not ensure this, and thus&lt;br /&gt;
it holds on Trace 5.27(i), even though there are “extraneous” assertions of&lt;br /&gt;
data transfer complete at cycles 6 and 15. We would like an assertion that&lt;br /&gt;
holds on Trace 5.27(ii) but not on 5.27(i).&lt;br /&gt;
&lt;br /&gt;
In order to check the second direction (that there are no extraneous asser-&lt;br /&gt;
tions of data transfer complete) we need to switch the direction of the&lt;br /&gt;
implication: we need to say that if data transfer complete is asserted,&lt;br /&gt;
then we have just seen the conclusion of a complete data transfer. We could&lt;br /&gt;
try Assertion 5.27b. However, that doesn’t work. Assertion 5.27b requires&lt;br /&gt;
that the SERE {data start ; data[*] ; data end} start the same cycle as&lt;br /&gt;
data transfer complete, while we want it to end that cycle.&lt;br /&gt;
&lt;br /&gt;
This is where the built-in function ended() comes in. Using ended(),&lt;br /&gt;
we can code what we want as shown in Assertion 5.27c, which states that&lt;br /&gt;
whenever we see an assertion of data transfer complete, we must have just&lt;br /&gt;
seen the end of SERE {data start ; data[*] ; data end}, and it does not&lt;br /&gt;
hold on Trace 5.27(i).&lt;br /&gt;
&lt;br /&gt;
Note that ended() returns a Boolean value. Since the left-hand side of the&lt;br /&gt;
suffix implication in Assertion 5.27c consists of a single Boolean expression,&lt;br /&gt;
we could have coded Assertion 5.27c equivalently using logical implication as&lt;br /&gt;
shown in Assertion 5.27d.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.9 Overlapping matches of a SERE==&lt;br /&gt;
&lt;br /&gt;
Up until now, we have been concentrating on explaining the meaning of each&lt;br /&gt;
SERE operator, using relatively simple examples. It is now time to introduce&lt;br /&gt;
some more complex examples, in order to emphasize that like LTL style prop-&lt;br /&gt;
erties, interpreting a SERE style property on a trace can involve examining&lt;br /&gt;
overlapping sets of cycles.&lt;br /&gt;
&lt;br /&gt;
Consider Property 5.28a on Traces 5.28(i) and 5.28(ii). There are multiple&lt;br /&gt;
matches of {a ; b[*] ; c} on Trace 5.28(i), one match ending at cycle 2,&lt;br /&gt;
one ending at cycle 3, and one ending at cycle 4. Property 5.28a does not&lt;br /&gt;
hold on Trace 5.28(i), because the matches ending at cycles 2 and 3 do not&lt;br /&gt;
have associated assertions of signal d at cycles 3 and 4. A suffix implication&lt;br /&gt;
requires that for every match of the left-hand side, the right-hand side holds.&lt;br /&gt;
Property 5.28a does hold on Trace 5.28(ii), because signal d is asserted after&lt;br /&gt;
each match of {a ; b[*] ; c}.&lt;br /&gt;
&lt;br /&gt;
Note that although Property 5.28a contains an always operator, the&lt;br /&gt;
always operator is not the source of the overlapping matches in this case.&lt;br /&gt;
Rather, for a single current cycle (cycle 1), there are three separate matches&lt;br /&gt;
of the SERE {a ; b[*] ; c}, each ending at a different cycle.&lt;br /&gt;
&lt;br /&gt;
The overlapping can happen on the right-hand side of a suffix implication&lt;br /&gt;
as well. Consider for example Property 5.29a on Trace 5.29(i). There are three&lt;br /&gt;
matches of {d ; e[*] ; f}, ending at cycles 3, 4, and 5. One match would&lt;br /&gt;
have been enough to satisfy Property 5.29a, because as long as there exists one&lt;br /&gt;
match, {d ; e[*] ; f} holds. The fact that there are in fact three matches&lt;br /&gt;
does not hurt. Thus, Property 5.29a holds on Trace 5.29(i).&lt;br /&gt;
&lt;br /&gt;
We have just explained that we require at least one match of the right-hand&lt;br /&gt;
side for every match of the left-hand side of a suffix implication, and it might&lt;br /&gt;
seem that in so doing, we have introduced something new. Actually, the rule&lt;br /&gt;
could have been deduced from the parallel we have previously drawn between&lt;br /&gt;
a suffix implication and an if-then statement. SERE {a ; b[*] ; c} can be&lt;br /&gt;
understood as an infinite “or” between SEREs {a;c}, {a;b;c}, {a;b;b;c},&lt;br /&gt;
and so on. So Property 5.28a can be understood as “if {a;c} or {a;b;c} or&lt;br /&gt;
{a;b;b;c} or ..., then d”, which clearly should hold only if we see a d every&lt;br /&gt;
time the if-part is matched. And Property 5.29a can be understood as “if c,&lt;br /&gt;
then {d;f} or {d;e;f} or {d;e;e;f} or ...”, which of course should hold as&lt;br /&gt;
long as we have seen at least a single match of the then-part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5.10 How not to use SEREs==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.5.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.7.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.8.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.9.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.10.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.11.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.12.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.13.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.14.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.15.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Psl fig5.16.png]]&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-30T17:55:21Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.5 Operators without weak or strong versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.2а выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; трактуется, как что-то, что может случится в будущем, а утверждение 4.2b не выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; безусловно не трактуется.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.2a выполняется, но 4.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.2: Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ниже мы покажем семейства сильных операторов, в том же порядке, в котором в котором были представлены их слабые аналоги, а также контраст слабых и сильных версий. &lt;br /&gt;
&lt;br /&gt;
=== 4.1 Оператор next!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 4.3а показывает, что когда бы a не утверждался, b должен утвердиться в следующем цикле. Используя сильную версию оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, мы получим утверждение 4.3b, которое дополнительно требует ''be'' a в следующем цикле. Например, пока утверждение 4.3а выполняется на тракте 4.3(i), утверждение 4.3b нет, потому что, даже хотя &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается после первых двух утверждений &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, тракт заканчивается слишком быстро по отношению к третьему утверждению &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.3a выполняется, но 4.3b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.3: слабый next против сильного next &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Вариации на &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сильный оператор &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; связан с его слабой версией &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;, также как сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; связан со своей слабой версией &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Например, утверждение 4.4b не выполняется на тракте 4.4(i), потому что не хватает грантов. Однако, слабая версия, утверждения 4.4а, не выполняется на том же тракте. Оператор &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; следующих циклов необходимы, и оператор &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; вхождений в булево событие &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; необходимы.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.4a выполняется, но 4.4b нет&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.4: Слабый &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вы должны уже сейчас догадываться о значениях операторов &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; выполняется, если существуют минимум ''j'' дополнительных циклов, и его операнд выполняется от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;-ого&amp;lt;/sup&amp;gt;'' включительно. Оператор &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; выполняется, если существует минимум  ''j'' дополнительных циклов, на которых выполняется &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, и второй оператор выполняется на всех, от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', циклах включительно.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его операнд выполняется, как минимум, на одном цикле начиная с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'', включительно. Необязательно должно быть ''j'' циклов, если операнд выполняется на некотором цикле между ''i&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'' и ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Аналогично, оператор &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его второй операнд выполняется, как минимум, на одном вхождении в &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, начиная от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' и заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Например, рассмотрим утверждение 4.5b, которое показывает, что запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) должно быть предопределено (утверждение assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) на одном из следующих четырех грантах, и в дополнение, тракт не должен заканчиваться до того, как не появится соответствующий грант. Утверждение 4.5b не выполняется на тракте 4.5(i), потому что ни одни из трех показанных грантов не предопределен. Тот факт, что четвертый грант отсутствует неважен, не существует вариантов для четвертого гранта, которые могут изменить наше представление об предопределенности первого, второго и третьего грантов.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабая версия утверждения 4.5b выполняется на двух трактах 4.5(i) и Trace 4.5(ii). Существует только один вариант повлиять над слабой версией, показанной в утверждении 4.5a - если бы были четыре гранта, и не один из не был предопределен.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.5: Слабый &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Операторы until и until!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы видели утверждения подобные утверждению 4.6a, который показывает, что когда бы не утверждался &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, далее, начиная со следующего цикла, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утвердиться до утверждения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Например, утверждения 4.6a выполняется в тракте 4.6(i). Но, что касается тракта, подробного Trace 4.6(ii), где &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; никогда не появляется? Выполняется утверждение 4.6a на тракте 4.6(ii) или нет? Оно выполняется. Суть в том, что оператор &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; - слабый оператор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если мы хотим выразить требования утверждения 4.6a, но в дополнение присутствует &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, мы должны использовать сильный оператор. Утверждение 4.6b, которое использует сильный оператор, не выполняется в тракте 4.6(ii).  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; сильная версия оператора &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; выполняется только, если его левый операнд остается утвержденным до конца, ''включая'' цикл, где его правый операнд утвержден, и в дополнение его правый операнд выполняется в конечном итоге.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Сильный until против слабого until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4 операторы &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Акцент, сильной версии оператора &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt;, заключается в его лева-направленности операндов. Например, утверждения 4.7a показывает, что следуя утверждению &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; необходимо, чтобы &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждался до этого, но будучи слабым выполняется не только в тракте 4.7(ii), но также на тракте 4.7(i), в котором после второго запроса ни грант, ни третий запрос не появляются. Сильная версия, показанная в утверждение 4.7b, требует появления гранта, но не обязательно, что был другой запрос. Таким образом, утверждения 4.7b не выполняется на тракте 4.7(i), но выполняется на 4.7(ii).  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Слабый before против сильного before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; сильная версия оператора &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.8a выполняется на тракте 4.8(i), в котором первый запрос (утверждение сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) предоставляется (утверждением сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;), но не второй. Сильная версия утверждения 4.8a, показанная в утверждении 4.8b, не выполняется на тракте Trace 4.8(i), потому что второй запрос не предоставляется. Оба утверждения 4.8а и 4.8b выполняются на тракте 4.8(ii).  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Слабый &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Операторы без слабых или сильных версий ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы видели слабые и сильные версии многих операторов. Оператор &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; не является сильной версий какого-либо оператора. Другими словами, не существует слабой версии &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. Смысл в том, что значение другого сильного оператора может быть широко описано, как требование того, чтобы ничего непредвиденного не должно случиться пока не появится условие прекращения, и в дополнении, в конечном счете условие окончание должно выполниться. Слабая версия далее отказывает требованию, что условие окончание выполнено, оставляя только требование, что ничего не предвиденного не произошло. Оператор &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, однако, не содержит идею “чего-либо” непредвиденного, только условия окончания. Более того, не существует вариантов ослабления оператора, без освобождения его значения. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Так как нету слабой версии оператора &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, нету сильной версии операторов &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, для противоположного смысла. В случаи &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, не существует условия окончания.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-30T17:39:01Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.4 The before! and before!_ operators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.2а выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; трактуется, как что-то, что может случится в будущем, а утверждение 4.2b не выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; безусловно не трактуется.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.2a выполняется, но 4.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.2: Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ниже мы покажем семейства сильных операторов, в том же порядке, в котором в котором были представлены их слабые аналоги, а также контраст слабых и сильных версий. &lt;br /&gt;
&lt;br /&gt;
=== 4.1 Оператор next!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 4.3а показывает, что когда бы a не утверждался, b должен утвердиться в следующем цикле. Используя сильную версию оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, мы получим утверждение 4.3b, которое дополнительно требует ''be'' a в следующем цикле. Например, пока утверждение 4.3а выполняется на тракте 4.3(i), утверждение 4.3b нет, потому что, даже хотя &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается после первых двух утверждений &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, тракт заканчивается слишком быстро по отношению к третьему утверждению &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.3a выполняется, но 4.3b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.3: слабый next против сильного next &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Вариации на &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сильный оператор &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; связан с его слабой версией &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;, также как сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; связан со своей слабой версией &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Например, утверждение 4.4b не выполняется на тракте 4.4(i), потому что не хватает грантов. Однако, слабая версия, утверждения 4.4а, не выполняется на том же тракте. Оператор &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; следующих циклов необходимы, и оператор &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; вхождений в булево событие &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; необходимы.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.4a выполняется, но 4.4b нет&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.4: Слабый &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вы должны уже сейчас догадываться о значениях операторов &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; выполняется, если существуют минимум ''j'' дополнительных циклов, и его операнд выполняется от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;-ого&amp;lt;/sup&amp;gt;'' включительно. Оператор &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; выполняется, если существует минимум  ''j'' дополнительных циклов, на которых выполняется &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, и второй оператор выполняется на всех, от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', циклах включительно.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его операнд выполняется, как минимум, на одном цикле начиная с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'', включительно. Необязательно должно быть ''j'' циклов, если операнд выполняется на некотором цикле между ''i&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'' и ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Аналогично, оператор &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его второй операнд выполняется, как минимум, на одном вхождении в &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, начиная от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' и заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Например, рассмотрим утверждение 4.5b, которое показывает, что запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) должно быть предопределено (утверждение assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) на одном из следующих четырех грантах, и в дополнение, тракт не должен заканчиваться до того, как не появится соответствующий грант. Утверждение 4.5b не выполняется на тракте 4.5(i), потому что ни одни из трех показанных грантов не предопределен. Тот факт, что четвертый грант отсутствует неважен, не существует вариантов для четвертого гранта, которые могут изменить наше представление об предопределенности первого, второго и третьего грантов.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабая версия утверждения 4.5b выполняется на двух трактах 4.5(i) и Trace 4.5(ii). Существует только один вариант повлиять над слабой версией, показанной в утверждении 4.5a - если бы были четыре гранта, и не один из не был предопределен.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.5: Слабый &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Операторы until и until!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы видели утверждения подобные утверждению 4.6a, который показывает, что когда бы не утверждался &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, далее, начиная со следующего цикла, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утвердиться до утверждения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Например, утверждения 4.6a выполняется в тракте 4.6(i). Но, что касается тракта, подробного Trace 4.6(ii), где &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; никогда не появляется? Выполняется утверждение 4.6a на тракте 4.6(ii) или нет? Оно выполняется. Суть в том, что оператор &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; - слабый оператор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если мы хотим выразить требования утверждения 4.6a, но в дополнение присутствует &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, мы должны использовать сильный оператор. Утверждение 4.6b, которое использует сильный оператор, не выполняется в тракте 4.6(ii).  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; сильная версия оператора &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; выполняется только, если его левый операнд остается утвержденным до конца, ''включая'' цикл, где его правый операнд утвержден, и в дополнение его правый операнд выполняется в конечном итоге.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Сильный until против слабого until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4 операторы &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Акцент, сильной версии оператора &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt;, заключается в его лева-направленности операндов. Например, утверждения 4.7a показывает, что следуя утверждению &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; необходимо, чтобы &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждался до этого, но будучи слабым выполняется не только в тракте 4.7(ii), но также на тракте 4.7(i), в котором после второго запроса ни грант, ни третий запрос не появляются. Сильная версия, показанная в утверждение 4.7b, требует появления гранта, но не обязательно, что был другой запрос. Таким образом, утверждения 4.7b не выполняется на тракте 4.7(i), но выполняется на 4.7(ii).  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Слабый before против сильного before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; сильная версия оператора &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.8a выполняется на тракте 4.8(i), в котором первый запрос (утверждение сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) предоставляется (утверждением сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;), но не второй. Сильная версия утверждения 4.8a, показанная в утверждении 4.8b, не выполняется на тракте Trace 4.8(i), потому что второй запрос не предоставляется. Оба утверждения 4.8а и 4.8b выполняются на тракте 4.8(ii).  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Слабый &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-30T17:18:18Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.3 The until! and until! operators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.2а выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; трактуется, как что-то, что может случится в будущем, а утверждение 4.2b не выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; безусловно не трактуется.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.2a выполняется, но 4.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.2: Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ниже мы покажем семейства сильных операторов, в том же порядке, в котором в котором были представлены их слабые аналоги, а также контраст слабых и сильных версий. &lt;br /&gt;
&lt;br /&gt;
=== 4.1 Оператор next!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 4.3а показывает, что когда бы a не утверждался, b должен утвердиться в следующем цикле. Используя сильную версию оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, мы получим утверждение 4.3b, которое дополнительно требует ''be'' a в следующем цикле. Например, пока утверждение 4.3а выполняется на тракте 4.3(i), утверждение 4.3b нет, потому что, даже хотя &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается после первых двух утверждений &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, тракт заканчивается слишком быстро по отношению к третьему утверждению &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.3a выполняется, но 4.3b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.3: слабый next против сильного next &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Вариации на &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сильный оператор &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; связан с его слабой версией &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;, также как сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; связан со своей слабой версией &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Например, утверждение 4.4b не выполняется на тракте 4.4(i), потому что не хватает грантов. Однако, слабая версия, утверждения 4.4а, не выполняется на том же тракте. Оператор &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; следующих циклов необходимы, и оператор &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; вхождений в булево событие &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; необходимы.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.4a выполняется, но 4.4b нет&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.4: Слабый &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вы должны уже сейчас догадываться о значениях операторов &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; выполняется, если существуют минимум ''j'' дополнительных циклов, и его операнд выполняется от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;-ого&amp;lt;/sup&amp;gt;'' включительно. Оператор &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; выполняется, если существует минимум  ''j'' дополнительных циклов, на которых выполняется &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, и второй оператор выполняется на всех, от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', циклах включительно.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его операнд выполняется, как минимум, на одном цикле начиная с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'', включительно. Необязательно должно быть ''j'' циклов, если операнд выполняется на некотором цикле между ''i&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'' и ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Аналогично, оператор &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его второй операнд выполняется, как минимум, на одном вхождении в &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, начиная от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' и заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Например, рассмотрим утверждение 4.5b, которое показывает, что запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) должно быть предопределено (утверждение assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) на одном из следующих четырех грантах, и в дополнение, тракт не должен заканчиваться до того, как не появится соответствующий грант. Утверждение 4.5b не выполняется на тракте 4.5(i), потому что ни одни из трех показанных грантов не предопределен. Тот факт, что четвертый грант отсутствует неважен, не существует вариантов для четвертого гранта, которые могут изменить наше представление об предопределенности первого, второго и третьего грантов.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабая версия утверждения 4.5b выполняется на двух трактах 4.5(i) и Trace 4.5(ii). Существует только один вариант повлиять над слабой версией, показанной в утверждении 4.5a - если бы были четыре гранта, и не один из не был предопределен.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.5: Слабый &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Операторы until и until!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы видели утверждения подобные утверждению 4.6a, который показывает, что когда бы не утверждался &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, далее, начиная со следующего цикла, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утвердиться до утверждения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Например, утверждения 4.6a выполняется в тракте 4.6(i). Но, что касается тракта, подробного Trace 4.6(ii), где &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; никогда не появляется? Выполняется утверждение 4.6a на тракте 4.6(ii) или нет? Оно выполняется. Суть в том, что оператор &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; - слабый оператор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если мы хотим выразить требования утверждения 4.6a, но в дополнение присутствует &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, мы должны использовать сильный оператор. Утверждение 4.6b, которое использует сильный оператор, не выполняется в тракте 4.6(ii).  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; сильная версия оператора &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; выполняется только, если его левый операнд остается утвержденным до конца, ''включая'' цикл, где его правый операнд утвержден, и в дополнение его правый операнд выполняется в конечном итоге.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Сильный until против слабого until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4 The &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Weak vs. strong before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Weak vs. strong &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-30T16:52:47Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.2 Вариации на next!, включая next_event! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.2а выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; трактуется, как что-то, что может случится в будущем, а утверждение 4.2b не выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; безусловно не трактуется.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.2a выполняется, но 4.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.2: Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ниже мы покажем семейства сильных операторов, в том же порядке, в котором в котором были представлены их слабые аналоги, а также контраст слабых и сильных версий. &lt;br /&gt;
&lt;br /&gt;
=== 4.1 Оператор next!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 4.3а показывает, что когда бы a не утверждался, b должен утвердиться в следующем цикле. Используя сильную версию оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, мы получим утверждение 4.3b, которое дополнительно требует ''be'' a в следующем цикле. Например, пока утверждение 4.3а выполняется на тракте 4.3(i), утверждение 4.3b нет, потому что, даже хотя &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается после первых двух утверждений &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, тракт заканчивается слишком быстро по отношению к третьему утверждению &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.3a выполняется, но 4.3b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.3: слабый next против сильного next &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Вариации на &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сильный оператор &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; связан с его слабой версией &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;, также как сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; связан со своей слабой версией &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Например, утверждение 4.4b не выполняется на тракте 4.4(i), потому что не хватает грантов. Однако, слабая версия, утверждения 4.4а, не выполняется на том же тракте. Оператор &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; следующих циклов необходимы, и оператор &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; вхождений в булево событие &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; необходимы.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.4a выполняется, но 4.4b нет&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.4: Слабый &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вы должны уже сейчас догадываться о значениях операторов &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; выполняется, если существуют минимум ''j'' дополнительных циклов, и его операнд выполняется от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;-ого&amp;lt;/sup&amp;gt;'' включительно. Оператор &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; выполняется, если существует минимум  ''j'' дополнительных циклов, на которых выполняется &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, и второй оператор выполняется на всех, от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', циклах включительно.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его операнд выполняется, как минимум, на одном цикле начиная с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'', включительно. Необязательно должно быть ''j'' циклов, если операнд выполняется на некотором цикле между ''i&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;'' и ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Аналогично, оператор &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; создает свойство, которое выполняется, если его второй операнд выполняется, как минимум, на одном вхождении в &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, начиная от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' и заканчивая ''j&amp;lt;sup&amp;gt;-ым&amp;lt;/sup&amp;gt;''. Например, рассмотрим утверждение 4.5b, которое показывает, что запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) должно быть предопределено (утверждение assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) на одном из следующих четырех грантах, и в дополнение, тракт не должен заканчиваться до того, как не появится соответствующий грант. Утверждение 4.5b не выполняется на тракте 4.5(i), потому что ни одни из трех показанных грантов не предопределен. Тот факт, что четвертый грант отсутствует неважен, не существует вариантов для четвертого гранта, которые могут изменить наше представление об предопределенности первого, второго и третьего грантов.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабая версия утверждения 4.5b выполняется на двух трактах 4.5(i) и Trace 4.5(ii). Существует только один вариант повлиять над слабой версией, показанной в утверждении 4.5a - если бы были четыре гранта, и не один из не был предопределен.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.5: Слабый &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.3 The until! and until! operators ===&lt;br /&gt;
&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Weak vs. strong until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 The &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Weak vs. strong before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Weak vs. strong &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-29T16:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Слабые временные операторы против сильных временных операторов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Таким образом, утверждение 4.2а выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; трактуется, как что-то, что может случится в будущем, а утверждение 4.2b не выполняется на тракте 4.2(i), потому что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; безусловно не трактуется.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.2a выполняется, но 4.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.2: Слабый временной оператор податливый, даже при &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
а сильный временной оператор строгий, даже при &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ниже мы покажем семейства сильных операторов, в том же порядке, в котором в котором были представлены их слабые аналоги, а также контраст слабых и сильных версий. &lt;br /&gt;
&lt;br /&gt;
=== 4.1 Оператор next!  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 4.3а показывает, что когда бы a не утверждался, b должен утвердиться в следующем цикле. Используя сильную версию оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, мы получим утверждение 4.3b, которое дополнительно требует ''be'' a в следующем цикле. Например, пока утверждение 4.3а выполняется на тракте 4.3(i), утверждение 4.3b нет, потому что, даже хотя &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается после первых двух утверждений &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, тракт заканчивается слишком быстро по отношению к третьему утверждению &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.3a выполняется, но 4.3b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.3: слабый next против сильного next &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Вариации на &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сильный оператор &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; связан с его слабой версией &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;, также как сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; связан со своей слабой версией &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Например, утверждение 4.4b не выполняется на тракте 4.4(i), потому что не хватает грантов. Однако, слабая версия, утверждения 4.4а, не выполняется на том же тракте. Оператор &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; следующих циклов необходимы, и оператор &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; позволяет вам показать, что как минимум &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; вхождений в булево событие &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; необходимы.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 4.4a выполняется, но 4.4b нет&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.4: Слабый &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; против сильного &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Вы должны уже сейчас догадываться о значениях операторов &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt;. Оператор &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; выполняется, если существуют минимум ''j'' дополнительных циклов, и его операнд выполняется от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;-ого&amp;lt;/sup&amp;gt;'' включительно. Оператор &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; выполняется, если существует минимум  ''j'' дополнительных циклов, на которых выполняется &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, и второй оператор выполняется на всех, от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' до ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', циклах включительно.     &lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.5: Weak vs. strong &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 The until! and until! operators ===&lt;br /&gt;
&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Weak vs. strong until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 The &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Weak vs. strong before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Weak vs. strong &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-29T15:14:25Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Слабые временные операторы против сильных временных операторов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - В этой главе мы рассмотрим конечные пути, т.к. как они выглядят с точки зрения моделирования. Для бесконечных путях, т.к. они представлены в формальной верификации, также существует разница между слабыми и сильными операторами. Это мы обсудим в главе 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Слабы временной оператор податливый - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее слабый оператор, будет выполнятся до тех пор, пока что-нибудь не пойдет ни так. Если бы мы продолжили ход верификации в тракте 4.1(i) еще на несколько циклов, мы могли бы обнаружить, что сигнал b утверждается в цикле 12. Такое ''может'' случится. Таким образом, утверждение 4.1а, которое использует слабый оператор next, выполняется в тракте 4.1(i).   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сильный оператор строгий - в случаи, когда тракт заканчивается “слишком быстро”, свойство, использующее сильный оператор, не будет выполняться, даже если ничего плохого не происходит. Не существует пути узнать, что бы случилось, если бы мы продолжили ход верификации, показанный в тракте 4.1(i), еще несколько циклов, и мы не можем сказать, что свойство выполняется, не имея всей информации. Таким образом, утверждение 4.1b, которое использует сильный оператор &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt;, не выполняется на тракте 4.1(i).    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 4.1a выполняется, but 4.1b не выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 4.1: Тракт иллюстрирует идею слабого и сильного оператора&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertion 4.2a holds, but 4.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.2: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
and a strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.1 The next! operator ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 4.3a holds, but 4.3b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.3: Weak vs. strong next&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Variations on &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; including &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 4.4a holds, but 4.4b does not&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.4: Weak vs. strong &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.5: Weak vs. strong &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 The until! and until! operators ===&lt;br /&gt;
&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Weak vs. strong until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 The &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Weak vs. strong before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Weak vs. strong &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators</id>
		<title>PSL/A Practical Introduction to PSL/Weak vs. Strong Temporal Operators</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Weak_vs._Strong_Temporal_Operators"/>
				<updated>2013-12-24T17:42:35Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Weak vs. Strong Temporal Operators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== Слабые временные операторы против сильных временных операторов ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Temporal operators can be ''weak'' or ''strong''. A strong temporal operator such as&lt;br /&gt;
&amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; is indicated by an exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) as part of its name. An&lt;br /&gt;
operator without an exclamation point, such as &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, is weak. Up until now&lt;br /&gt;
we have seen only one version of each operator, but many of the operators we&lt;br /&gt;
have seen previously come in both weak and strong versions. The difference&lt;br /&gt;
between weak and strong operators is important when the path is “too short”&lt;br /&gt;
to determine whether or not everything that needs to happen to satisfy a&lt;br /&gt;
property has indeed happened.&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; For instance, consider the specification “every&lt;br /&gt;
assertion of signal a must be followed three cycles later by an assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;”, on Trace 4.1(i). Does the specification hold or not? The assertion of signal&lt;br /&gt;
a at cycle 2 is satisfied by the assertion of signal b at cycle 5. But what about&lt;br /&gt;
the assertion of signal a at cycle 9? It requires an assertion of signal b at cycle&lt;br /&gt;
12, but the trace ends before cycle 12 is reached. Weak and strong temporal&lt;br /&gt;
operators allow us to distinguish between the case where we would like to say&lt;br /&gt;
that our specification holds on Trace 4.1(i), and the case where we would like&lt;br /&gt;
to say that it does not.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временные операторы могут быть ''слабыми'' или ''сильными''. Сильны временной оператор, такой как &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показан восклицательным знаком, как частью своего имени. Оператор без восклицательного , такой как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, слабый. До этого времени мы видели только по одной версии каждого оператора, но много операторов, которых мы видели до того, могут иметь слабую и сильную версии. Различие между слабыми и сильными операторами очень важны, когда путь “слишком короткий”, чтобы определить, действительно все ли произошло для удовлетворения свойства. &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;  Например, рассматривая спецификацию “каждое утверждения сигнала a должно происходить на три цикла раньше утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;” на тракте 4.1(i). Выполняется спецификация или нет? Утверждение сигнала a в цикле 2 удовлетворяется утверждением сигнала b на цикле 5. Но, что можно сказать про утверждение сигнала a на цикле 9? Это предполагает утверждение сигнала b на цикле 12, но тракт заканчивает до достижения 12-го цикла. Слабые и сильные временные операторы позволяют нам различать случаи, в которых мы можем сказать,что наша спецификация выполняется на тракте 4.1(i), и в которых мы можем сказать, что она не выполняется.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;blockquote&amp;gt;1 - In this chapter we assume finite paths such as those seen in simulation. On infinite&lt;br /&gt;
paths, such as those seen in formal verification, there is also a difference between&lt;br /&gt;
weak and strong operators. We discuss this issue in Chapter 11.&amp;lt;/blockquote&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A weak temporal operator is lenient – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a weak temporal operator will hold as long as nothing&lt;br /&gt;
else has gone wrong. If we were to continue the verification run shown in&lt;br /&gt;
Trace 4.1(i) for a few more cycles, we might find out that signal b is asserted&lt;br /&gt;
in cycle 12. It ''could'' happen. Thus, Assertion 4.1a, which uses the weak next&lt;br /&gt;
operator, holds on Trace 4.1(i).&lt;br /&gt;
&lt;br /&gt;
A strong temporal operator is strict – in the case that a trace ends “too&lt;br /&gt;
soon”, a property using a strong operator will not hold, even if nothing else&lt;br /&gt;
has gone wrong. There is no way to know what will happen if we continue the&lt;br /&gt;
verification run shown in Trace 4.1(i) for a few more cycles, and we shouldn’t&lt;br /&gt;
say that a property holds without having all the information. Thus, Assertion 4.1b, which uses the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator, does not hold on Trace 4.1(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertion 4.1a holds, but 4.1b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (b));             (4.1a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (b));            (4.1b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.1: A trace illustrating the idea behind weak and strong operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Info|NOTE: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;, and a&lt;br /&gt;
strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;. Thus, Assertion 4.2a&lt;br /&gt;
holds on Trace 4.2(i) because &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; is treated as something that could happen in the future, and Assertion 4.2b does not hold on Trace 4.2(i) because &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; is not treated as a sure thing.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertion 4.2a holds, but 4.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next[3] (‘false));                (4.2a)&lt;br /&gt;
assert always(a -&amp;gt; next![3] (‘true));                (4.2b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.2: A weak temporal operator is lenient even about &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;,  &amp;lt;br /&amp;gt;&lt;br /&gt;
and a strong temporal operator is strict even about &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below we present the families of strong operators, in the same order in&lt;br /&gt;
which their weak cousins were presented, and contrast the weak and strong&lt;br /&gt;
versions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.1 The next! operator ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assertion 4.3a states that whenever a holds, then b should hold in the next&lt;br /&gt;
cycle. Using the strong version of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator, we get Assertion 4.3b&lt;br /&gt;
which requires that in addition, there ''be'' a next cycle. For example, while&lt;br /&gt;
Assertion 4.3a holds on Trace 4.3(i), Assertion 4.3b does not, because even&lt;br /&gt;
though &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted after the first two assertions of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, the trace ends too soon&lt;br /&gt;
with regards to the third assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 4.3a holds, but 4.3b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);             (4.3a)&lt;br /&gt;
assert always (a -&amp;gt; next! b);            (4.3b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.3: Weak vs. strong next&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Variations on &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; including &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The strong &amp;lt;code&amp;gt;next_event!&amp;lt;/code&amp;gt; operator is related to its weak version &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; in&lt;br /&gt;
the same way that the strong &amp;lt;code&amp;gt;next!&amp;lt;/code&amp;gt; operator is related to &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
Assertion 4.4b does not hold on Trace 4.4(i), because there are not enough&lt;br /&gt;
grants. However, the weak version, Assertion 4.4a, does hold on the same&lt;br /&gt;
trace.&lt;br /&gt;
The &amp;lt;code&amp;gt;next![n]&amp;lt;/code&amp;gt; operator allows you to indicate that at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; next cycles&lt;br /&gt;
are needed, and the &amp;lt;code&amp;gt;next_event!(b)[n]&amp;lt;/code&amp;gt; operator allows you to indicate that&lt;br /&gt;
at least &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; occurrences of the Boolean event &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 4.4a holds, but 4.4b does not&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event(gnt)(high_pri_ack));    (4.4a)&lt;br /&gt;
assert always (high_pri_req -&amp;gt;&lt;br /&gt;
    next_event!(gnt)(high_pri_ack));   (4.4b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.4: Weak vs. strong &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should by now be able to guess the meaning of the &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
and &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;next_a![i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles, and its operand holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive. The &amp;lt;code&amp;gt;next_event_a!(b)[i:j]&amp;lt;/code&amp;gt; operator holds if&lt;br /&gt;
there are at least ''j'' additional cycles on which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds, and the second operand&lt;br /&gt;
holds on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' of them, inclusive.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_e![i:j]&amp;lt;/code&amp;gt; operator creates a property that holds if its operand&lt;br /&gt;
holds on at least one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycles, inclusive. There&lt;br /&gt;
do not have to be ''j'' cycles if the operand holds on some cycle between the&lt;br /&gt;
ith and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. Similarly, the &amp;lt;code&amp;gt;next_event_e!(b)[i:j]&amp;lt;/code&amp;gt; operator&lt;br /&gt;
creates a property that holds if its second operand holds on at least one of&lt;br /&gt;
the ith through ''j'' th next occurrences of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, inclusive. There do not have to be&lt;br /&gt;
''j'' occurrences if the second operand holds on some occurrence between the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''&lt;br /&gt;
and the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'', inclusive. For example, consider Assertion 4.5b, which states that&lt;br /&gt;
a request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be acknowledged (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;) on one of&lt;br /&gt;
the next four grants, and that in addition, the trace must not end before there&lt;br /&gt;
is an appropriate grant. Assertion 4.5b does not hold on Trace 4.5(i) because&lt;br /&gt;
none of the three grants shown is acknowledged. However, it does hold on&lt;br /&gt;
Trace 4.5(ii) because at least one of the first, second, third or fourth grants&lt;br /&gt;
is acknowledged. The fact that the fourth grant does not occur is immaterial&lt;br /&gt;
– there is no way for a fourth grant to change the fact that we know for sure&lt;br /&gt;
that one of the first, second, third or fourth grants is acknowledged.&lt;br /&gt;
&lt;br /&gt;
The weak version of Assertion 4.5b holds on both Trace 4.5(i) and&lt;br /&gt;
Trace 4.5(ii). The only way to violate the weak version shown in Assertion 4.5a&lt;br /&gt;
is for there to be four grants, none of which are acknowledged.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next_event_e(gnt)[1:4](ack));     (4.5a)&lt;br /&gt;
assert always (req -&amp;gt; next_event_e!(gnt)[1:4](ack));    (4.5b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.5: Weak vs. strong &amp;lt;code&amp;gt;next_event_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 The until! and until! operators ===&lt;br /&gt;
&lt;br /&gt;
We have previously seen assertions like Assertion 4.6a, which states that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then starting the next cycle &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; should be asserted until &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted. For example, Assertion 4.6a holds on Trace 4.6(i). But what about&lt;br /&gt;
a trace like that shown in Trace 4.6(ii), where &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; never arrives? Does Assertion 4.6a hold on Trace 4.6(ii) or not? It does. The reason is that the &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is a weak operator.&lt;br /&gt;
&lt;br /&gt;
If we want to express the requirement of Assertion 4.6a, but in addition&lt;br /&gt;
insist that &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; eventually occur, we need to use a strong operator. Assertion 4.6b,&lt;br /&gt;
which uses a strong operator, does not hold on Trace 4.6(ii).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operator. The&lt;br /&gt;
&amp;lt;code&amp;gt;until!_&amp;lt;/code&amp;gt; operator holds only if its left operand stays asserted up to and ''including'' &lt;br /&gt;
the cycle where its right operand is asserted, and in addition its right&lt;br /&gt;
operand eventually holds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.6.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always(a -&amp;gt; next (b until c));      (4.6a)&lt;br /&gt;
assert always(a -&amp;gt; next (b until! c));     (4.6b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.6: Weak vs. strong until&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 The &amp;lt;code&amp;gt;before!&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
The emphasis of the strong versions of the &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators is on their lefthand operand. For example, Assertion 4.7a states that following an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, an assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; is required before &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; can be asserted again, but&lt;br /&gt;
being weak holds not only on Trace 4.7(ii), but also on Trace 4.7(i), in which&lt;br /&gt;
after the second request neither a grant nor a third request ever arrives. The&lt;br /&gt;
strong version, shown in Assertion 4.7b, requires that a grant eventually be&lt;br /&gt;
given, but not necessarily that another request be seen. Thus, Assertion 4.7b&lt;br /&gt;
does not hold on Trace 4.7(i), but holds on Trace 4.7(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.7.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before req));       (4.7a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before! req));      (4.7b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.7: Weak vs. strong before&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before!_&amp;lt;/code&amp;gt; operator is the strong version of the &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operator. Thus,&lt;br /&gt;
Assertion 4.8a holds on Trace 4.8(i), in which the first request (assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) is granted (assertion of signal &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) but the second is not. The&lt;br /&gt;
strong version of Assertion 4.8a, shown in Assertion 4.8b, does not hold on&lt;br /&gt;
Trace 4.8(i) because the second request is not granted. Both Assertion 4.8a&lt;br /&gt;
and 4.8b hold on Trace 4.8(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig4.8.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before_ req));     (4.8a)&lt;br /&gt;
assert always (req -&amp;gt; next (gnt before!_ req));    (4.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 4.8: Weak vs. strong &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.5 Operators without weak or strong versions ===&lt;br /&gt;
&lt;br /&gt;
We have seen weak and strong versions of many operators. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;&lt;br /&gt;
operator is not a strong version of some other operator. In other words, there&lt;br /&gt;
is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;. The reason is that the meaning of other&lt;br /&gt;
strong operators can be broadly described as requiring that nothing bad must&lt;br /&gt;
happen up until some terminating condition, and in addition, the terminating condition must eventually occur. The weak versions then waive the requirement that the terminating condition eventually occur, leaving only the requirement that nothing bad must happen. The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator, however, contains no idea of a bad “something”, only a terminating condition.&lt;br /&gt;
Therefore, there is no way to weaken it without emptying it completely of&lt;br /&gt;
meaning.&lt;br /&gt;
&lt;br /&gt;
Just as there is no weak version of &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;, there is no strong version&lt;br /&gt;
of the operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, for the opposite reason. In the case of&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, there is no terminating condition to waive.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-24T17:24:05Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL — это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значение; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Директивы PSL нуждаются в спецификации времени, которая определяется, когда временное выражение рассчитано. Мы можем включить выражение времени в директиву. Однако, в то время, как такое же время подходит для всех директив проекта, проще включить декларацию времени по-умолчанию. Если мы напишем деклрацию времени по-умолчанию в области проекта, это подойдет для любых директив PSL, написанных в данном регионе. Наибольшее, мы можем включить одну декларацию времени по-умолчанию в данную область.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''ПРИМЕР 18.8''' ''Конвейерный связанные утверждения''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В своей книге ''Assertion-Based Design'' [7], Foster ''et al''. описывает образец верификации для системы, в которой конвейерная связность. В этом примере, система может принимать до 16 запросов, при подтверждении любого из них. Система считает количество запросов, их подтверждение, и включает утверждение, что для каждого запроса с данным подсчетом запросов, существует подтверждение с таким же счетом в течение 100 временных циклов. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
Счетчики запросов и подтверждения выполняются, используя сигналы &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; и процесс &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. Мы декларируем свойство &amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt;, которое выражает условие верификации для проекта. Мы, также, включаем декларацию времени по-умолчанию для архитектуры. Это подходит для утверждения директив, которые мы писали в области деклараций архитектуры, утверждая, что условие верификации выполняется.   &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Существует один случай, где встроенный в VHDL PSL может привести к двусмысленности. И PSL, и VHDL включают в себя выражения утверждений, но их смысл разный. Если мы напишем выражение вида:&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
оно может быть интерпретирована, как регулярное параллельное выражение VHDL утверждения, которое проверяется, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; меняют значение. Также, оно может быть интерпретировано, как директива утверждения PSL, которая предполагает свойство &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt;, выполняющееся во времени 0. В интересах совместимости с более ранними версиями языка, VHDL интерпретирует такие двусмысленные выражения, как регулярные параллельные выражения VHDL утверждений. Если мы действительно хотим написать директиву PSL утверждения такого вида, мы можем модифицировать свойство, таким образом получить однозначное PSL свойство, например:       &lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В PSL код верификации может быть написан в блоках верификации (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; блоки), которые связаны с экземплярами entity и архитектур VHDL. VHDL применяет такие блоки верификации, как первичные блоки проекта. Таким образом, они могут быть декларированы в файлах VHDL проекта и проанализированы в библиотеках VHDL проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Блок верификации может включать в себя обязательную информацию, которая определяет компонент образца, для которого применяется директива. Также, мы можем связать блок верификации, как часть конфигураций проекта. Единственное место, для того чтобы сделать это - декларация конфигураций, представленных в главе 13. Если мы хотим связать один и более блоков верификации к головному entity в декларации конфигураций, мы подключаем связывающую информацию, в соответствии со следующим синтаксическим правилом:  &lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Всякий раз, когда в декларации конфигурации экземпляра, либо в головном уровне иерархии проекта или как экземпляра компонента в более большом проекте, названные блоки верификации интерпретируются в контексте entity  и архитектуры. Это означает, что имена, используемые в блоках верификации интерпретируются в контексте entity.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Пример 18.9''' ''Связанный блок верификации в декларации конфигураций''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
предположим, что у нас есть блок верификации, который обеспечивает два выхода Q и Q_n, которые дополняют друг друга при переднем фронте сигнала clk. Блок верификации:&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем связать этот блок верификации с различными частями проекта. Например, модель gatelevel триггера D может быть описана так: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Декларация конфигураций для триггера D может связать блок верификации с головным entity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Далее мы можем подтвердить конфигурации в проекте и для каждого экземпляра, блок верификации &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; будет связан с экземпляром entity и архитектуры. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы, также, можем связать блок верификации с экземплярами компонентов, которые конфигурируются покомпонентной конфигурацией, вложенной в декларацию конфигураций. Полная форма конфигурации компонента предполагает компоненты, связанные с entity и архитектурой, и архитектура дополнительно конфигурируется:      &lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этом случаи, блоки верификации связаны с экземплярами определенными в декларации компонентов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Пример 18.10''' ''Связанный блок верификации в конфигурации компонента''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предположим, мы создаем регистр сдвига parallel-in/serial-out внутри RTL описания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем написать декларацию конфигураций, которая свяжет entity и архитектуру с экземпляром компонента, а также свяжет блок complementary_outputs верификации, Пример 18.9. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этом случаи, утверждение в блоке верификации применяется для выходов Q и Q_n регистра сдвига связанного entity с сериализатором экземпляра компонента.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Третье место, в котором мы можем применить блок верификации в VHDL проекте, это в спецификации конфигураций в архитектуре, где подтверждаются компоненты. Дополненное правило синтаксиса для спецификации конфигураций, снова предполагает связь компонентов с entity и архитектурой:   &lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это похоже на форму конфигурации компонентов, но без вложенных конфигураций для архитектуры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Пример 18.11''' ''Использование блока верификации в спецификации конфигураций''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем пересмотреть архитектуру из примера 18.10 для включения связанной информации напрямую, а не в отдельной конфигурации. Архитектура:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время, как блок верификации может включать связанную информацию, как часть своей декларации, существует возможность того, что эта информация может конфликтовать со связанной информацией, которую мы написали в конфигурациях. VHDL предотвращает такие конфликты, делая не полноправным привязывание блока верификации к конфигурациям, если он уже содержит связанную информацию. Следовательно, нужно писать привязку верификации в конфигурациях для общих блоков верификации, но не для каких-либо конкретных. В любом случаи, появится ошибка, если  мы привяжем блок верификации с экземпляром компонента, у которого нету связи в entity и архитектуре.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В дополнение к связанным блокам верификации напрямую или в конфигурациях, VHDL предоставляет средство для связи блоков верификации через исполнительно-определенные значения. Это может включать, опции командной строки, команды скриптов или выбор, используемого графического интерфейса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Немного дополнительных аспектов для PSL встроенного в VHDL. Первое, у PSL есть богатый набор зарезервированных слов, некоторые из которых могут конфликтовать с идентификаторами VHDL. Следующие PSL слова зарезервированы VHDL, и не могут использоваться, как идентификаторы:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другие зарезервированные PSL слова только считаются таковыми, если в VHDL коде, они появляются в PSL декларациях и директивах. Они могут использоваться, как VHDL идентификаторы, но такие идентификаторы скрыты для деклараций и директив PSL. Например, мы можем полноправно написать следующую декларацию:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
Но если мы декларируем последовательность:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ссылка на &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; в декларации последовательности является в PSL встроенной функции, а не к декларации, написанной в VHDL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Второе, PSL включает особенности для декларирования и экземпляров макросов, и разрешение директив препроцессора. Эти особенности могут использоваться только в блоках верификации PSL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, и -2002'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Эти версии VHDL не позволяют PSL встраиваться в VHDL модели. Код PSL должен быть написан в отдельном блоке верификации и иметь связь с проектом VHDL, который использует определенные инструментарием значения.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-24T10:16:27Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL — это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значение; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Директивы PSL нуждаются в спецификации времени, которая определяется, когда временное выражение рассчитано. Мы можем включить выражение времени в директиву. Однако, в то время, как такое же время подходит для всех директив проекта, проще включить декларацию времени по-умолчанию. Если мы напишем деклрацию времени по-умолчанию в области проекта, это подойдет для любых директив PSL, написанных в данном регионе. Наибольшее, мы можем включить одну декларацию времени по-умолчанию в данную область.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''ПРИМЕР 18.8''' ''Конвейерный связанные утверждения''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В своей книге ''Assertion-Based Design'' [7], Foster ''et al''. описывает образец верификации для системы, в которой конвейерная связность. В этом примере, система может принимать до 16 запросов, при подтверждении любого из них. Система считает количество запросов, их подтверждение, и включает утверждение, что для каждого запроса с данным подсчетом запросов, существует подтверждение с таким же счетом в течение 100 временных циклов. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
Счетчики запросов и подтверждения выполняются, используя сигналы &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; и процесс &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. Мы декларируем свойство &amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt;, которое выражает условие верификации для проекта. Мы, также, включаем декларацию времени по-умолчанию для архитектуры. Это подходит для утверждения директив, которые мы писали в области деклараций архитектуры, утверждая, что условие верификации выполняется.   &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Существует один случай, где встроенный в VHDL PSL может привести к двусмысленности. И PSL, и VHDL включают в себя выражения утверждений, но их смысл разный. Если мы напишем выражение вида:&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
оно может быть интерпретирована, как регулярное параллельное выражение VHDL утверждения, которое проверяется, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; меняют значение. Также, оно может быть интерпретировано, как директива утверждения PSL, которая предполагает свойство &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt;, выполняющееся во времени 0. В интересах совместимости с более ранними версиями языка, VHDL интерпретирует такие двусмысленные выражения, как регулярные параллельные выражения VHDL утверждений. Если мы действительно хотим написать директиву PSL утверждения такого вида, мы можем модифицировать свойство, таким образом получить однозначное PSL свойство, например:       &lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В PSL код верификации может быть написан в блоках верификации (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; блоки), которые связаны с экземплярами entity и архитектур VHDL. VHDL применяет такие блоки верификации, как первичные блоки проекта. Таким образом, они могут быть декларированы в файлах VHDL проекта и проанализированы в библиотеках VHDL проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Блок верификации может включать в себя обязательную информацию, которая определяет компонент образца, для которого применяется директива. Также, мы можем связать блок верификации, как часть конфигураций проекта. Единственное место, для того чтобы сделать это - декларация конфигураций, представленных в главе 13. Если мы хотим связать один и более блоков верификации к головному entity в декларации конфигураций, мы подключаем связывающую информацию, в соответствии со следующим синтаксическим правилом:  &lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Всякий раз, когда в декларации конфигурации экземпляра, либо в головном уровне иерархии проекта или как экземпляра компонента в более большом проекте, названные блоки верификации интерпретируются в контексте entity  и архитектуры. Это означает, что имена, используемые в блоках верификации интерпретируются в контексте entity.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Пример 18.9''' ''Связанный блок верификации в декларации конфигураций''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
предположим, что у нас есть блок верификации, который обеспечивает два выхода Q и Q_n, которые дополняют друг друга при переднем фронте сигнала clk. Блок верификации:&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем связать этот блок верификации с различными частями проекта. Например, модель gatelevel триггера D может быть описана так: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Декларация конфигураций для триггера D может связать блок верификации с головным entity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Далее мы можем подтвердить конфигурации в проекте и для каждого экземпляра, блок верификации &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; будет связан с экземпляром entity и архитектуры. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы, также, можем связать блок верификации с экземплярами компонентов, которые конфигурируются покомпонентной конфигурацией, вложенной в декларацию конфигураций. Полная форма конфигурации компонента предполагает компоненты, связанные с entity и архитектурой, и архитектура дополнительно конфигурируется:      &lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этом случаи, блоки верификации связаны с экземплярами определенными в декларации компонентов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Пример 18.10''' ''Связанный блок верификации в конфигурации компонента''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предположим, мы создаем регистр сдвига parallel-in/serial-out внутри RTL описания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем написать декларацию конфигураций, которая свяжет entity и архитектуру с экземпляром компонента, а также свяжет блок complementary_outputs верификации, Пример 18.9. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этом случаи, утверждение в блоке верификации применяется для выходов Q и Q_n регистра сдвига связанного entity с сериализатором экземпляра компонента.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Третье место, в котором мы можем применить блок верификации в VHDL проекте, это в спецификации конфигураций в архитектуре, где подтверждаются компоненты. Дополненное правило синтаксиса для спецификации конфигураций, снова предполагает связь компонентов с entity и архитектурой:   &lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это похоже на форму конфигурации компонентов, но без вложенных конфигураций для архитектуры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Пример 18.11''' ''Использование блока верификации в спецификации конфигураций''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем пересмотреть архитектуру из примера 18.10 для включения связанной информации напрямую, а не в отдельной конфигурации. Архитектура:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-10T08:04:42Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL — это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значение; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Директивы PSL нуждаются в спецификации времени, которая определяется, когда временное выражение рассчитано. Мы можем включить выражение времени в директиву. Однако, в то время, как такое же время подходит для всех директив проекта, проще включить декларацию времени по-умолчанию. Если мы напишем деклрацию времени по-умолчанию в области проекта, это подойдет для любых директив PSL, написанных в данном регионе. Наибольшее, мы можем включить одну декларацию времени по-умолчанию в данную область.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''ПРИМЕР 18.8''' ''Конвейерный связанные утверждения''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В своей книге ''Assertion-Based Design'' [7], Foster ''et al''. описывает образец верификации для системы, в которой конвейерная связность. В этом примере, система может принимать до 16 запросов, при подтверждении любого из них. Система считает количество запросов, их подтверждение, и включает утверждение, что для каждого запроса с данным подсчетом запросов, существует подтверждение с таким же счетом в течение 100 временных циклов. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
Счетчики запросов и подтверждения выполняются, используя сигналы &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; и процесс &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. Мы декларируем свойство &amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt;, которое выражает условие верификации для проекта. Мы, также, включаем декларацию времени по-умолчанию для архитектуры. Это подходит для утверждения директив, которые мы писали в области деклараций архитектуры, утверждая, что условие верификации выполняется.   &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Существует один случай, где встроенный в VHDL PSL может привести к двусмысленности. И PSL, и VHDL включают в себя выражения утверждений, но их смысл разный. Если мы напишем выражение вида:&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
оно может быть интерпретирована, как регулярное параллельное выражение VHDL утверждения, которое проверяется, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; меняют значение. Также, оно может быть интерпретировано, как директива утверждения PSL, которая предполагает свойство &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt;, выполняющееся во времени 0. В интересах совместимости с более ранними версиями языка, VHDL интерпретирует такие двусмысленные выражения, как регулярные параллельные выражения VHDL утверждений. Если мы действительно хотим написать директиву PSL утверждения такого вида, мы можем модифицировать свойство, таким образом получить однозначное PSL свойство, например:       &lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В PSL код верификации может быть написан в блоках верификации (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; блоки), которые связаны с экземплярами entity и архитектур VHDL. VHDL применяет такие блоки верификации, как первичные блоки проекта. Таким образом, они могут быть декларированы в файлах VHDL проекта и проанализированы в библиотеках VHDL проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Блок верификации может включать в себя обязательную информацию, которая определяет компонент образца, для которого применяется директива. Также, мы можем связать блок верификации, как часть конфигураций проекта. Единственное место, для того чтобы сделать это - декларация конфигураций, представленных в главе 13. Если мы хотим связать один и более блоков верификации к головному entity в декларации конфигураций, мы подключаем связывающую информацию, в соответствии со следующим синтаксическим правилом:  &lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Всякий раз, когда в декларации конфигурации экземпляра, либо в головном уровне иерархии проекта или как экземпляра компонента в более большом проекте, названные блоки верификации интерпретируются в контексте entity  и архитектуры. Это означает, что имена, используемые в блоках верификации интерпретируются в контексте entity.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Пример 18.9''' ''Связанный блок верификации в декларации конфигураций''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
предположим, что у нас есть блок верификации, который обеспечивает два выхода Q и Q_n, которые дополняют друг друга при переднем фронте сигнала clk. Блок верификации:&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем связать этот блок верификации с различными частями проекта. Например, модель gatelevel триггера D может быть описана так: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Декларация конфигураций для триггера D может связать блок верификации с головным entity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Далее мы можем подтвердить конфигурации в проекте и для каждого экземпляра, блок верификации &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; будет связан с экземпляром entity и архитектуры. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы, также, можем связать блок верификации с экземплярами компонентов, которые конфигурируются покомпонентной конфигурацией, вложенной в декларацию конфигураций. Полная форма конфигурации компонента предполагает компоненты, связанные с entity и архитектурой, и архитектура дополнительно конфигурируется:      &lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этом случаи, блоки верификации связаны с экземплярами определенными в декларации компонентов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''Пример 18.10''' ''Связанный блок верификации в конфигурации компонента''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предположим, мы создаем регистр сдвига parallel-in/serial-out внутри RTL описания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем написать декларацию конфигураций, которая свяжет entity и архитектуру с экземпляром компонента, а также свяжет блок complementary_outputs верификации, Пример 18.9. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.11''' ''Binding a verification unit in a configuration specification''&lt;br /&gt;
----&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-06T10:40:38Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL — это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значение; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Директивы PSL нуждаются в спецификации времени, которая определяется, когда временное выражение рассчитано. Мы можем включить выражение времени в директиву. Однако, в то время, как такое же время подходит для всех директив проекта, проще включить декларацию времени по-умолчанию. Если мы напишем деклрацию времени по-умолчанию в области проекта, это подойдет для любых директив PSL, написанных в данном регионе. Наибольшее, мы можем включить одну декларацию времени по-умолчанию в данную область.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''ПРИМЕР 18.8''' ''Конвейерный связанные утверждения''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В своей книге ''Assertion-Based Design'' [7], Foster ''et al''. описывает образец верификации для системы, в которой конвейерная связность. В этом примере, система может принимать до 16 запросов, при подтверждении любого из них. Система считает количество запросов, их подтверждение, и включает утверждение, что для каждого запроса с данным подсчетом запросов, существует подтверждение с таким же счетом в течение 100 временных циклов. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
Счетчики запросов и подтверждения выполняются, используя сигналы &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; и процесс &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. Мы декларируем свойство &amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt;, которое выражает условие верификации для проекта. Мы, также, включаем декларацию времени по-умолчанию для архитектуры. Это подходит для утверждения директив, которые мы писали в области деклараций архитектуры, утверждая, что условие верификации выполняется.   &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Существует один случай, где встроенный в VHDL PSL может привести к двусмысленности. И PSL, и VHDL включают в себя выражения утверждений, но их смысл разный. Если мы напишем выражение вида:&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
оно может быть интерпретирована, как регулярное параллельное выражение VHDL утверждения, которое проверяется, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; меняют значение. Также, оно может быть интерпретировано, как директива утверждения PSL, которая предполагает свойство &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt;, выполняющееся во времени 0. В интересах совместимости с более ранними версиями языка, VHDL интерпретирует такие двусмысленные выражения, как регулярные параллельные выражения VHDL утверждений. Если мы действительно хотим написать директиву PSL утверждения такого вида, мы можем модифицировать свойство, таким образом получить однозначное PSL свойство, например:       &lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В PSL код верификации может быть написан в блоках верификации (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; блоки), которые связаны с экземплярами entity и архитектур VHDL. VHDL применяет такие блоки верификации, как первичные блоки проекта. Таким образом, они могут быть декларированы в файлах VHDL проекта и проанализированы в библиотеках VHDL проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Блок верификации может включать в себя обязательную информацию, которая определяет компонент образца, для которого применяется директива. Также, мы можем связать блок верификации, как часть конфигураций проекта. Единственное место, для того чтобы сделать это - декларация конфигураций, представленных в главе 13. Если мы хотим связать один и более блоков верификации к головному entity в декларации конфигураций, мы подключаем связывающую информацию, в соответствии со следующим синтаксическим правилом:  &lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Всякий раз, когда в декларации конфигурации экземпляра, либо в головном уровне иерархии проекта или как экземпляра компонента в более большом проекте, названные блоки верификации интерпретируются в контексте entity  и архитектуры. Это означает, что имена, используемые в блоках верификации интерпретируются в контексте entity.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''EXAMPLE 18.9''' ''Binding a verification unit in a configuration declaration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.10''' ''Binding a verification unit in a component configuration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.11''' ''Binding a verification unit in a configuration specification''&lt;br /&gt;
----&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-06T07:29:54Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL — это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значение; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значение &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Директивы PSL нуждаются в спецификации времени, которая определяется, когда временное выражение рассчитано. Мы можем включить выражение времени в директиву. Однако, в то время, как такое же время подходит для всех директив проекта, проще включить декларацию времени по-умолчанию. Если мы напишем деклрацию времени по-умолчанию в области проекта, это подойдет для любых директив PSL, написанных в данном регионе. Наибольшее, мы можем включить одну декларацию времени по-умолчанию в данную область.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.8''' ''Pipelined handshake assertion''&lt;br /&gt;
----&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''EXAMPLE 18.9''' ''Binding a verification unit in a configuration declaration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.10''' ''Binding a verification unit in a component configuration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.11''' ''Binding a verification unit in a configuration specification''&lt;br /&gt;
----&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-12-02T10:56:06Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 PSL встроенный в VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL - это язык спецификации свойств стандарта IEEE (IEEE Std 1850). Это позволяет спецификацию временных свойств модели, которые могут быть верифицированы, как статические (используя формальный доказательный инструмент) или динамические (используя проверки моделирования). VHDL допускает встроенный PSL, как часть модели VHDL. Это делает проект верификации намного более естественным, и упрощает разработку и сопровождение моделей. Так как PSL довольно обширный язык, мы не будем описывать все его особенности в деталях. Мы опишем путь, по которому PSL может быть встроен в VHDL. Для полного описания PSL и его использования в проектах верификации, заинтересованный читатель может посмотреть другие публикации. (Например, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы можем включать в VHDL свойства PSL, последовательности, декларации времени в декларативной части entity, архитектуру, оператор block (смотрите главу 23), оператор generate или декларацию пакета. Далее мы можем использовать декларированные свойства и последовательности в директивах PSL, написанных в соответствующих операторных частях.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Любые свойства, которые мы пишем в PSL декларациях и директивах, должны соответствовать простому подмножеству правил PSL. На практике, это означает, что мы можем только писать свойства, в которых время движется вперед, слева направо через свойство. Два примера из стандарта PSL показывают это. Первый, следующее свойство в простом подмножестве: &lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение правда, то через три цикла &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет такое же значени; это значит, что время идет вперед три цикла, если мы выполняем свойство слева направо. Следующее свойство не относиться к простому подмножеству:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это свойство показывает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение правда и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает его же через три цикла, то далее &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; должен принять значения правда в то же время, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Проблема в этом свойстве заключается в том, что время двигается в обратном направлении от принятия значения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; до принятия значения &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Инструмент для проверки таких свойств куда, как более сложный, чем для простого подмножества.&lt;br /&gt;
&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.8''' ''Pipelined handshake assertion''&lt;br /&gt;
----&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''EXAMPLE 18.9''' ''Binding a verification unit in a configuration declaration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.10''' ''Binding a verification unit in a component configuration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.11''' ''Binding a verification unit in a configuration specification''&lt;br /&gt;
----&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL</id>
		<title>PSL/The designers guide to VHDL/18.3 Embedded PSL in VHDL</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/The_designers_guide_to_VHDL/18.3_Embedded_PSL_in_VHDL"/>
				<updated>2013-11-28T10:16:14Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 18.3 Embedded PSL in VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
== 18.3 PSL встроенный в VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PSL is the IEEE Standard Property Specification Language (IEEE Std 1850). It allows specification of temporal properties of a model that can be verified either statically (using a&lt;br /&gt;
formal proof tool) or dynamically (using simulation checkers). VHDL allows PSL code to&lt;br /&gt;
be embedded as part of a VHDL model. This makes design for verification a much more&lt;br /&gt;
natural activity, and simplifies development and maintenance of models. Since PSL is itself&lt;br /&gt;
a significant language, we won’t describe all of its features in detail in this book. Instead,&lt;br /&gt;
we will just describe the way in which PSL can be embedded in VHDL. For a full description of PSL and its use in verifying designs, the interested reader is referred to other published books on the subject. (See, for example, ''A Practical Introduction to PSL'' [4].)&lt;br /&gt;
&lt;br /&gt;
In VHDL we can include PSL property, sequence, and default clock declarations in&lt;br /&gt;
the declarative part of an entity, architecture, block statement (see Chapter 23), generate&lt;br /&gt;
statement, or package declaration. We can then use the declared properties and sequences&lt;br /&gt;
in PSL directives written in the corresponding statement parts.&lt;br /&gt;
&lt;br /&gt;
Any properties that we write in PSL declarations and directives must conform to PSL’s&lt;br /&gt;
simple subset rules. In practice, this means that we can only write properties in which time&lt;br /&gt;
moves forward from left to right through the property. Two examples from the PSL standard illustrate this. First, the following property is in the simple subset:&lt;br /&gt;
&lt;br /&gt;
 always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true, then three cycles later, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true; that is, time moves&lt;br /&gt;
forward three cycles as we scan the property left to right. In contrast, the following property is not in the simple subset:&lt;br /&gt;
&lt;br /&gt;
 always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
This property states that if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is true and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is true three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; must have&lt;br /&gt;
been true at the time &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; was true. The problem with this property is that time goes backward from &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; being true to &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; being true. A tool to check such a property is much more&lt;br /&gt;
complex than one to check properties in the simple subset.&lt;br /&gt;
&lt;br /&gt;
PSL directives require specification of a clock that determines when temporal expressions are evaluated. We can include a clock expression in a directive. However, since the&lt;br /&gt;
same clock usually applies to all directives in a design, it is simpler to include a default&lt;br /&gt;
clock declaration. If we write a default clock declaration in a region of a design, it applies&lt;br /&gt;
to any PSL directives written in that region. We can include at most one default clock declaration in any given region.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.8''' ''Pipelined handshake assertion''&lt;br /&gt;
----&lt;br /&gt;
In their book ''Assertion-Based Design'' [7], Foster ''et al''. describe a verification pattern&lt;br /&gt;
for a system in which handshaking is pipelined. In their example, a system can receive&lt;br /&gt;
up to 16 requests before acknowledging any of them. The system counts the number&lt;br /&gt;
of requests and acknowledgments and includes an assertion that, for every request&lt;br /&gt;
with a given request count, there is an acknowledgment with the same count within&lt;br /&gt;
100 clock cycles. We can describe the system in VHDL as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library ieee; context ieee.ieee_std_context;&lt;br /&gt;
entity slave is&lt;br /&gt;
port ( clk, reset :  in std_ulogic;&lt;br /&gt;
       req : in std_ulogic;&lt;br /&gt;
       ack : out std_ulogic;&lt;br /&gt;
       ... );&lt;br /&gt;
end entity slave;&lt;br /&gt;
architecture pipelined of slave is&lt;br /&gt;
  signal req_cnt, ack_cnt : unsigned(3 downto 0);&lt;br /&gt;
  default clock is rising_edge(clk);&lt;br /&gt;
  property all_requests_acked is&lt;br /&gt;
    forall C in {0 to 15}:&lt;br /&gt;
      always {req and req_cnt = C} |=&amp;gt;&lt;br /&gt;
             {[*0 to 99]; ack and ack_cnt = C};&lt;br /&gt;
begin&lt;br /&gt;
  req_ack_counter : process (clk) is&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge(clk) then&lt;br /&gt;
      if reset = '1' then&lt;br /&gt;
        req_cnt &amp;lt;= &amp;quot;0000&amp;quot;; ack_cnt &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        if req = '1' then req_cnt &amp;lt;= req_cnt + 1; end if;&lt;br /&gt;
        if ack = '1' then ack_cnt &amp;lt;= ack_cnt + 1; end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process req_ack_counter;&lt;br /&gt;
  ...&lt;br /&gt;
  assert all_requests_acked;&lt;br /&gt;
end architecture pipelined;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The counters for requests and acknowledgments are implemented using the signals &amp;lt;code&amp;gt;req_cnt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ack_cnt&amp;lt;/code&amp;gt; and the process &amp;lt;code&amp;gt;req_ack_counter&amp;lt;/code&amp;gt;. We declare a property,&lt;br /&gt;
&amp;lt;code&amp;gt;all_requests_acked&amp;lt;/code&amp;gt; that expresses the verification condition for the design. We also&lt;br /&gt;
include a default clock declaration for the architecture. It applies to the assert directive&lt;br /&gt;
that we write in the statement part of the architecture, asserting that the verification&lt;br /&gt;
condition holds.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is one case where embedding of PSL within VHDL may lead to ambiguity. Both&lt;br /&gt;
PSL and VHDL include assert statements, but their meanings differ. If we write a statement&lt;br /&gt;
of the form&lt;br /&gt;
&lt;br /&gt;
 assert not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
it could be interpreted as a regular VHDL concurrent assertion statement that is to be&lt;br /&gt;
checked whenever either of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; changes value. Alternatively, it could be interpreted as&lt;br /&gt;
a PSL assert directive that requires the property &amp;lt;code&amp;gt;not (a and b)&amp;lt;/code&amp;gt; to hold at time 0. In the&lt;br /&gt;
interest of backward compatibility with earlier versions of the language, VHDL interprets&lt;br /&gt;
such ambiguous statements as regular VHDL concurrent assertion statements. If we really&lt;br /&gt;
want to write a PSL assert directive of this form, we could modify the property so thatis unambiguously a PSL property, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 assert next[0] not (a and b) report &amp;quot;a and b are both true&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
In PSL, verification code can be written in verification units (&amp;lt;code&amp;gt;vunit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vprop&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;vmode&amp;lt;/code&amp;gt; units) that are bound to instances of VHDL entities and architectures. VHDL considers such verification units as primary design units. Thus, they can be declared in VHDL design files and analyzed into VHDL design libraries.&lt;br /&gt;
&lt;br /&gt;
A verification unit can include binding information that identifies a component instance to which directives apply. Alternatively, we can bind a verification unit as part of&lt;br /&gt;
the configuration of a design. One place to do that is in a configuration declaration, introduced in Chapter 13. If we want to bind one or more verification units to the top-level&lt;br /&gt;
entity in a configuration declaration, we include binding information according to the following synax rule:&lt;br /&gt;
&lt;br /&gt;
 configuration_declaration ⇐&lt;br /&gt;
   '''configuration''' identifier '''of''' ''entity''_name '''is'''&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
         block_configuration&lt;br /&gt;
       '''end''' [ '''configuration''' ] [ identifier ] ;&lt;br /&gt;
&lt;br /&gt;
Whenever the configuration declaration is instantiated, either at the top-level of a design hierarchy or as a component instance within a larger design, the named verification&lt;br /&gt;
units are bound to the instance of the named entity and architecture. That means the&lt;br /&gt;
names used in the verification units are interpreted in the context of the entity instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''EXAMPLE 18.9''' ''Binding a verification unit in a configuration declaration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we have a verification unit that ensures two outputs named Q and Q_n are&lt;br /&gt;
complementary when sampled on rising edges of a signal named clk. The verification&lt;br /&gt;
unit is&lt;br /&gt;
&lt;br /&gt;
 '''vunit''' complementary_outputs {&lt;br /&gt;
   '''assert always''' Q = '''not''' Q_n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
We can bind this verification unit to various parts of a design. For example, a gatelevel model of a D flipflop might be described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity D_FF is&lt;br /&gt;
  port ( clk, reset, D : in bit;&lt;br /&gt;
         Q, Q_n        : out bit );&lt;br /&gt;
end entity D_FF;&lt;br /&gt;
&lt;br /&gt;
architecture gate_level of D_FF is&lt;br /&gt;
  component and2 is ...&lt;br /&gt;
   ...&lt;br /&gt;
  begin&lt;br /&gt;
  G1 : and2 ...&lt;br /&gt;
  ...&lt;br /&gt;
end architecture gate_level;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A configuration declaration for the D flipflop can bind the verification unit to the top-level entity as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration fast_sim of D_FF is&lt;br /&gt;
  use vunit complementary_outputs;&lt;br /&gt;
  for gate_level&lt;br /&gt;
    for all : and2&lt;br /&gt;
      ...&lt;br /&gt;
    end for;&lt;br /&gt;
    ...&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration fast_sim;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We could then instantiate the configuration in a design, and for each instance, the&lt;br /&gt;
verification unit &amp;lt;code&amp;gt;complementary_outputs&amp;lt;/code&amp;gt; would be bound to the instantiated entity&lt;br /&gt;
and architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We can also bind verification units to component instances that are configured bycomponent configuration nested within a configuration declaration. The augmented form&lt;br /&gt;
of component configuration, assuming the components are bound to an entity and archi-&lt;br /&gt;
tecture, and the architecture is further configured, is&lt;br /&gt;
&lt;br /&gt;
 component_configuration ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
     binding_indication ;&lt;br /&gt;
     { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
     [ block_configuration ]&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
In this case, the named verification units are bound to the instances specified in the&lt;br /&gt;
component configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.10''' ''Binding a verification unit in a component configuration''&lt;br /&gt;
----&lt;br /&gt;
Suppose we instantiate a parallel-in/serial-out shift register within an RTL design:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
entity system is&lt;br /&gt;
  ...&lt;br /&gt;
end entity system;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    port ( clk, reset, D : in bit_vector;&lt;br /&gt;
           Q, Q_n        : out bit );&lt;br /&gt;
end component shift_reg;&lt;br /&gt;
  ...&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
  ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can write a configuration declaration that binds an entity and architecture to&lt;br /&gt;
the component instance and that also binds the complementary_outputs verification&lt;br /&gt;
unit shown in Example 18.9:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
configuration verifying of system is&lt;br /&gt;
  for RTL&lt;br /&gt;
    for serializer : shift_reg&lt;br /&gt;
      use entity work.shift_reg(RTL);&lt;br /&gt;
      use vunit complementary_outputs;&lt;br /&gt;
    end for;&lt;br /&gt;
  end for;&lt;br /&gt;
end configuration verifying;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the assertion in the verification unit applies to the Q and Q_n outputs&lt;br /&gt;
of the shift register entity bound to the serializer component instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The third place in which we can bind verification units in a VHDL design is in a con-&lt;br /&gt;
figuration specification in the architecture where components are instantiated. The aug-&lt;br /&gt;
mented syntax rule for a configuration specification, again assuming components are&lt;br /&gt;
bound to an entity and architecture, is&lt;br /&gt;
&lt;br /&gt;
 configuration_specification ⇐&lt;br /&gt;
   '''for''' component_specification&lt;br /&gt;
      binding_indication ;&lt;br /&gt;
      { '''use vunit''' ''verification_unit''_name { , ... } ; }&lt;br /&gt;
   '''end for''' ;&lt;br /&gt;
&lt;br /&gt;
This is similar to the form in a component configuration, but without the nested configuration for the architecture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''EXAMPLE 18.11''' ''Binding a verification unit in a configuration specification''&lt;br /&gt;
----&lt;br /&gt;
We can revise the architecture of Example 18.10 to include the binding information&lt;br /&gt;
directly, rather than in a separate configuration. The revised architecture is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture RTL of system is&lt;br /&gt;
  component shift_reg is&lt;br /&gt;
    ...&lt;br /&gt;
  end component shift_reg;&lt;br /&gt;
&lt;br /&gt;
  for serializer : shift_reg&lt;br /&gt;
    use entity work.shift_reg(RTL);&lt;br /&gt;
    use vunit complementary_outputs;&lt;br /&gt;
  end for;&lt;br /&gt;
begin&lt;br /&gt;
  serializer : shift_reg ...;&lt;br /&gt;
    ...&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since a verification unit may include binding information as part of its declaration,&lt;br /&gt;
there is potential for that information to conflict with binding information we write inconfiguration. VHDL prevents such conflict by making it illegal to bind a verification unit&lt;br /&gt;
in a configuration if the declaration of the unit already includes binding information.&lt;br /&gt;
Hence, we would normally only write verification bindings in configurations for general-purpose verification units, and not for those written with particular instances in mind. In&lt;br /&gt;
any case, it would be an error if we wrote a verification unit binding for a component&lt;br /&gt;
instance that had no bound entity and architecture.&lt;br /&gt;
&lt;br /&gt;
In addition to binding verification units directly in their declaration or indirectly in&lt;br /&gt;
configurations, VHDL allows a tool to bind additional verification units through&lt;br /&gt;
implementation-defined means. That might include command-line options, script commands, or selection using a graphical user interface.&lt;br /&gt;
&lt;br /&gt;
There are a couple of further points to make about PSL embedded in VHDL. First, PSL&lt;br /&gt;
has a rich set of reserved words, some of which may conflict with VHDL identifiers. The&lt;br /&gt;
following PSL keywords are VHDL reserved words, and cannot be used as identifiers:&lt;br /&gt;
&lt;br /&gt;
 assert&lt;br /&gt;
 assume&lt;br /&gt;
 assume_guarantee&lt;br /&gt;
 cover&lt;br /&gt;
 default&lt;br /&gt;
 fairness&lt;br /&gt;
 property&lt;br /&gt;
 restrict&lt;br /&gt;
 restrict_guarantee&lt;br /&gt;
 sequence&lt;br /&gt;
 strong&lt;br /&gt;
 vmode&lt;br /&gt;
 vprop&lt;br /&gt;
 vunit&lt;br /&gt;
&lt;br /&gt;
Other PSL reserved words are only recognized as such within VHDL code when they&lt;br /&gt;
occur in PSL declarations and directives. They can be used as VHDL identifiers, but such&lt;br /&gt;
identifiers are hidden within PSL declarations and directives. For example, we can legally&lt;br /&gt;
write the following declaration:&lt;br /&gt;
&lt;br /&gt;
 function rose ( x : boolean ) return boolean is ...;&lt;br /&gt;
&lt;br /&gt;
But if we then declare a sequence:&lt;br /&gt;
&lt;br /&gt;
 sequence cover_fifo_empty is&lt;br /&gt;
    {reset_n &amp;amp;&amp;amp; rose(cnt = 0)};&lt;br /&gt;
&lt;br /&gt;
The reference to &amp;lt;code&amp;gt;rose&amp;lt;/code&amp;gt; in the sequence declaration is to the PSL built-in function, not to&lt;br /&gt;
the declaration written in VHDL.&lt;br /&gt;
&lt;br /&gt;
Second, PSL includes features for declaring and instantiating macros, and allows for&lt;br /&gt;
preprocessor directives. These features can only be used in PSL verification units, not in&lt;br /&gt;
other VHDL design units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
'''VHDL-87, -93, and -2002'''&lt;br /&gt;
----&lt;br /&gt;
These versions of VHDL do not allow PSL to be embedded within VHDL models. PSL&lt;br /&gt;
code must be written in separate verification units and bound to the VHDL design us-&lt;br /&gt;
ing tool-defined means.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-25T11:04:35Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.5 Reporting a failure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL не указывает как идет время - т.е. не указывает, как данная последовательность циклов получается из проекта под верификацией. Это значит, что последовательность циклов, для двух программ верификации, необязательно совпадет. Например, симулятор, базирующийся на циклах видит последовательность значений сигнала подсчитанную цикл за циклом, в то время, как симулятор базирующийся на изменениях, запущенный для этого же проекта, видит более детализированную последовательность значений сигнала. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Тем не менее, существует путь гарантировать, что значение свойства PSL не влияет на степень детализации времени, с точки зрения программ верификации. Свойства PSL могут быть модифицированы, используя ''временное выражение'' для того, чтобы показать, что время должно быть получено во временных циклах временного выражения. В случаи временного свойства, результат программы базирующейся на циклах должен быть такой же, как и для программы базирующейся на изменениях. PSL допускает спецификацию ''времени по-умолчанию'', таким образом, что время не должно быть упомянуто отдельно для каждого свойства. Далее в этой книге мы предполагаем однократный тактовый проект под модель, базирующуюся на циклах, таким образом в большинстве примеров опущены явные упоминания о времени.&lt;br /&gt;
&lt;br /&gt;
===3.3 Проекты и тракты ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цель свойства PSL описать желаемое поведение проекта. Как правило, это удобно для проверки отдельных трактов проекта. Фундаментальный язык, который используется в данной книге, применяет данный подход, и таким образом, на протяжении данной книги мы будем интересоваться выполняется ли некое свойство в этом тракте или нет. Фундаментальный язык подходит, как для статической (формальной), так и для динамической (базирующейся на моделировании) верификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой подход, используется дополнительным ветвлением расширения, используется дерево структуры, которое представляет несколько путей. Этот подход подходить только для формальной верификации, и, очень кратко, затрагивается в главе 11.&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Текущий цикл, субтракты, модульность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда свойство PSL состоит из двух и больше под-свойств, оно проверяется на тракте, иногда это необходимо для понятия значения под-свойств на субтрактах. ''Текущий цикл'' это имя мы дали первому циклу тракта или субтракта, на котором мы оцениваем свойство или под-свойство.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предполагая, что циклы тракта нумеруются, начиная с 0, текущий цикл утверждения - 0. Текущий цикл под-свойства, какого-нибудь вшитого свойства, зависит от своего использования во вшитом свойстве. Операнды Булевого оператора получают такой же текущий цикл, как и родительское свойство. Операнды временных операторов получают текущий цикл, который связан с текущим циклом родительского свойства, в случаи, если это указано временным оператором. Например, оператор next увеличивает текущий цикл на один, оператор always создает “несколько экземпляров” под-свойства, каждый из которых получает текущий цикл, который соответствует текущему циклу или некоторому будущему циклу.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: Очень важно понять, что термин “несколько экземпляров” предназначен для смысла, который используется для понимания оператора &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;. ''Не'' предназначем показать, что каждый экземпляр существует; причем это не значит, что программе реализации PSL надо создать много экземпляров проверки утверждения, порождение нескольких экземпляров процесса или в любом другом случаи слова “несколько экземпляров” означают актуальные экземпляры чего-либо. Наоборот, существуют множество эффективных реализаций PSL, в которых оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; не создает нескольких экземпляров. Термин “несколько экземпляров” - это хороший способ усилить понятие того, как работает оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, наивная и неэффективная реализация могжет также реализовывать несколько экземпляров проверки или процесса.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Возвращаясь к нашему основному пункту рассмотрения, рассмотрим утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. Текущий цикл &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; - 0. Выполнение &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; в цикле 0, зависит от выполнения под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; в каждом цикле с нулевого. Текущий цикл для частной оценки под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; будет некий цикл ''N''. В итоге, для того, чтобы определить действительно ли под-свойство &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в цикле ''N'', мы должны оценить под-свойство a и следующий b с текущим циклом ''N'', что значит, что нам надо оценить под-свойство b с текущим циклом ''N'' + 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того чтобы сделать обсуждения конкретней, давайте рассмотрим наше утверждение, утверждение 3.1а на тракте 3.1(i). Сигнал а выполняется в циклах 4 и 8. Сигнал b выполняется в цикле 5, &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4. Это показано в тракте 3.1(ii), аннотированная версия тракта 3.1(i). В то время, как а выполняется в циклах 4 и 8, и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4, мы получаем, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, а цикл 8,как показано на тракте 3.1(ii). (Запомните, что в других частях по умолчанию справедливо, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполняется, и в дополнение во всех циклах где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; тоже.) Все свойство &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в циклах 9, 10, 11, 12, 13 (потому что в этих циклах &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется “сейчас” и во всех следующих циклах). Таким образом, утверждение 3.1a не выполняется на тракте 3.1(i) (потому что оно не выполняется в цикле 0 - первом цикле тракта).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.1: Конкретный пример&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Приведенное выше описание кажется простым. Однако, идея модульности скрывает некоторые тонкие моменты, например, что значение свойства &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; зависит только от текущего цикла. Таким образом, утверждение 3.2а выполняется нна тракте 3.2(i), потому что сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется в цикле 0. Если вы хотите выразить тот факт, что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; должен выполняться в каждом цикле, вы должны использовать оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, как в утверждении 3.2b. Утверждение 3.2b не выполняется на тракте 3.2(i).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой тонкий момент, что свойство может выполняться в суффиксе тракта,а не на самом тракте. Таким образом, свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на субтракте тракта 3.2(i), начиная с циклов 12, 13, 14. Это будет важно, если мы используем свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt;, как под-свойство какого-либо друо свойства. Например, утверждение 3.2c выполняется на тракте 3.2(i), потому что свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на 12&amp;lt;sup&amp;gt;''ти''&amp;lt;/sup&amp;gt; следующих циклах. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Последнее, циклы вовлеченные в в подсчет левой стороны логической импликации могут прекрываться с циклами вовлеченными в подсчет правой стороны логической импликации. Например, рассмотрим утверждение 3.3a на тракте 3.3(i). Утверждение 3.3a выполняется на тракте 3.3(i), потому что под-свойство &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; выполняется на всех циклах. Оно выполняется в цикле 2, потому что левая сторона &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; выполняется и в дополнение правая сторона &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt;, тоже выполняется. Оно выполняется во всех других циклах, потому что, если часть “if” логического исполнения не выполняется, то по-умолчанию часть “else” принимает значение правда     &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 3.2a и 3.2c выполняются, но 3.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.2: Важность оператора always&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Иллюстрация перекрытие левой и правой стороны  &amp;lt;br /&amp;gt;&lt;br /&gt;
утверждение 3.3a. Утверждение 3.3a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.3: Текущий цикл&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предварительно, например в рассматриваемых утверждениях 2.2а и 2.3b, мы видели случаи, где были перекрытия между циклами вовлеченными в удовлетворение двух разных случаев левой стороны логической импликации. Эти перекрытия вызваны присутствием оператора &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; в свойстве. Если мы удалим этот оператор, вопрос перекрытия исчезнет из утверждений 2.2a и 2.3b. Перекрытие утверждения 3.3а отличается от перекрытия утверждений 2.2a и 2.3b, и это очень важно: утверждение 3.3a написано таким образом, что циклы вовлеченные в подсчет левой стороны логической импликации перекрываются с циклами правой логической импликации: подсчитывая часть “if” логической вовлекают рассматриваемый текущий цикл, а также “предстоящие” шесть циклов, в то время как подсчет части “then” логической импликации вовлекает рассматриваемый текущий цикл и также “предстоящие” два цикла. Таким образом,перекрытие появляется от самой логической импликации. Такой стиль PSL свойств, обычно, труден для новых пользователей PSL, и вообще это не интуитивный способ использования языка. Поэтому, такие свойства не рекомендуется использовать, и &amp;lt;code&amp;gt;простое подмножество&amp;lt;/code&amp;gt; ограничений языка PSL не позволяет использование таких свойств. Мы обсудим простое подмножество в деталях поздней. На данный момент, запомните, что если вы написали свойство, в котором циклы вовлечены в подсчет левой стороны одного оператора перекрываются в течение более одного цикла с циклами вовлеченными для подсчета правой стороны того же оператора, то вы написали свойство не относящиеся к простому подмножеству.&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Сообщение об ошибке ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Рассмотрим утверждение 3.4а на тракте, показаном на рисунке 3.4. Очевидно, утверждение 3.4a не выполняется на нем. Сейчас рассмотрим четыре разных вида инструментов верификации, каждый из которых, выдает сообщение об ошибке утверждения 3.4a, индикаций сигнала, называемого “failure” в трактах 3.4(i), 3.4(ii), 3.4(iii) и 3.4(iv). Инструмент 1 выдал сообщение об ошибке на цикле 4, наиболее ранний выриант,на котором это можно выявить. Инструмент 2 выдал сообщение на цикле 4, а также на цикле 7, когда &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается второй раз. Инструмент 3 выдал сообщение в конце тракта, и инструмент 4 выдал сообщение на цикле 11,когда утверждается &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--   &lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Какой инструмент сработал правильно? Правильный ответ - все они. PSL определяет выполняется ли свойство в тракте - вот и все. ничего не сказано о том, когда инструмент, динамический или статический, должен выдать сообщение по результатам анализов. Таким образом, нету смысла в вопросе - какой инструмент правильный? Все они показали, что свойство не выполняется на тракте, поэтому все они верны. Индикация ошибки показанная на все тракте может пониматься, как помощь для дебага, помогая пользователям понять,где находиться ошибка на тракте. Пока PSL показывает эти ошибки на трактах, он делает свою работу.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.4: Четыре инструмент,выдающих сообщение об ошибке утверждения 3.4a на одном и том же тракте&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-25T10:50:09Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.4 Текущий цикл, субтракты, модульность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL не указывает как идет время - т.е. не указывает, как данная последовательность циклов получается из проекта под верификацией. Это значит, что последовательность циклов, для двух программ верификации, необязательно совпадет. Например, симулятор, базирующийся на циклах видит последовательность значений сигнала подсчитанную цикл за циклом, в то время, как симулятор базирующийся на изменениях, запущенный для этого же проекта, видит более детализированную последовательность значений сигнала. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Тем не менее, существует путь гарантировать, что значение свойства PSL не влияет на степень детализации времени, с точки зрения программ верификации. Свойства PSL могут быть модифицированы, используя ''временное выражение'' для того, чтобы показать, что время должно быть получено во временных циклах временного выражения. В случаи временного свойства, результат программы базирующейся на циклах должен быть такой же, как и для программы базирующейся на изменениях. PSL допускает спецификацию ''времени по-умолчанию'', таким образом, что время не должно быть упомянуто отдельно для каждого свойства. Далее в этой книге мы предполагаем однократный тактовый проект под модель, базирующуюся на циклах, таким образом в большинстве примеров опущены явные упоминания о времени.&lt;br /&gt;
&lt;br /&gt;
===3.3 Проекты и тракты ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цель свойства PSL описать желаемое поведение проекта. Как правило, это удобно для проверки отдельных трактов проекта. Фундаментальный язык, который используется в данной книге, применяет данный подход, и таким образом, на протяжении данной книги мы будем интересоваться выполняется ли некое свойство в этом тракте или нет. Фундаментальный язык подходит, как для статической (формальной), так и для динамической (базирующейся на моделировании) верификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой подход, используется дополнительным ветвлением расширения, используется дерево структуры, которое представляет несколько путей. Этот подход подходить только для формальной верификации, и, очень кратко, затрагивается в главе 11.&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Текущий цикл, субтракты, модульность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда свойство PSL состоит из двух и больше под-свойств, оно проверяется на тракте, иногда это необходимо для понятия значения под-свойств на субтрактах. ''Текущий цикл'' это имя мы дали первому циклу тракта или субтракта, на котором мы оцениваем свойство или под-свойство.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предполагая, что циклы тракта нумеруются, начиная с 0, текущий цикл утверждения - 0. Текущий цикл под-свойства, какого-нибудь вшитого свойства, зависит от своего использования во вшитом свойстве. Операнды Булевого оператора получают такой же текущий цикл, как и родительское свойство. Операнды временных операторов получают текущий цикл, который связан с текущим циклом родительского свойства, в случаи, если это указано временным оператором. Например, оператор next увеличивает текущий цикл на один, оператор always создает “несколько экземпляров” под-свойства, каждый из которых получает текущий цикл, который соответствует текущему циклу или некоторому будущему циклу.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: Очень важно понять, что термин “несколько экземпляров” предназначен для смысла, который используется для понимания оператора &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;. ''Не'' предназначем показать, что каждый экземпляр существует; причем это не значит, что программе реализации PSL надо создать много экземпляров проверки утверждения, порождение нескольких экземпляров процесса или в любом другом случаи слова “несколько экземпляров” означают актуальные экземпляры чего-либо. Наоборот, существуют множество эффективных реализаций PSL, в которых оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; не создает нескольких экземпляров. Термин “несколько экземпляров” - это хороший способ усилить понятие того, как работает оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, наивная и неэффективная реализация могжет также реализовывать несколько экземпляров проверки или процесса.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Возвращаясь к нашему основному пункту рассмотрения, рассмотрим утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. Текущий цикл &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; - 0. Выполнение &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; в цикле 0, зависит от выполнения под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; в каждом цикле с нулевого. Текущий цикл для частной оценки под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; будет некий цикл ''N''. В итоге, для того, чтобы определить действительно ли под-свойство &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в цикле ''N'', мы должны оценить под-свойство a и следующий b с текущим циклом ''N'', что значит, что нам надо оценить под-свойство b с текущим циклом ''N'' + 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того чтобы сделать обсуждения конкретней, давайте рассмотрим наше утверждение, утверждение 3.1а на тракте 3.1(i). Сигнал а выполняется в циклах 4 и 8. Сигнал b выполняется в цикле 5, &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4. Это показано в тракте 3.1(ii), аннотированная версия тракта 3.1(i). В то время, как а выполняется в циклах 4 и 8, и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4, мы получаем, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, а цикл 8,как показано на тракте 3.1(ii). (Запомните, что в других частях по умолчанию справедливо, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполняется, и в дополнение во всех циклах где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; тоже.) Все свойство &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в циклах 9, 10, 11, 12, 13 (потому что в этих циклах &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется “сейчас” и во всех следующих циклах). Таким образом, утверждение 3.1a не выполняется на тракте 3.1(i) (потому что оно не выполняется в цикле 0 - первом цикле тракта).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.1: Конкретный пример&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Приведенное выше описание кажется простым. Однако, идея модульности скрывает некоторые тонкие моменты, например, что значение свойства &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; зависит только от текущего цикла. Таким образом, утверждение 3.2а выполняется нна тракте 3.2(i), потому что сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется в цикле 0. Если вы хотите выразить тот факт, что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; должен выполняться в каждом цикле, вы должны использовать оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, как в утверждении 3.2b. Утверждение 3.2b не выполняется на тракте 3.2(i).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой тонкий момент, что свойство может выполняться в суффиксе тракта,а не на самом тракте. Таким образом, свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на субтракте тракта 3.2(i), начиная с циклов 12, 13, 14. Это будет важно, если мы используем свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt;, как под-свойство какого-либо друо свойства. Например, утверждение 3.2c выполняется на тракте 3.2(i), потому что свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на 12&amp;lt;sup&amp;gt;''ти''&amp;lt;/sup&amp;gt; следующих циклах. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Последнее, циклы вовлеченные в в подсчет левой стороны логической импликации могут прекрываться с циклами вовлеченными в подсчет правой стороны логической импликации. Например, рассмотрим утверждение 3.3a на тракте 3.3(i). Утверждение 3.3a выполняется на тракте 3.3(i), потому что под-свойство &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; выполняется на всех циклах. Оно выполняется в цикле 2, потому что левая сторона &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; выполняется и в дополнение правая сторона &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt;, тоже выполняется. Оно выполняется во всех других циклах, потому что, если часть “if” логического исполнения не выполняется, то по-умолчанию часть “else” принимает значение правда     &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 3.2a и 3.2c выполняются, но 3.2b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.2: Важность оператора always&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Иллюстрация перекрытие левой и правой стороны  &amp;lt;br /&amp;gt;&lt;br /&gt;
утверждение 3.3a. Утверждение 3.3a выполняется.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.3: Текущий цикл&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предварительно, например в рассматриваемых утверждениях 2.2а и 2.3b, мы видели случаи, где были перекрытия между циклами вовлеченными в удовлетворение двух разных случаев левой стороны логической импликации. Эти перекрытия вызваны присутствием оператора &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; в свойстве. Если мы удалим этот оператор, вопрос перекрытия исчезнет из утверждений 2.2a и 2.3b. Перекрытие утверждения 3.3а отличается от перекрытия утверждений 2.2a и 2.3b, и это очень важно: утверждение 3.3a написано таким образом, что циклы вовлеченные в подсчет левой стороны логической импликации перекрываются с циклами правой логической импликации: подсчитывая часть “if” логической вовлекают рассматриваемый текущий цикл, а также “предстоящие” шесть циклов, в то время как подсчет части “then” логической импликации вовлекает рассматриваемый текущий цикл и также “предстоящие” два цикла. Таким образом,перекрытие появляется от самой логической импликации. Такой стиль PSL свойств, обычно, труден для новых пользователей PSL, и вообще это не интуитивный способ использования языка. Поэтому, такие свойства не рекомендуется использовать, и &amp;lt;code&amp;gt;простое подмножество&amp;lt;/code&amp;gt; ограничений языка PSL не позволяет использование таких свойств. Мы обсудим простое подмножество в деталях поздней. На данный момент, запомните, что если вы написали свойство, в котором циклы вовлечены в подсчет левой стороны одного оператора перекрываются в течение более одного цикла с циклами вовлеченными для подсчета правой стороны того же оператора, то вы написали свойство не относящиеся к простому подмножеству.&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-25T09:29:21Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.4 Current cycle, sub-traces, and modularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL не указывает как идет время - т.е. не указывает, как данная последовательность циклов получается из проекта под верификацией. Это значит, что последовательность циклов, для двух программ верификации, необязательно совпадет. Например, симулятор, базирующийся на циклах видит последовательность значений сигнала подсчитанную цикл за циклом, в то время, как симулятор базирующийся на изменениях, запущенный для этого же проекта, видит более детализированную последовательность значений сигнала. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Тем не менее, существует путь гарантировать, что значение свойства PSL не влияет на степень детализации времени, с точки зрения программ верификации. Свойства PSL могут быть модифицированы, используя ''временное выражение'' для того, чтобы показать, что время должно быть получено во временных циклах временного выражения. В случаи временного свойства, результат программы базирующейся на циклах должен быть такой же, как и для программы базирующейся на изменениях. PSL допускает спецификацию ''времени по-умолчанию'', таким образом, что время не должно быть упомянуто отдельно для каждого свойства. Далее в этой книге мы предполагаем однократный тактовый проект под модель, базирующуюся на циклах, таким образом в большинстве примеров опущены явные упоминания о времени.&lt;br /&gt;
&lt;br /&gt;
===3.3 Проекты и тракты ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цель свойства PSL описать желаемое поведение проекта. Как правило, это удобно для проверки отдельных трактов проекта. Фундаментальный язык, который используется в данной книге, применяет данный подход, и таким образом, на протяжении данной книги мы будем интересоваться выполняется ли некое свойство в этом тракте или нет. Фундаментальный язык подходит, как для статической (формальной), так и для динамической (базирующейся на моделировании) верификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой подход, используется дополнительным ветвлением расширения, используется дерево структуры, которое представляет несколько путей. Этот подход подходить только для формальной верификации, и, очень кратко, затрагивается в главе 11.&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Текущий цикл, субтракты, модульность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда свойство PSL состоит из двух и больше под-свойств, оно проверяется на тракте, иногда это необходимо для понятия значения под-свойств на субтрактах. ''Текущий цикл'' это имя мы дали первому циклу тракта или субтракта, на котором мы оцениваем свойство или под-свойство.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Предполагая, что циклы тракта нумеруются, начиная с 0, текущий цикл утверждения - 0. Текущий цикл под-свойства, какого-нибудь вшитого свойства, зависит от своего использования во вшитом свойстве. Операнды Булевого оператора получают такой же текущий цикл, как и родительское свойство. Операнды временных операторов получают текущий цикл, который связан с текущим циклом родительского свойства, в случаи, если это указано временным оператором. Например, оператор next увеличивает текущий цикл на один, оператор always создает “несколько экземпляров” под-свойства, каждый из которых получает текущий цикл, который соответствует текущему циклу или некоторому будущему циклу.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание: Очень важно понять, что термин “несколько экземпляров” предназначен для смысла, который используется для понимания оператора &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;. ''Не'' предназначем показать, что каждый экземпляр существует; причем это не значит, что программе реализации PSL надо создать много экземпляров проверки утверждения, порождение нескольких экземпляров процесса или в любом другом случаи слова “несколько экземпляров” означают актуальные экземпляры чего-либо. Наоборот, существуют множество эффективных реализаций PSL, в которых оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; не создает нескольких экземпляров. Термин “несколько экземпляров” - это хороший способ усилить понятие того, как работает оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, наивная и неэффективная реализация могжет также реализовывать несколько экземпляров проверки или процесса.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Возвращаясь к нашему основному пункту рассмотрения, рассмотрим утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. Текущий цикл &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; - 0. Выполнение &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; в цикле 0, зависит от выполнения под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; в каждом цикле с нулевого. Текущий цикл для частной оценки под-свойства &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; будет некий цикл ''N''. В итоге, для того, чтобы определить действительно ли под-свойство &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в цикле ''N'', мы должны оценить под-свойство a и следующий b с текущим циклом ''N'', что значит, что нам надо оценить под-свойство b с текущим циклом ''N'' + 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того чтобы сделать обсуждения конкретней, давайте рассмотрим наше утверждение, утверждение 3.1а на тракте 3.1(i). Сигнал а выполняется в циклах 4 и 8. Сигнал b выполняется в цикле 5, &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4. Это показано в тракте 3.1(ii), аннотированная версия тракта 3.1(i). В то время, как а выполняется в циклах 4 и 8, и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; выполняется в цикле 4, мы получаем, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, а цикл 8,как показано на тракте 3.1(ii). (Запомните, что в других частях по умолчанию справедливо, что &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется во всех циклах, где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполняется, и в дополнение во всех циклах где &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется и &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; тоже.) Все свойство &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется в циклах 9, 10, 11, 12, 13 (потому что в этих циклах &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; выполняется “сейчас” и во всех следующих циклах). Таким образом, утверждение 3.1a не выполняется на тракте 3.1(i) (потому что оно не выполняется в цикле 0 - первом цикле тракта).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 3.1: Конкретный пример&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Приведенное выше описание кажется простым. Однако, идея модульности скрывает некоторые тонкие моменты, например, что значение свойства &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; зависит только от текущего цикла. Таким образом, утверждение 3.2а выполняется нна тракте 3.2(i), потому что сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; выполняется в цикле 0. Если вы хотите выразить тот факт, что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; должен выполняться в каждом цикле, вы должны использовать оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, как в утверждении 3.2b. Утверждение 3.2b не выполняется на тракте 3.2(i).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой тонкий момент, что свойство может выполняться в суффиксе тракта,а не на самом тракте. Таким образом, свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на субтракте тракта 3.2(i), начиная с циклов 12, 13, 14. Это будет важно, если мы используем свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt;, как под-свойство какого-либо друо свойства. Например, утверждение 3.2c выполняется на тракте 3.2(i), потому что свойство &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; выполняется на 12&amp;lt;sup&amp;gt;''ти''&amp;lt;/sup&amp;gt; следующих циклах. &lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-25T07:25:29Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.3 Designs and traces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL не указывает как идет время - т.е. не указывает, как данная последовательность циклов получается из проекта под верификацией. Это значит, что последовательность циклов, для двух программ верификации, необязательно совпадет. Например, симулятор, базирующийся на циклах видит последовательность значений сигнала подсчитанную цикл за циклом, в то время, как симулятор базирующийся на изменениях, запущенный для этого же проекта, видит более детализированную последовательность значений сигнала. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Тем не менее, существует путь гарантировать, что значение свойства PSL не влияет на степень детализации времени, с точки зрения программ верификации. Свойства PSL могут быть модифицированы, используя ''временное выражение'' для того, чтобы показать, что время должно быть получено во временных циклах временного выражения. В случаи временного свойства, результат программы базирующейся на циклах должен быть такой же, как и для программы базирующейся на изменениях. PSL допускает спецификацию ''времени по-умолчанию'', таким образом, что время не должно быть упомянуто отдельно для каждого свойства. Далее в этой книге мы предполагаем однократный тактовый проект под модель, базирующуюся на циклах, таким образом в большинстве примеров опущены явные упоминания о времени.&lt;br /&gt;
&lt;br /&gt;
===3.3 Проекты и тракты ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цель свойства PSL описать желаемое поведение проекта. Как правило, это удобно для проверки отдельных трактов проекта. Фундаментальный язык, который используется в данной книге, применяет данный подход, и таким образом, на протяжении данной книги мы будем интересоваться выполняется ли некое свойство в этом тракте или нет. Фундаментальный язык подходит, как для статической (формальной), так и для динамической (базирующейся на моделировании) верификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой подход, используется дополнительным ветвлением расширения, используется дерево структуры, которое представляет несколько путей. Этот подход подходить только для формальной верификации, и, очень кратко, затрагивается в главе 11.&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-15T18:56:19Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.2 Понятие времени */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL не указывает как идет время - т.е. не указывает, как данная последовательность циклов получается из проекта под верификацией. Это значит, что последовательность циклов, для двух программ верификации, необязательно совпадет. Например, симулятор, базирующийся на циклах видит последовательность значений сигнала подсчитанную цикл за циклом, в то время, как симулятор базирующийся на изменениях, запущенный для этого же проекта, видит более детализированную последовательность значений сигнала. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Тем не менее, существует путь гарантировать, что значение свойства PSL не влияет на степень детализации времени, с точки зрения программ верификации. Свойства PSL могут быть модифицированы, используя ''временное выражение'' для того, чтобы показать, что время должно быть получено во временных циклах временного выражения. В случаи временного свойства, результат программы базирующейся на циклах должен быть такой же, как и для программы базирующейся на изменениях. PSL допускает спецификацию ''времени по-умолчанию'', таким образом, что время не должно быть упомянуто отдельно для каждого свойства. Далее в этой книге мы предполагаем однократный тактовый проект под модель, базирующуюся на циклах, таким образом в большинстве примеров опущены явные упоминания о времени.&lt;br /&gt;
&lt;br /&gt;
===3.3 Designs and traces===&lt;br /&gt;
&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-15T10:54:41Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.2 Понятие времени */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. Для более сложных утверждений PSL, которые, во-первых, находяться отдельно от кода (таким образом понятие “исполнение” чужое для них), и во-вторых охватывает множество шагов во времени, понятию времени необходими уелить больше внимания.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предполагает, что время дискретно, таким образом, время состоит из последовательности оцененных циклов. Значение свойства PSL определенно по отношению к такой последовательности циклов. В этой книге, мы будем называть такую последовательность циклов ''трактом''. &lt;br /&gt;
&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
&lt;br /&gt;
===3.3 Designs and traces===&lt;br /&gt;
&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-15T09:22:43Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.2 The notion of time */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Понятие времени ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Когда Булево утверждение встроено в код, который выполняется, как в простом утверждении Java или (моделирования) VHDL, понятие времени не нуждается в определении -  утверждение проверяется всякий раз, когда заявление, содержащее утверждение выполняется. &lt;br /&gt;
&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
&lt;br /&gt;
===3.3 Designs and traces===&lt;br /&gt;
&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-15T08:43:24Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 3.1 Утверждения против свойств */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования. Например, мы можем сказать, что утверждение &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; требует, чтобы когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не утверждался, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен будет утвердиться в следующем цикле. Однако, мы никогда не скажем такого о свойстве &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, по двум причинам. Первая - потому что если свойство используется в предположении (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), то нету никаких требований. Вторая - потому что свойство может использоваться, как под-свойство более сложного свойства, и если так, то не может исходить требований от него самого.&lt;br /&gt;
&lt;br /&gt;
=== 3.2 The notion of time ===&lt;br /&gt;
&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3.3 Designs and traces===&lt;br /&gt;
&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru</id>
		<title>PSL/A Practical Introduction to PSL/Some Philosophy/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Some_Philosophy/ru"/>
				<updated>2013-11-13T10:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Some Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Немного философии ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have seen some basic PSL and gotten a feel for how it is intended to be&lt;br /&gt;
used. Before we continue, we discuss some of the concepts at the root of PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Мы рассмотрели немного основ PSL и получили ощущение того, как используется. Перед тем как продолжить, мы обсудим некоторые концепции в корне PSL.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Утверждения против свойств ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As we have seen, a PSL assertion is made up of the keyword assert plus&lt;br /&gt;
the PSL ''property'' being asserted, followed by a semi-colon. For example, in&lt;br /&gt;
the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, the property is &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. A property holds or does not hold on a given trace. It is agnostic&lt;br /&gt;
about whether or not holding is a good thing. An assertion, on the other hand,&lt;br /&gt;
tells the verification tool that the property being asserted is required to hold.&lt;br /&gt;
In the remainder of this book we will be very careful about distinguish-&lt;br /&gt;
ing between a property, which merely describes behavior, and an assertion,&lt;br /&gt;
which sets a requirement. For example, we might say that an assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; requires that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, signal&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; will be asserted in the next cycle. However, we will never say that about&lt;br /&gt;
the property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;, for two reasons. First, because if the&lt;br /&gt;
property is used in an assumption (&amp;lt;code&amp;gt;assume always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;), then&lt;br /&gt;
no requirement is being stated. Second, because a property may be used as a&lt;br /&gt;
sub-property of a more complicated property, and as such, it does not state a&lt;br /&gt;
requirement on its own.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как мы уже видели, утверждения PSL состоят из ключевого слова assert плюс ''свойства'' PSL для утверждения, разделенных точкой с запятой. Например, в утверждении &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;, свойство - &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;. Свойство выполняется или не выполняется в данном тракте. Утверждение, с другой стороны, указывает программе верификации, что свойство было утверждено, и требуется выполнение. Далее в книге мы будем внимательно рассматривать отличия между свойствами, которые просто описывают поведения, и утверждения,которые устанавливают требования.   &lt;br /&gt;
&lt;br /&gt;
=== 3.2 The notion of time ===&lt;br /&gt;
&lt;br /&gt;
When a Boolean assertion is embedded in code that is being run, like in the&lt;br /&gt;
simple assertions of Java and (simulated) VHDL, the notion of time need not&lt;br /&gt;
be defined – an assertion is checked whenever the statement containing the&lt;br /&gt;
assertion is executed. For the more complicated assertions of PSL, which first&lt;br /&gt;
of all stand apart from the code (so that the notion of “execution” is foreign&lt;br /&gt;
to them) and which second of all span multiple time steps, the notion of time&lt;br /&gt;
must be given more consideration.&lt;br /&gt;
&lt;br /&gt;
PSL assumes that time is discrete, that is, that time consists of a sequence&lt;br /&gt;
of evaluation cycles. The meaning of a PSL property is defined relative to such&lt;br /&gt;
a sequence of cycles. In this book, we will refer to such a sequence of cycles&lt;br /&gt;
as a ''trace''.&lt;br /&gt;
&lt;br /&gt;
PSL does not dictate how time ticks – that is, it does not dictate how such&lt;br /&gt;
a sequence of cycles is extracted from a design under verification. This means&lt;br /&gt;
that the sequence of cycles as seen by two verification tools is not necessarily&lt;br /&gt;
the same. For example, a cycle-based simulator sees a sequence of signal values&lt;br /&gt;
calculated cycle-by-cycle, while an event-based simulator running on the same&lt;br /&gt;
design sees a more detailed sequence of signal values.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, there is a way to ensure that the meaning of a PSL property&lt;br /&gt;
is not affected by the granularity of time as seen by the verification tool. PSL&lt;br /&gt;
properties can be modified by using a ''clock expression'' to indicate that time&lt;br /&gt;
should be measured in clock cycles of the clock expression. In the case of&lt;br /&gt;
a clocked property, the result of a cycle-based tool will be the same as the&lt;br /&gt;
result of an event-based tool. PSL allows the specification of a ''default clock'',&lt;br /&gt;
so that the clock does not have to be mentioned explicitly for each and every&lt;br /&gt;
property. In most of this book we have assumed a singly clocked design under&lt;br /&gt;
the cycle-based model, and thus most examples omit the explicit mention of&lt;br /&gt;
the clock. Clocks are discussed in detail in Chapters 6 and 14.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3.3 Designs and traces===&lt;br /&gt;
&lt;br /&gt;
The purpose of a PSL property is to describe the desired behavior of a design.&lt;br /&gt;
In order to do so, it is usually convenient to examine individual traces of that&lt;br /&gt;
design. The Foundation Language (FL), which we focus on in this book, uses&lt;br /&gt;
this approach, and thus throughout most of this book we shall be interested&lt;br /&gt;
in whether or not a particular PSL property holds on a particular trace.&lt;br /&gt;
The Foundation Language is suitable for both static (formal) and dynamic&lt;br /&gt;
(simulation-based) verification.&lt;br /&gt;
&lt;br /&gt;
Another approach, used by the Optional Branching Extension (OBE), uses&lt;br /&gt;
a tree structure that represents multiple paths. This approach is applicable&lt;br /&gt;
only to formal verification, and is touched on very briefly in Chapter 11.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Current cycle, sub-traces, and modularity ===&lt;br /&gt;
&lt;br /&gt;
When a PSL property composed of two or more sub-properties is checked on&lt;br /&gt;
a trace, it is sometimes necessary to decide the meaning of the sub-properties&lt;br /&gt;
on a sub-trace. The ''current cycle'' is the name we give to the first cycle of a&lt;br /&gt;
trace or a sub-trace on which we are evaluating a property or a sub-property.&lt;br /&gt;
&lt;br /&gt;
Assuming that the cycles of a trace are numbered starting from 0, the&lt;br /&gt;
current cycle of an assertion is 0. The current cycle of a sub-property of some&lt;br /&gt;
enclosing property depends on its use in the enclosing property. The operands&lt;br /&gt;
of a Boolean operator have the same current cycle as the parent property.&lt;br /&gt;
The operands of a temporal operator have a current cycle that is related to&lt;br /&gt;
the current cycle of the parent property in a way dictated by the temporal&lt;br /&gt;
operator. For example, the next operator increases the current cycle by one,&lt;br /&gt;
the always operator creates “multiple instances” of the sub-property, each of&lt;br /&gt;
which has a current cycle that corresponds either to the current cycle or to&lt;br /&gt;
some future cycle, etc.&lt;br /&gt;
&lt;br /&gt;
NOTE: It is very important to understand that the term “multiple instances”&lt;br /&gt;
is intended to convey an intuition which is useful in understanding&lt;br /&gt;
the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator. It is ''not'' intended to hint that any actual instantiation&lt;br /&gt;
is taking place; neither does it imply that a tool implementing PSL needs to&lt;br /&gt;
create multiple instances of an assertion checker, spawn multiple instances of&lt;br /&gt;
a process, or in any other way cause the words “multiple instances” to correspond&lt;br /&gt;
to actual instances of anything whatsoever. On the contrary, there are&lt;br /&gt;
many efficient implementations of PSL in which the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator does not&lt;br /&gt;
create, spawn, or in any other way generate actual multiple instances. Still,&lt;br /&gt;
the term “multiple instances” is a good way to gain intuition about how the&lt;br /&gt;
&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator works, and a naive and inefficient implementation may well&lt;br /&gt;
generate multiple instances of a checker or of a process.&lt;br /&gt;
&lt;br /&gt;
Getting back to our main point, consider the assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt;. The current cycle of &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; is 0. Whether or&lt;br /&gt;
not &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle 0 depends on whether or not the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at every cycle from 0 onwards. The current&lt;br /&gt;
cycle for a particular evaluation of the sub-property &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; will be&lt;br /&gt;
some cycle ''N''. Finally, in order to determine whether or not sub-property&lt;br /&gt;
&amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds at cycle ''N'', we will need to evaluate sub-properties a&lt;br /&gt;
and next b with a current cycle of ''N'', which means that we need to evaluate&lt;br /&gt;
sub-property b with a current cycle of ''N'' + 1.&lt;br /&gt;
&lt;br /&gt;
To make the discussion more concrete, let’s consider our assertion, Assertion&lt;br /&gt;
3.1a, on Trace 3.1(i). Signal a holds in cycles 4 and 8. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds in&lt;br /&gt;
cycle 5, and therefore &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; holds in cycle 4. This is shown in Trace 3.1(ii),&lt;br /&gt;
an annotated version of Trace 3.1(i). Since a holds in cycles 4 and 8, and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in cycle 4, we get that &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds in all cycles but cycle 8,&lt;br /&gt;
as shown in Trace 3.1(ii). (Remember that the else-part defaults to true, so &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in all cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; does not hold, and in addition in all&lt;br /&gt;
cycles where &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;next b&amp;lt;/code&amp;gt; does too.) The entire property &amp;lt;code&amp;gt;always (a -&amp;gt; next b)&amp;lt;/code&amp;gt;&lt;br /&gt;
therefore holds in cycles 9, 10, 11, 12 and 13 (because in these&lt;br /&gt;
cycles, &amp;lt;code&amp;gt;(a -&amp;gt; next b)&amp;lt;/code&amp;gt; holds “now” and in all future cycles). Thus, Assertion&lt;br /&gt;
3.1a does not hold on Trace 3.1(i) (because it does not hold on cycle 0 –&lt;br /&gt;
the first cycle of the trace).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);          (3.1a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.1: A concrete example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above explanation seems straightforward. However, the idea of modularity&lt;br /&gt;
hides some subtle points – for example, that the value of the property&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is dependent only on the current cycle. Thus, Assertion 3.2a holds on&lt;br /&gt;
Trace 3.2(i), because signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds in cycle 0. If you want to express the fact&lt;br /&gt;
that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; should hold in every cycle, you must use the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator, as in&lt;br /&gt;
Assertion 3.2b. Assertion 3.2b does not hold on Trace 3.2(i).&lt;br /&gt;
&lt;br /&gt;
Another subtle point is that a property can hold on a suffix of a trace&lt;br /&gt;
without holding on the trace itself. Thus, the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on&lt;br /&gt;
the sub-traces of Trace 3.2(i) starting at cycles 12, 13, and 14. This would&lt;br /&gt;
be important if we used the property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; as a sub-property of some&lt;br /&gt;
other property. For example, Assertion 3.2c holds on Trace 3.2(i) because the&lt;br /&gt;
property &amp;lt;code&amp;gt;always a&amp;lt;/code&amp;gt; holds on the 12&amp;lt;sup&amp;gt;''th''&amp;lt;/sup&amp;gt; next cycle.&lt;br /&gt;
&lt;br /&gt;
Finally, the cycles involved in calculating the left-hand side of a logical&lt;br /&gt;
implication may overlap those involved in calculating the right-hand side of&lt;br /&gt;
a logical implication. For example, consider Assertion 3.3a on Trace 3.3(i).&lt;br /&gt;
Assertion 3.3a holds on Trace 3.3(i) because the sub-property &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; &lt;br /&gt;
holds at all cycles. It holds at cycle 2 because&lt;br /&gt;
the left-hand side &amp;lt;code&amp;gt;(a &amp;amp;&amp;amp; next[6] (b))&amp;lt;/code&amp;gt; holds and in addition the right-hand&lt;br /&gt;
side &amp;lt;code&amp;gt;(c &amp;amp;&amp;amp; next[2] (d))&amp;lt;/code&amp;gt; holds. It holds at all other cycles because if the&lt;br /&gt;
“if” part of a logical implication does not hold, then the “else” part defaults&lt;br /&gt;
to true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Assertions 3.2a and 3.2c hold, but 3.2b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert a;                       (3.2a)&lt;br /&gt;
assert always a;                (3.2b)&lt;br /&gt;
assert next[12] (always a);     (3.2c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.2: The importance of the always operator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) An illustration of the overlap between the left- and right-hand sides of &amp;lt;br /&amp;gt;&lt;br /&gt;
Assertion 3.3a. Assertion 3.3a holds.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always ((a &amp;amp;&amp;amp; next[6](b)) -&amp;gt; (c &amp;amp;&amp;amp; next[2](d)));      (3.3a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.3: The current cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Previously, for example in examining Assertions 2.2a and 2.3b, we have&lt;br /&gt;
seen cases where there is an overlap between the cycles involved in satisfying&lt;br /&gt;
two different occurrences of the left-hand side of a logical implication. These&lt;br /&gt;
overlaps are caused by the presence of the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator in the property.&lt;br /&gt;
If we remove the always operator, the issue of overlap disappears from Assertions&lt;br /&gt;
2.2a and 2.3b. The overlap of Assertion 3.3a is different from the overlap&lt;br /&gt;
of Assertions 2.2a and 2.3b in a very important way: Assertion 3.3a is written&lt;br /&gt;
in such a way that the cycles involved in calculating the left-hand side of the&lt;br /&gt;
logical implication overlap those involved in calculating the right-hand side of&lt;br /&gt;
the logical implication: calculating the “if” part of the logical implication involves&lt;br /&gt;
examining the current cycle and also “looking ahead” six cycles, while&lt;br /&gt;
calculating the “then” part of the logical implication involves examining the&lt;br /&gt;
current cycle and also “looking ahead” two cycles. Thus the overlap results&lt;br /&gt;
from the logical implication itself. This style of PSL property is usually very&lt;br /&gt;
confusing to new users of PSL, and indeed it is not an intuitive way to use&lt;br /&gt;
the language. For this reason, such properties are not recommended, and the&lt;br /&gt;
&amp;lt;code&amp;gt;simple subset&amp;lt;/code&amp;gt; of PSL restricts the language in such a way that such properties&lt;br /&gt;
are not allowed. We discuss the simple subset in more detail later. For now,&lt;br /&gt;
remember that if you have written a property in which the cycles involved in&lt;br /&gt;
calculating the left-hand side of an operator overlap for more than one cycle&lt;br /&gt;
with those involved in calculating the right-hand side of the same operator,&lt;br /&gt;
you have not written a property that is in the simple subset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 3.5 Reporting a failure ===&lt;br /&gt;
&lt;br /&gt;
Consider Assertion 3.4a on the traces shown in Figure 3.4. Obviously, Assertion&lt;br /&gt;
3.4a does not hold on them. Now consider four different verification tools,&lt;br /&gt;
each of which reports the failure of Assertion 3.4a as indicated by the signal&lt;br /&gt;
called “failure” in Traces 3.4(i), 3.4(ii), 3.4(iii) and 3.4(iv). Tool 1 reports a&lt;br /&gt;
failure at cycle 4, the earliest that it can be detected. Tool 2 reports a failure&lt;br /&gt;
at cycle 4, but also at cycle 7, when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted for a second time. Tool 3&lt;br /&gt;
reports a failure at the end of the trace, and Tool 4 reports a failure at cycle&lt;br /&gt;
1, when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
Which tool is correct? The answer is that they all are. PSL defines whether&lt;br /&gt;
or not a property holds on a trace – that is all. It says nothing about when&lt;br /&gt;
a tool, dynamic or static, should report on the results of the analysis. Thus,&lt;br /&gt;
there is no meaning in asking whether Tool 1, 2, 3 or 4 is correct. All of&lt;br /&gt;
them indicate that the property fails on the trace, so all are correct. The&lt;br /&gt;
failure indications shown along the trace can be thought of as debugging aids,&lt;br /&gt;
hinting to the user where to look along the trace for the failure. As far as PSL&lt;br /&gt;
is concerned, as long as a tool indicates correctly whether or not a property&lt;br /&gt;
holds on a trace, it has done its job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig3.4.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; never b);     (3.4a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 3.4: Four different tools reporting the failure of Assertion 3.4a on the same trace&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-11-13T10:16:41Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.5 eventually! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы обсуждали то факт, что циклы, вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с циклами, вовлеченными для выполнения других утверждений сигнала. Тракт 2.3(iii) был представлен, чтобы с акцентировать это для утверждения 2.3b. Сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться в циклах с 5 до 7 (помечено “1”), в связи с утверждением сигнала a в цикле 2, и должен утверждаться в циклах с 7 до 9 (помечено “2”), в связи с утверждением в цикле 4.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_e[i:j] выполняется, если ''существует'' цикл со следующего &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; до следующих &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; циклов, в которых выполняются операнды. Например, утверждение 2.3с показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполняется тремя, четырьмя или пятью циклами позже. Нету ничего в утверждении 2.3с, что предотвращает единичное утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; из выполнения многочисленных утверждений сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, таким образом это выполняется в тракте 2.3(vi), потому что утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, в цикле 7, появляется через 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и через три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.3с также выполняется на трактах 2.3(i), 2.3(iii), 2.3(iv) и 2.3(v), т.к. есть достаточное количество утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в соответствующее время. В трактах 2.3(i), 2.3(iii) и 2.3(iv) более, чем достаточно утверждений сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения утвержденного свойства (в тракте 2.3(i) утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7 достаточно, потому что проходит 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4). В тракте 2.3(v) достаточно утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения требований утверждения 2.3c.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; концептуально расширенный оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. В то время как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; относиться к следующему циклу, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; относиться к следующему циклу, в котором выполняется некоторое Булево условие. Например, утверждение 2.4а выражает требование того, что когда бы ни принимался запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утвержден), то следующим (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) должен быть, также, запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утвержден). Утверждение 2.4а выполняется в тракте 2.4(i). Существует два утверждения сигнала &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, первое в цикле 1 и второе в цикле 10. Связанные утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; встречаются в циклах 4 и 11, соответственно, и &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; выполняется в этих циклах.        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; включает текущие циклы. Это значит, утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в текущем цикле должно считаться следующим утверждением сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. Например, рассмотрим тракт 2.4(ii). Тракт 2.4(ii) так же, как тракт 2.4(i) ожидает, что существуют дополнительные утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8 и два дополнительных утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в циклах 8 и 9, одно из которых связанно с &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;.  Утверждение 2.4а выполняется на тракте Trace 2.4(ii), потому что утверждение &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в цикле 8 считается следующим утверждением &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; для утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8. Если вы хотите исключить текущий цикл, можно вставить оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для перемещения текущего цикла оператора &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; на один цикл далее, как в утверждении 2.4b. Утверждение 2.4b не выполняется в тракте 2.4(ii). Потому что вставка оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; привела к смене циклов утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, с циклов 4, 8 и 11 для утверждения 2.4a на циклы 4, 9 и 11 для утверждения 2.4b, а в цикле 9 нету утверждений &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; в тракте 2.4(ii).           &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Утверждение 2.4a выполняется, а 2.4b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Так как мы можем использовать &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла, мы можем использовать &amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' вхождения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, для выражения требования,что всегда выдается запрос (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утвержден), готовность &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; должна быть утверждена на четвертом утверждении сигнала &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;. Утверждение 2.5а выполняется на тракте 2.5(i). Для первого утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 1, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; происходят немедленно в следующих циклах. Для второго утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 7, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не происходят немедленно  и не происходят последовательно - они распространяются через семь циклов, пресекаясь с циклами, в которых &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не подтвержден. Однако, отметим,что в обоих случаях, сигнал &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; утверждается на четвертом утверждении &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, таким образом утверждение 2.5a выполняется в тракте 2.5(i).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.5a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и с &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; также появляется в форме, которая позволяет выражать ''весь'' диапазон следующих циклов, или ''наличие'' будущего цикла в этом диапазоне. Форма &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt; показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; на всех ''i&amp;lt;sup&amp;gt;-х&amp;lt;/sup&amp;gt;'' через ''j&amp;lt;sup&amp;gt;-е&amp;lt;/sup&amp;gt;'' вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, утверждение 2.6a показывает, что когда мы видим запрос на чтение (утверждение сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) с тэгом эквивалентным &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, далее на следующих четырех передачах данных (утверждение сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), мы ожидаем увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Утверждение 2.6а использует конструкцию &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt;, которую мы рассмотрим в деталях позже. Сейчас достаточно сказать, что утверждение 2.6а показывает требование, что должно выполняться для всех возможных значениях сигнала &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Утверждение 2.6а выполняется в тракте 2.6(i), потому что после первого утверждения сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; 4, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 4 на четырех следующих утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (в циклах 5, 9, 10 и 11). Более того, на втором утверждении сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; имеет значение 5, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 5 на следующих четырех утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (циклы с 17 по 20).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того, чтобы указать, что мы ожидаем чего-либо в одном из следующих циклов с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', мы можем использовать оператор &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt;, который показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; в одном из циклов, с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, рассмотри опять утверждение 2.4a. Оно требует того, что когда бы ни приходил запрос высокого приоритета, следующим должен обработаться запрос с высоким приоритетом. Предположим вместо этого, что мы требуем, чтобы один из следующих ''двух'' грантов был для запроса с высоким приоритетом. Мы можем выразить это, используя утверждение 2.7a. Утверждение 2.7a выполняется в тракте 2.7(i), потому что всегда, когда сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утверждается, сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утверждается на одном из следующих двух утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Синтаксис спецификации диапазона для всех операторов, включая тех, которые мы еще не рассматривали, зависит от фундаментального языка. В вариантах Verilog, SystemVerilog и SystemC, это код &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. Для VHDL - это код &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. Для GDL это - &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.6a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Операторы &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.7.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.7a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;                 (2.7a)&lt;br /&gt;
   next_event_e(gnt)[1:2](high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.7: &amp;lt;code&amp;gt;next_event e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; operator provides another way to move forward, this time while&lt;br /&gt;
putting a requirement on the cycles in which we are moving. For example,&lt;br /&gt;
Assertion 2.8a states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then, starting at&lt;br /&gt;
the next cycle, signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted up until signal &amp;lt;code&amp;gt;done is&amp;lt;/code&amp;gt; asserted.&lt;br /&gt;
Assertion 2.8a requires that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; will be asserted up to, but not necessarily&lt;br /&gt;
including, the cycle where &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted. In order to include the cycle where&lt;br /&gt;
&amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted, use the operator &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended to&lt;br /&gt;
represent the extra cycle in which we require that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; should stay asserted,&lt;br /&gt;
so Assertion 2.8b states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then starting&lt;br /&gt;
from the next cycle, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted and must stay asserted up until&lt;br /&gt;
and including the cycle where done is asserted. For example, Assertion 2.8a&lt;br /&gt;
holds on Trace 2.8(i), but Assertion 2.8b does not, because &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is not asserted at cycles 4 and 10. Both Assertions 2.8a and 2.8b hold on Trace 2.8(ii):&lt;br /&gt;
Assertion 2.8a does not prohibit the assertion of busy at cycles 4 and 10 – it&lt;br /&gt;
just does not require it.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; предоставляет другой путь движения вперед, здесь накладываются требования на циклы, в которые мы движемся. Например, утверждение 2.8а показывает, что когда бы сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не был утвержден, далее, начиная со следующего цикла, сигнал  &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; должен быть утвержден до тех пор, пока не утвердиться сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Утверждение 2.8а требует, чтобы &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; был утвержден до, но необязательно включая, цикла, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Для включения этого цикла, используется оператор &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. Подчеркивание (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) служит для того, чтобы указать дополнительный цикл, для которого мы требуем, чтобы &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; оставался утвержденным, таким образом утверждение 2.8b показывает, что кода бы сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не утверждался, далее, начиная со следующего цикла, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; должен быть утвержден, и должен оставаться в таком состоянии до цикла, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, включительно. Например, утверждение 2.8а выполняется на тракте 2.8(i), а утверждение 2.8b нет, потому что &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;не утверждается в циклах 4 и 10. Оба утверждения 2.8a и 2.8b выполняются на тракте 2.8(ii): утверждение 2.8a не запрещает утверждения сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;  в циклах 4 и 10 - это просто не требуется.                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If signal done is asserted the cycle after signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, Assertion 2.8a does not require that signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; be asserted at all, while Assertion 2.8b does. That is, Assertion 2.8a holds on Trace 2.8(iii) – the fact that&lt;br /&gt;
done happens immediately after &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; leaves no cycles on which busy needs to&lt;br /&gt;
be asserted. Assertion 2.8b does not hold on Trace 2.8(iii) because of a missing&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; in the cycle in which &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; утверждается на следующем цикле после утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, утверждение 2.8a не требует, чтобы сигнал &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, в принципе, утверждался, в отличие от утверждения 2.8b. То есть, утверждение 2.8а выполняется на тракте 2.8(iii) - факт того, что &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; утверждается немедленно после утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, не оставляет циклов для утверждения &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;. Утверждение 2.8b не выполняется в тракте 2.8(iii), из-за пропущенного утверждения &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; в цикле, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;.      &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.8.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (busy until done));           (2.8a)&lt;br /&gt;
assert always (req -&amp;gt; next(busy until_ done));           (2.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.8: Операторы &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; family of operators provides an easy way to state that we&lt;br /&gt;
require some signal to be asserted before some other signal. For example, suppose that we have a pulsed signal called &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and we have the requirement that&lt;br /&gt;
before we can make a second request, the first must be acknowledged. We can&lt;br /&gt;
express this in PSL using Assertion 2.9a. We need the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; to take us forward&lt;br /&gt;
one cycle so that the &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; in (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) is sure to refer to some other&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and not the one we have just seen. To understand this, let us examine a&lt;br /&gt;
flawed version of the same specification. Consider Assertion 2.9b. It requires&lt;br /&gt;
that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at every cycle in which &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; holds. Consider,&lt;br /&gt;
for example, cycle 1 of Trace 2.9(i). Signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted. Therefore, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) must hold at cycle 1. However, it does not, because starting at&lt;br /&gt;
cycle 1 and looking forward, we first see an assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 1),&lt;br /&gt;
and only afterwards an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at cycle 3) – so &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted&lt;br /&gt;
before &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, and not the other way around. Assertion 2.9a, on the other hand,&lt;br /&gt;
states what we want: at cycle 1, for example, we require &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) to hold. Therefore, we require that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at cycle 2.&lt;br /&gt;
Starting at cycle 2 and looking forward, we first see an assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at&lt;br /&gt;
cycle 3), and only afterwards an assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 6).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Семейство операторов &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; предоставляет легкий путь для показания требований, чтобы некоторый сигнал утверждался перед каким-либо другим сигналом. Например, предположим, что у нас есть импульсный сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, и мы имеем требование, что перед тем, как мы сможем сделать второй запрос, первый должен быть определен. Мы можем выразить это в PSL используя утверждение 2.9а. Нам нужен оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для передвижения на один цикл вперед, таким образом &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; в (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) точно будет ссылаться на другие &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, а не на тот, который был только что. Чтобы это понять, исследуем недостаточную версию этой спецификации. Рассматривая утверждение 2.9b. Оно требует, чтобы (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) выполнялось на каждом цикле, в котором выполняется &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;. Например, цикл 1 тракта 2.9(i). Сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждается. Поэтому, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) должен утвердиться в цикле 1. Однако, этого не происходит, потому что, начав с первого цикла и следуя далее, изначально мы увидим утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (в цикле 1), и только после этого утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (в цикле 3) - таким образом &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждается перед &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, а не наоборот. Утверждение 2.9а, с другой стороны, показывает, что мы хотим: в цикле 1, например, мы требуем выполнения &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;). Поэтому, мы требуем, чтобы (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) выполнлся на цикле 2. Начиная с цикла 2 и двигаясь вперед, изначально мы увидим утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (на цикле 3), и только после этого утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (в цикле 6).                 &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.9.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (ack before req)); (2.9a)&lt;br /&gt;
assert always (req -&amp;gt; (ack before req)); (2.9b)&lt;br /&gt;
assert always (req -&amp;gt; next (ack before_ req)); (2.9c)&lt;br /&gt;
assert always (req -&amp;gt; (ack || next (ack before req))); (2.9d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.9 Операторы &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operator requires that its first operand happen strictly before&lt;br /&gt;
its second. In order to specify that something must happen before or at the&lt;br /&gt;
same cycle as something else, use &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended&lt;br /&gt;
to represent the cycle in which we allow an overlap between the left and&lt;br /&gt;
right sides. For example, in order to specify that behavior like that shown&lt;br /&gt;
in Trace 2.9(i) is allowed, and that in addition behavior like that shown in&lt;br /&gt;
Trace 2.9(ii) is allowed, use Assertion 2.9c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; требует, чтобы первый операнд выполнялся строго перед вторым. Для того, чтобы показать, что что-то должно выполниться перед или в том же цикле, как и что-либо иное, используется оператор &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. Подчеркивание (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) предназначено для представления цикла, в котором мы допускаем прекрытие между левой и правой сторонами. Например,  для того чтобы показать, что поведениее соответствует тем, которые показаны в тракте 2.9(i) и в тракте Trace 2.9(ii), используется утверждение 2.9с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
What if the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is allowed to come, not together with the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, but rather together with the request being acknowledged?&lt;br /&gt;
In other words, what if in addition to the behavior shown in Trace 2.9(i), we&lt;br /&gt;
want to allow the behavior shown in Trace 2.9(iii)? As we have seen previously,&lt;br /&gt;
Assertion 2.9b is not the answer. Rather, we can code Assertion 2.9d.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Что если утверждению &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; позволенно выполниться не вместе со следующим утверждением &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, но вместе с установленным запросом? Другими словами, что если в дополнение к поведению, показаному в тракте 2.9(i), мы хотим допустить поведение показанное в тракте 2.9(iii)? Как было отмечно ранее, утверждение 2.9b это не ответ. Скорее, мы напишем код утверждения 2.9d.&lt;br /&gt;
&lt;br /&gt;
===2.5 Оператор &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator allows you to specify that something must occur in&lt;br /&gt;
the future without saying exactly when. For example, Assertion 2.10a states&lt;br /&gt;
that every request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be followed at some time with&lt;br /&gt;
an acknowledge (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). There is nothing in Assertion 2.10a to&lt;br /&gt;
prevent a single acknowledge from satisfying the requirement for multiple&lt;br /&gt;
requests, thus Assertion 2.10a holds on Trace 2.10(i). We examine the issue&lt;br /&gt;
of specifying a one-to-one correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; позволяет показать, что что-либо должно произойти в будущем, без конкретного уточнения когда. Например, утверждение 2.10а показывает, что каждый запрос (утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) должен следовать в то же время, что и установленный (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). Нету ничего в утверждении 2.10а, чтобы предотвратить единичного установления из удовлетворяющих требования для множественных запросов, таким образом утверждение 2.10а выполняется на тракте 2.10(i). Мы проверили этот вопрос спецификации взаимно однозначных соответствий между сигналами в разделе 13.4.2.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) of the &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator indicates that it&lt;br /&gt;
is a strong operator. We discuss weak vs. strong temporal operators in detail&lt;br /&gt;
in Chapter 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Восклицательный знак (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) в операторе &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; показывает, что это сильный оператор. Обсуждения сильных и слабых оператров пойдет в главе 4.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.10.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.10a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; eventually! ack);       (2.10a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.10: Оператор &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-11-13T10:03:10Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.4 The until and before operators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы обсуждали то факт, что циклы, вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с циклами, вовлеченными для выполнения других утверждений сигнала. Тракт 2.3(iii) был представлен, чтобы с акцентировать это для утверждения 2.3b. Сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться в циклах с 5 до 7 (помечено “1”), в связи с утверждением сигнала a в цикле 2, и должен утверждаться в циклах с 7 до 9 (помечено “2”), в связи с утверждением в цикле 4.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_e[i:j] выполняется, если ''существует'' цикл со следующего &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; до следующих &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; циклов, в которых выполняются операнды. Например, утверждение 2.3с показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполняется тремя, четырьмя или пятью циклами позже. Нету ничего в утверждении 2.3с, что предотвращает единичное утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; из выполнения многочисленных утверждений сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, таким образом это выполняется в тракте 2.3(vi), потому что утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, в цикле 7, появляется через 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и через три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.3с также выполняется на трактах 2.3(i), 2.3(iii), 2.3(iv) и 2.3(v), т.к. есть достаточное количество утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в соответствующее время. В трактах 2.3(i), 2.3(iii) и 2.3(iv) более, чем достаточно утверждений сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения утвержденного свойства (в тракте 2.3(i) утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7 достаточно, потому что проходит 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4). В тракте 2.3(v) достаточно утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения требований утверждения 2.3c.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; концептуально расширенный оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. В то время как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; относиться к следующему циклу, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; относиться к следующему циклу, в котором выполняется некоторое Булево условие. Например, утверждение 2.4а выражает требование того, что когда бы ни принимался запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утвержден), то следующим (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) должен быть, также, запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утвержден). Утверждение 2.4а выполняется в тракте 2.4(i). Существует два утверждения сигнала &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, первое в цикле 1 и второе в цикле 10. Связанные утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; встречаются в циклах 4 и 11, соответственно, и &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; выполняется в этих циклах.        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; включает текущие циклы. Это значит, утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в текущем цикле должно считаться следующим утверждением сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. Например, рассмотрим тракт 2.4(ii). Тракт 2.4(ii) так же, как тракт 2.4(i) ожидает, что существуют дополнительные утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8 и два дополнительных утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в циклах 8 и 9, одно из которых связанно с &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;.  Утверждение 2.4а выполняется на тракте Trace 2.4(ii), потому что утверждение &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в цикле 8 считается следующим утверждением &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; для утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8. Если вы хотите исключить текущий цикл, можно вставить оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для перемещения текущего цикла оператора &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; на один цикл далее, как в утверждении 2.4b. Утверждение 2.4b не выполняется в тракте 2.4(ii). Потому что вставка оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; привела к смене циклов утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, с циклов 4, 8 и 11 для утверждения 2.4a на циклы 4, 9 и 11 для утверждения 2.4b, а в цикле 9 нету утверждений &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; в тракте 2.4(ii).           &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Утверждение 2.4a выполняется, а 2.4b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Так как мы можем использовать &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла, мы можем использовать &amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' вхождения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, для выражения требования,что всегда выдается запрос (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утвержден), готовность &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; должна быть утверждена на четвертом утверждении сигнала &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;. Утверждение 2.5а выполняется на тракте 2.5(i). Для первого утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 1, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; происходят немедленно в следующих циклах. Для второго утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 7, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не происходят немедленно  и не происходят последовательно - они распространяются через семь циклов, пресекаясь с циклами, в которых &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не подтвержден. Однако, отметим,что в обоих случаях, сигнал &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; утверждается на четвертом утверждении &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, таким образом утверждение 2.5a выполняется в тракте 2.5(i).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.5a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и с &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; также появляется в форме, которая позволяет выражать ''весь'' диапазон следующих циклов, или ''наличие'' будущего цикла в этом диапазоне. Форма &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt; показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; на всех ''i&amp;lt;sup&amp;gt;-х&amp;lt;/sup&amp;gt;'' через ''j&amp;lt;sup&amp;gt;-е&amp;lt;/sup&amp;gt;'' вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, утверждение 2.6a показывает, что когда мы видим запрос на чтение (утверждение сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) с тэгом эквивалентным &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, далее на следующих четырех передачах данных (утверждение сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), мы ожидаем увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Утверждение 2.6а использует конструкцию &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt;, которую мы рассмотрим в деталях позже. Сейчас достаточно сказать, что утверждение 2.6а показывает требование, что должно выполняться для всех возможных значениях сигнала &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Утверждение 2.6а выполняется в тракте 2.6(i), потому что после первого утверждения сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; 4, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 4 на четырех следующих утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (в циклах 5, 9, 10 и 11). Более того, на втором утверждении сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; имеет значение 5, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 5 на следующих четырех утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (циклы с 17 по 20).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того, чтобы указать, что мы ожидаем чего-либо в одном из следующих циклов с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', мы можем использовать оператор &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt;, который показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; в одном из циклов, с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, рассмотри опять утверждение 2.4a. Оно требует того, что когда бы ни приходил запрос высокого приоритета, следующим должен обработаться запрос с высоким приоритетом. Предположим вместо этого, что мы требуем, чтобы один из следующих ''двух'' грантов был для запроса с высоким приоритетом. Мы можем выразить это, используя утверждение 2.7a. Утверждение 2.7a выполняется в тракте 2.7(i), потому что всегда, когда сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утверждается, сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утверждается на одном из следующих двух утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Синтаксис спецификации диапазона для всех операторов, включая тех, которые мы еще не рассматривали, зависит от фундаментального языка. В вариантах Verilog, SystemVerilog и SystemC, это код &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. Для VHDL - это код &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. Для GDL это - &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.6a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Операторы &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.7.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.7a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;                 (2.7a)&lt;br /&gt;
   next_event_e(gnt)[1:2](high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.7: &amp;lt;code&amp;gt;next_event e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; operator provides another way to move forward, this time while&lt;br /&gt;
putting a requirement on the cycles in which we are moving. For example,&lt;br /&gt;
Assertion 2.8a states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then, starting at&lt;br /&gt;
the next cycle, signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted up until signal &amp;lt;code&amp;gt;done is&amp;lt;/code&amp;gt; asserted.&lt;br /&gt;
Assertion 2.8a requires that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; will be asserted up to, but not necessarily&lt;br /&gt;
including, the cycle where &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted. In order to include the cycle where&lt;br /&gt;
&amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted, use the operator &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended to&lt;br /&gt;
represent the extra cycle in which we require that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; should stay asserted,&lt;br /&gt;
so Assertion 2.8b states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then starting&lt;br /&gt;
from the next cycle, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted and must stay asserted up until&lt;br /&gt;
and including the cycle where done is asserted. For example, Assertion 2.8a&lt;br /&gt;
holds on Trace 2.8(i), but Assertion 2.8b does not, because &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is not asserted at cycles 4 and 10. Both Assertions 2.8a and 2.8b hold on Trace 2.8(ii):&lt;br /&gt;
Assertion 2.8a does not prohibit the assertion of busy at cycles 4 and 10 – it&lt;br /&gt;
just does not require it.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; предоставляет другой путь движения вперед, здесь накладываются требования на циклы, в которые мы движемся. Например, утверждение 2.8а показывает, что когда бы сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не был утвержден, далее, начиная со следующего цикла, сигнал  &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; должен быть утвержден до тех пор, пока не утвердиться сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Утверждение 2.8а требует, чтобы &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; был утвержден до, но необязательно включая, цикла, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;. Для включения этого цикла, используется оператор &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. Подчеркивание (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) служит для того, чтобы указать дополнительный цикл, для которого мы требуем, чтобы &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; оставался утвержденным, таким образом утверждение 2.8b показывает, что кода бы сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; не утверждался, далее, начиная со следующего цикла, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; должен быть утвержден, и должен оставаться в таком состоянии до цикла, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;, включительно. Например, утверждение 2.8а выполняется на тракте 2.8(i), а утверждение 2.8b нет, потому что &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;не утверждается в циклах 4 и 10. Оба утверждения 2.8a и 2.8b выполняются на тракте 2.8(ii): утверждение 2.8a не запрещает утверждения сигнала &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;  в циклах 4 и 10 - это просто не требуется.                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
If signal done is asserted the cycle after signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, Assertion 2.8a does not require that signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; be asserted at all, while Assertion 2.8b does. That is, Assertion 2.8a holds on Trace 2.8(iii) – the fact that&lt;br /&gt;
done happens immediately after &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; leaves no cycles on which busy needs to&lt;br /&gt;
be asserted. Assertion 2.8b does not hold on Trace 2.8(iii) because of a missing&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; in the cycle in which &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Если сигнал &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; утверждается на следующем цикле после утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, утверждение 2.8a не требует, чтобы сигнал &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;, в принципе, утверждался, в отличие от утверждения 2.8b. То есть, утверждение 2.8а выполняется на тракте 2.8(iii) - факт того, что &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; утверждается немедленно после утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, не оставляет циклов для утверждения &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt;. Утверждение 2.8b не выполняется в тракте 2.8(iii), из-за пропущенного утверждения &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; в цикле, в котором утверждается &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;.      &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.8.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (busy until done));           (2.8a)&lt;br /&gt;
assert always (req -&amp;gt; next(busy until_ done));           (2.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.8: Операторы &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; family of operators provides an easy way to state that we&lt;br /&gt;
require some signal to be asserted before some other signal. For example, suppose that we have a pulsed signal called &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and we have the requirement that&lt;br /&gt;
before we can make a second request, the first must be acknowledged. We can&lt;br /&gt;
express this in PSL using Assertion 2.9a. We need the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; to take us forward&lt;br /&gt;
one cycle so that the &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; in (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) is sure to refer to some other&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and not the one we have just seen. To understand this, let us examine a&lt;br /&gt;
flawed version of the same specification. Consider Assertion 2.9b. It requires&lt;br /&gt;
that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at every cycle in which &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; holds. Consider,&lt;br /&gt;
for example, cycle 1 of Trace 2.9(i). Signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted. Therefore, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) must hold at cycle 1. However, it does not, because starting at&lt;br /&gt;
cycle 1 and looking forward, we first see an assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 1),&lt;br /&gt;
and only afterwards an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at cycle 3) – so &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted&lt;br /&gt;
before &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, and not the other way around. Assertion 2.9a, on the other hand,&lt;br /&gt;
states what we want: at cycle 1, for example, we require &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) to hold. Therefore, we require that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at cycle 2.&lt;br /&gt;
Starting at cycle 2 and looking forward, we first see an assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at&lt;br /&gt;
cycle 3), and only afterwards an assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 6).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Семейство операторов &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; предоставляет легкий путь для показания требований, чтобы некоторый сигнал утверждался перед каким-либо другим сигналом. Например, предположим, что у нас есть импульсный сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, и мы имеем требование, что перед тем, как мы сможем сделать второй запрос, первый должен быть определен. Мы можем выразить это в PSL используя утверждение 2.9а. Нам нужен оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для передвижения на один цикл вперед, таким образом &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; в (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) точно будет ссылаться на другие &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, а не на тот, который был только что. Чтобы это понять, исследуем недостаточную версию этой спецификации. Рассматривая утверждение 2.9b. Оно требует, чтобы (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) выполнялось на каждом цикле, в котором выполняется &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;. Например, цикл 1 тракта 2.9(i). Сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждается. Поэтому, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) должен утвердиться в цикле 1. Однако, этого не происходит, потому что, начав с первого цикла и следуя далее, изначально мы увидим утверждения сигнала &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (в цикле 1), и только после этого утверждение сигнала &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (в цикле 3) - таким образом &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утверждается перед &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, а не наоборот. Утверждение 2.9а, с другой стороны, показывает, что мы хотим: в цикле 1, например, мы требуем выполнения &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;). Поэтому, мы требуем, чтобы (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) выполнлся на цикле 2. Начиная с цикла 2 и двигаясь вперед, изначально мы увидим утверждение &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (на цикле 3), и только после этого утверждение &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (в цикле 6).                 &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.9.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (ack before req)); (2.9a)&lt;br /&gt;
assert always (req -&amp;gt; (ack before req)); (2.9b)&lt;br /&gt;
assert always (req -&amp;gt; next (ack before_ req)); (2.9c)&lt;br /&gt;
assert always (req -&amp;gt; (ack || next (ack before req))); (2.9d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.9 Операторы &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operator requires that its first operand happen strictly before&lt;br /&gt;
its second. In order to specify that something must happen before or at the&lt;br /&gt;
same cycle as something else, use &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended&lt;br /&gt;
to represent the cycle in which we allow an overlap between the left and&lt;br /&gt;
right sides. For example, in order to specify that behavior like that shown&lt;br /&gt;
in Trace 2.9(i) is allowed, and that in addition behavior like that shown in&lt;br /&gt;
Trace 2.9(ii) is allowed, use Assertion 2.9c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; требует, чтобы первый операнд выполнялся строго перед вторым. Для того, чтобы показать, что что-то должно выполниться перед или в том же цикле, как и что-либо иное, используется оператор &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. Подчеркивание (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) предназначено для представления цикла, в котором мы допускаем прекрытие между левой и правой сторонами. Например,  для того чтобы показать, что поведениее соответствует тем, которые показаны в тракте 2.9(i) и в тракте Trace 2.9(ii), используется утверждение 2.9с.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
What if the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is allowed to come, not together with the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, but rather together with the request being acknowledged?&lt;br /&gt;
In other words, what if in addition to the behavior shown in Trace 2.9(i), we&lt;br /&gt;
want to allow the behavior shown in Trace 2.9(iii)? As we have seen previously,&lt;br /&gt;
Assertion 2.9b is not the answer. Rather, we can code Assertion 2.9d.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Что если утверждению &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; позволенно выполниться не вместе со следующим утверждением &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, но вместе с установленным запросом? Другими словами, что если в дополнение к поведению, показаному в тракте 2.9(i), мы хотим допустить поведение показанное в тракте 2.9(iii)? Как было отмечно ранее, утверждение 2.9b это не ответ. Скорее, мы напишем код утверждения 2.9d.&lt;br /&gt;
&lt;br /&gt;
===2.5 &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator allows you to specify that something must occur in&lt;br /&gt;
the future without saying exactly when. For example, Assertion 2.10a states&lt;br /&gt;
that every request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be followed at some time with&lt;br /&gt;
an acknowledge (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). There is nothing in Assertion 2.10a to&lt;br /&gt;
prevent a single acknowledge from satisfying the requirement for multiple&lt;br /&gt;
requests, thus Assertion 2.10a holds on Trace 2.10(i). We examine the issue&lt;br /&gt;
of specifying a one-to-one correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
The exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) of the &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator indicates that it&lt;br /&gt;
is a strong operator. We discuss weak vs. strong temporal operators in detail&lt;br /&gt;
in Chapter 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.10.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.10a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; eventually! ack);       (2.10a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.10: The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-11-10T15:51:48Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.3 вариации next, включая next_event */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы обсуждали то факт, что циклы, вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с циклами, вовлеченными для выполнения других утверждений сигнала. Тракт 2.3(iii) был представлен, чтобы с акцентировать это для утверждения 2.3b. Сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться в циклах с 5 до 7 (помечено “1”), в связи с утверждением сигнала a в цикле 2, и должен утверждаться в циклах с 7 до 9 (помечено “2”), в связи с утверждением в цикле 4.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_e[i:j] выполняется, если ''существует'' цикл со следующего &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; до следующих &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; циклов, в которых выполняются операнды. Например, утверждение 2.3с показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполняется тремя, четырьмя или пятью циклами позже. Нету ничего в утверждении 2.3с, что предотвращает единичное утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; из выполнения многочисленных утверждений сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, таким образом это выполняется в тракте 2.3(vi), потому что утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, в цикле 7, появляется через 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и через три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.3с также выполняется на трактах 2.3(i), 2.3(iii), 2.3(iv) и 2.3(v), т.к. есть достаточное количество утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в соответствующее время. В трактах 2.3(i), 2.3(iii) и 2.3(iv) более, чем достаточно утверждений сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения утвержденного свойства (в тракте 2.3(i) утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7 достаточно, потому что проходит 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4). В тракте 2.3(v) достаточно утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения требований утверждения 2.3c.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; концептуально расширенный оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. В то время как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; относиться к следующему циклу, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; относиться к следующему циклу, в котором выполняется некоторое Булево условие. Например, утверждение 2.4а выражает требование того, что когда бы ни принимался запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утвержден), то следующим (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) должен быть, также, запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утвержден). Утверждение 2.4а выполняется в тракте 2.4(i). Существует два утверждения сигнала &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, первое в цикле 1 и второе в цикле 10. Связанные утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; встречаются в циклах 4 и 11, соответственно, и &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; выполняется в этих циклах.        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; включает текущие циклы. Это значит, утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в текущем цикле должно считаться следующим утверждением сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. Например, рассмотрим тракт 2.4(ii). Тракт 2.4(ii) так же, как тракт 2.4(i) ожидает, что существуют дополнительные утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8 и два дополнительных утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в циклах 8 и 9, одно из которых связанно с &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;.  Утверждение 2.4а выполняется на тракте Trace 2.4(ii), потому что утверждение &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в цикле 8 считается следующим утверждением &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; для утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8. Если вы хотите исключить текущий цикл, можно вставить оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для перемещения текущего цикла оператора &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; на один цикл далее, как в утверждении 2.4b. Утверждение 2.4b не выполняется в тракте 2.4(ii). Потому что вставка оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; привела к смене циклов утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, с циклов 4, 8 и 11 для утверждения 2.4a на циклы 4, 9 и 11 для утверждения 2.4b, а в цикле 9 нету утверждений &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; в тракте 2.4(ii).           &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Утверждение 2.4a выполняется, а 2.4b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Так как мы можем использовать &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла, мы можем использовать &amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; для индикации ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' вхождения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, для выражения требования,что всегда выдается запрос (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; утвержден), готовность &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; должна быть утверждена на четвертом утверждении сигнала &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;. Утверждение 2.5а выполняется на тракте 2.5(i). Для первого утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 1, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; происходят немедленно в следующих циклах. Для второго утверждения &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, в цикле 7, четыре утверждения &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не происходят немедленно  и не происходят последовательно - они распространяются через семь циклов, пресекаясь с циклами, в которых &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; не подтвержден. Однако, отметим,что в обоих случаях, сигнал &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; утверждается на четвертом утверждении &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, таким образом утверждение 2.5a выполняется в тракте 2.5(i).        &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.5a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Как и с &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; также появляется в форме, которая позволяет выражать ''весь'' диапазон следующих циклов, или ''наличие'' будущего цикла в этом диапазоне. Форма &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt; показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; на всех ''i&amp;lt;sup&amp;gt;-х&amp;lt;/sup&amp;gt;'' через ''j&amp;lt;sup&amp;gt;-е&amp;lt;/sup&amp;gt;'' вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, утверждение 2.6a показывает, что когда мы видим запрос на чтение (утверждение сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) с тэгом эквивалентным &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, далее на следующих четырех передачах данных (утверждение сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), мы ожидаем увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Утверждение 2.6а использует конструкцию &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt;, которую мы рассмотрим в деталях позже. Сейчас достаточно сказать, что утверждение 2.6а показывает требование, что должно выполняться для всех возможных значениях сигнала &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Утверждение 2.6а выполняется в тракте 2.6(i), потому что после первого утверждения сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; 4, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 4 на четырех следующих утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (в циклах 5, 9, 10 и 11). Более того, на втором утверждении сигнала &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, где &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; имеет значение 5, значение &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;, также, 5 на следующих четырех утверждениях сигнала &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (циклы с 17 по 20).    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для того, чтобы указать, что мы ожидаем чего-либо в одном из следующих циклов с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', мы можем использовать оператор &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt;, который показывает, что мы ожидаем выполнения &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; в одном из циклов, с ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' по ''j&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'', вхождения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Например, рассмотри опять утверждение 2.4a. Оно требует того, что когда бы ни приходил запрос высокого приоритета, следующим должен обработаться запрос с высоким приоритетом. Предположим вместо этого, что мы требуем, чтобы один из следующих ''двух'' грантов был для запроса с высоким приоритетом. Мы можем выразить это, используя утверждение 2.7a. Утверждение 2.7a выполняется в тракте 2.7(i), потому что всегда, когда сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утверждается, сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утверждается на одном из следующих двух утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Синтаксис спецификации диапазона для всех операторов, включая тех, которые мы еще не рассматривали, зависит от фундаментального языка. В вариантах Verilog, SystemVerilog и SystemC, это код &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. Для VHDL - это код &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. Для GDL это - &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Утверждение 2.6a выполняется&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.7.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.7a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;                 (2.7a)&lt;br /&gt;
   next_event_e(gnt)[1:2](high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.7: &amp;lt;code&amp;gt;next_event e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; operator provides another way to move forward, this time while&lt;br /&gt;
putting a requirement on the cycles in which we are moving. For example,&lt;br /&gt;
Assertion 2.8a states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then, starting at&lt;br /&gt;
the next cycle, signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted up until signal &amp;lt;code&amp;gt;done is&amp;lt;/code&amp;gt; asserted.&lt;br /&gt;
Assertion 2.8a requires that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; will be asserted up to, but not necessarily&lt;br /&gt;
including, the cycle where &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted. In order to include the cycle where&lt;br /&gt;
&amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted, use the operator &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended to&lt;br /&gt;
represent the extra cycle in which we require that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; should stay asserted,&lt;br /&gt;
so Assertion 2.8b states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then starting&lt;br /&gt;
from the next cycle, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted and must stay asserted up until&lt;br /&gt;
and including the cycle where done is asserted. For example, Assertion 2.8a&lt;br /&gt;
holds on Trace 2.8(i), but Assertion 2.8b does not, because &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is not asserted at cycles 4 and 10. Both Assertions 2.8a and 2.8b hold on Trace 2.8(ii):&lt;br /&gt;
Assertion 2.8a does not prohibit the assertion of busy at cycles 4 and 10 – it&lt;br /&gt;
just does not require it.&lt;br /&gt;
&lt;br /&gt;
If signal done is asserted the cycle after signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, Assertion 2.8a does not require that signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; be asserted at all, while Assertion 2.8b does. That is, Assertion 2.8a holds on Trace 2.8(iii) – the fact that&lt;br /&gt;
done happens immediately after &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; leaves no cycles on which busy needs to&lt;br /&gt;
be asserted. Assertion 2.8b does not hold on Trace 2.8(iii) because of a missing&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; in the cycle in which &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.8.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (busy until done));           (2.8a)&lt;br /&gt;
assert always (req -&amp;gt; next(busy until_ done));           (2.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.8: The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; family of operators provides an easy way to state that we&lt;br /&gt;
require some signal to be asserted before some other signal. For example, suppose that we have a pulsed signal called &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and we have the requirement that&lt;br /&gt;
before we can make a second request, the first must be acknowledged. We can&lt;br /&gt;
express this in PSL using Assertion 2.9a. We need the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; to take us forward&lt;br /&gt;
one cycle so that the &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; in (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) is sure to refer to some other&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and not the one we have just seen. To understand this, let us examine a&lt;br /&gt;
flawed version of the same specification. Consider Assertion 2.9b. It requires&lt;br /&gt;
that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at every cycle in which &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; holds. Consider,&lt;br /&gt;
for example, cycle 1 of Trace 2.9(i). Signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted. Therefore, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) must hold at cycle 1. However, it does not, because starting at&lt;br /&gt;
cycle 1 and looking forward, we first see an assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 1),&lt;br /&gt;
and only afterwards an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at cycle 3) – so &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted&lt;br /&gt;
before &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, and not the other way around. Assertion 2.9a, on the other hand,&lt;br /&gt;
states what we want: at cycle 1, for example, we require &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) to hold. Therefore, we require that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at cycle 2.&lt;br /&gt;
Starting at cycle 2 and looking forward, we first see an assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at&lt;br /&gt;
cycle 3), and only afterwards an assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.9.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (ack before req)); (2.9a)&lt;br /&gt;
assert always (req -&amp;gt; (ack before req)); (2.9b)&lt;br /&gt;
assert always (req -&amp;gt; next (ack before_ req)); (2.9c)&lt;br /&gt;
assert always (req -&amp;gt; (ack || next (ack before req))); (2.9d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.9 The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operator requires that its first operand happen strictly before&lt;br /&gt;
its second. In order to specify that something must happen before or at the&lt;br /&gt;
same cycle as something else, use &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended&lt;br /&gt;
to represent the cycle in which we allow an overlap between the left and&lt;br /&gt;
right sides. For example, in order to specify that behavior like that shown&lt;br /&gt;
in Trace 2.9(i) is allowed, and that in addition behavior like that shown in&lt;br /&gt;
Trace 2.9(ii) is allowed, use Assertion 2.9c.&lt;br /&gt;
&lt;br /&gt;
What if the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is allowed to come, not together with the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, but rather together with the request being acknowledged?&lt;br /&gt;
In other words, what if in addition to the behavior shown in Trace 2.9(i), we&lt;br /&gt;
want to allow the behavior shown in Trace 2.9(iii)? As we have seen previously,&lt;br /&gt;
Assertion 2.9b is not the answer. Rather, we can code Assertion 2.9d.&lt;br /&gt;
&lt;br /&gt;
===2.5 &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator allows you to specify that something must occur in&lt;br /&gt;
the future without saying exactly when. For example, Assertion 2.10a states&lt;br /&gt;
that every request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be followed at some time with&lt;br /&gt;
an acknowledge (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). There is nothing in Assertion 2.10a to&lt;br /&gt;
prevent a single acknowledge from satisfying the requirement for multiple&lt;br /&gt;
requests, thus Assertion 2.10a holds on Trace 2.10(i). We examine the issue&lt;br /&gt;
of specifying a one-to-one correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
The exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) of the &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator indicates that it&lt;br /&gt;
is a strong operator. We discuss weak vs. strong temporal operators in detail&lt;br /&gt;
in Chapter 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.10.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.10a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; eventually! ack);       (2.10a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.10: The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-11-08T14:25:46Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.3 вариации next, включая next_event */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы обсуждали то факт, что циклы, вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с циклами, вовлеченными для выполнения других утверждений сигнала. Тракт 2.3(iii) был представлен, чтобы с акцентировать это для утверждения 2.3b. Сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться в циклах с 5 до 7 (помечено “1”), в связи с утверждением сигнала a в цикле 2, и должен утверждаться в циклах с 7 до 9 (помечено “2”), в связи с утверждением в цикле 4.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_e[i:j] выполняется, если ''существует'' цикл со следующего &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; до следующих &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; циклов, в которых выполняются операнды. Например, утверждение 2.3с показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполняется тремя, четырьмя или пятью циклами позже. Нету ничего в утверждении 2.3с, что предотвращает единичное утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; из выполнения многочисленных утверждений сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, таким образом это выполняется в тракте 2.3(vi), потому что утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, в цикле 7, появляется через 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и через три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.3с также выполняется на трактах 2.3(i), 2.3(iii), 2.3(iv) и 2.3(v), т.к. есть достаточное количество утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в соответствующее время. В трактах 2.3(i), 2.3(iii) и 2.3(iv) более, чем достаточно утверждений сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения утвержденного свойства (в тракте 2.3(i) утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7 достаточно, потому что проходит 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4). В тракте 2.3(v) достаточно утверждений сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; для выполнения требований утверждения 2.3c.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; концептуально расширенный оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. В то время как &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; относиться к следующему циклу, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; относиться к следующему циклу, в котором выполняется некоторое Булево условие. Например, утверждение 2.4а выражает требование того, что когда бы ни принимался запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; утвержден), то следующим (утверждение сигнала &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) должен быть, также, запрос с высоким приоритетом (сигнал &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; утвержден). Утверждение 2.4а выполняется в тракте 2.4(i). Существует два утверждения сигнала &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, первое в цикле 1 и второе в цикле 10. Связанные утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; встречаются в циклах 4 и 11, соответственно, и &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; выполняется в этих циклах.        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оператор &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; включает текущие циклы. Это значит, утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в текущем цикле должно считаться следующим утверждением сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. Например, рассмотрим тракт 2.4(ii). Тракт 2.4(ii) так же, как тракт 2.4(i) ожидает, что существуют дополнительные утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8 и два дополнительных утверждения &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в циклах 8 и 9, одно из которых связанно с &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;.  Утверждение 2.4а выполняется на тракте Trace 2.4(ii), потому что утверждение &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; в цикле 8 считается следующим утверждением &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; для утверждения &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; в цикле 8. Если вы хотите исключить текущий цикл, можно вставить оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; для перемещения текущего цикла оператора &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; на один цикл далее, как в утверждении 2.4b. Утверждение 2.4b не выполняется в тракте 2.4(ii). Потому что вставка оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; привела к смене циклов утверждений &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;, с циклов 4, 8 и 11 для утверждения 2.4a на циклы 4, 9 и 11 для утверждения 2.4b, а в цикле 9 нету утверждений &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; в тракте 2.4(ii).           &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Утверждение 2.4a выполняется, а 2.4b нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.7.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.7a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;                 (2.7a)&lt;br /&gt;
   next_event_e(gnt)[1:2](high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.7: &amp;lt;code&amp;gt;next_event e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; operator provides another way to move forward, this time while&lt;br /&gt;
putting a requirement on the cycles in which we are moving. For example,&lt;br /&gt;
Assertion 2.8a states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then, starting at&lt;br /&gt;
the next cycle, signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted up until signal &amp;lt;code&amp;gt;done is&amp;lt;/code&amp;gt; asserted.&lt;br /&gt;
Assertion 2.8a requires that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; will be asserted up to, but not necessarily&lt;br /&gt;
including, the cycle where &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted. In order to include the cycle where&lt;br /&gt;
&amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted, use the operator &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended to&lt;br /&gt;
represent the extra cycle in which we require that &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; should stay asserted,&lt;br /&gt;
so Assertion 2.8b states that whenever signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then starting&lt;br /&gt;
from the next cycle, &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; must be asserted and must stay asserted up until&lt;br /&gt;
and including the cycle where done is asserted. For example, Assertion 2.8a&lt;br /&gt;
holds on Trace 2.8(i), but Assertion 2.8b does not, because &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; is not asserted at cycles 4 and 10. Both Assertions 2.8a and 2.8b hold on Trace 2.8(ii):&lt;br /&gt;
Assertion 2.8a does not prohibit the assertion of busy at cycles 4 and 10 – it&lt;br /&gt;
just does not require it.&lt;br /&gt;
&lt;br /&gt;
If signal done is asserted the cycle after signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, Assertion 2.8a does not require that signal &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; be asserted at all, while Assertion 2.8b does. That is, Assertion 2.8a holds on Trace 2.8(iii) – the fact that&lt;br /&gt;
done happens immediately after &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; leaves no cycles on which busy needs to&lt;br /&gt;
be asserted. Assertion 2.8b does not hold on Trace 2.8(iii) because of a missing&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;busy&amp;lt;/code&amp;gt; in the cycle in which &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; is asserted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.8.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (busy until done));           (2.8a)&lt;br /&gt;
assert always (req -&amp;gt; next(busy until_ done));           (2.8b)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.8: The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;until_&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; family of operators provides an easy way to state that we&lt;br /&gt;
require some signal to be asserted before some other signal. For example, suppose that we have a pulsed signal called &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and we have the requirement that&lt;br /&gt;
before we can make a second request, the first must be acknowledged. We can&lt;br /&gt;
express this in PSL using Assertion 2.9a. We need the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; to take us forward&lt;br /&gt;
one cycle so that the &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; in (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) is sure to refer to some other&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, and not the one we have just seen. To understand this, let us examine a&lt;br /&gt;
flawed version of the same specification. Consider Assertion 2.9b. It requires&lt;br /&gt;
that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at every cycle in which &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; holds. Consider,&lt;br /&gt;
for example, cycle 1 of Trace 2.9(i). Signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted. Therefore, (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) must hold at cycle 1. However, it does not, because starting at&lt;br /&gt;
cycle 1 and looking forward, we first see an assertion of signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 1),&lt;br /&gt;
and only afterwards an assertion of signal &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at cycle 3) – so &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted&lt;br /&gt;
before &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;, and not the other way around. Assertion 2.9a, on the other hand,&lt;br /&gt;
states what we want: at cycle 1, for example, we require &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) to hold. Therefore, we require that (&amp;lt;code&amp;gt;ack before req&amp;lt;/code&amp;gt;) hold at cycle 2.&lt;br /&gt;
Starting at cycle 2 and looking forward, we first see an assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; (at&lt;br /&gt;
cycle 3), and only afterwards an assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; (at cycle 6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.9.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; next (ack before req)); (2.9a)&lt;br /&gt;
assert always (req -&amp;gt; (ack before req)); (2.9b)&lt;br /&gt;
assert always (req -&amp;gt; next (ack before_ req)); (2.9c)&lt;br /&gt;
assert always (req -&amp;gt; (ack || next (ack before req))); (2.9d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.9 The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt; operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operator requires that its first operand happen strictly before&lt;br /&gt;
its second. In order to specify that something must happen before or at the&lt;br /&gt;
same cycle as something else, use &amp;lt;code&amp;gt;before_&amp;lt;/code&amp;gt;. The underscore (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) is intended&lt;br /&gt;
to represent the cycle in which we allow an overlap between the left and&lt;br /&gt;
right sides. For example, in order to specify that behavior like that shown&lt;br /&gt;
in Trace 2.9(i) is allowed, and that in addition behavior like that shown in&lt;br /&gt;
Trace 2.9(ii) is allowed, use Assertion 2.9c.&lt;br /&gt;
&lt;br /&gt;
What if the assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is allowed to come, not together with the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, but rather together with the request being acknowledged?&lt;br /&gt;
In other words, what if in addition to the behavior shown in Trace 2.9(i), we&lt;br /&gt;
want to allow the behavior shown in Trace 2.9(iii)? As we have seen previously,&lt;br /&gt;
Assertion 2.9b is not the answer. Rather, we can code Assertion 2.9d.&lt;br /&gt;
&lt;br /&gt;
===2.5 &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator allows you to specify that something must occur in&lt;br /&gt;
the future without saying exactly when. For example, Assertion 2.10a states&lt;br /&gt;
that every request (assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;) must be followed at some time with&lt;br /&gt;
an acknowledge (assertion of &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;). There is nothing in Assertion 2.10a to&lt;br /&gt;
prevent a single acknowledge from satisfying the requirement for multiple&lt;br /&gt;
requests, thus Assertion 2.10a holds on Trace 2.10(i). We examine the issue&lt;br /&gt;
of specifying a one-to-one correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
The exclamation point (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;) of the &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator indicates that it&lt;br /&gt;
is a strong operator. We discuss weak vs. strong temporal operators in detail&lt;br /&gt;
in Chapter 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.10.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.10a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt; eventually! ack);       (2.10a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.10: The &amp;lt;code&amp;gt;eventually!&amp;lt;/code&amp;gt; operator&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-11-01T17:40:18Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.3 вариации next, включая next_event */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ранее мы обсуждали то факт, что циклы, вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с циклами, вовлеченными для выполнения других утверждений сигнала. Тракт 2.3(iii) был представлен, чтобы с акцентировать это для утверждения 2.3b. Сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться в циклах с 5 до 7 (помечено “1”), в связи с утверждением сигнала a в цикле 2, и должен утверждаться в циклах с 7 до 9 (помечено “2”), в связи с утверждением в цикле 4.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_e[i:j] выполняется, если ''существует'' цикл со следующего &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; до следующих &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; циклов, в которых выполняются операнды. Например, утверждение 2.3с показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполняется тремя, четырьмя или пятью циклами позже. Нету ничего в утверждении 2.3с, что предотвращает единичное утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; из выполнения многочисленных утверждений сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, таким образом это выполняется в тракте 2.3(vi), потому что утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, в цикле 7, появляется через 5 циклов после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 2, и через три цикла после утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в цикле 4.   &lt;br /&gt;
&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Assertion 2.4a holds, but 2.4b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-10-31T10:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.3 вариации next, включая next_event */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство next_a[i:j] выполняется если его операнд выполняется во ''всех'' циклах от ''i&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего, до ''j&amp;lt;sup&amp;gt;-го&amp;lt;/sup&amp;gt;'' следующего цикла включительно. Например, утверждение 2.3b показывает, что когда бы сигнал a не выполнялся, сигнал b выполняется тремя, четырьмя, пятью циклами позже. Выполняется в тракте 2.3(iii) и не выполняется в трактах 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v) или 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Assertion 2.4a holds, but 2.4b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-10-31T09:43:43Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.3 Variations on next including next_event */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 вариации &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, включая &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в следующем цикле. Вариации оператора &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; позволяют указывать ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл и диапазоны будущих циклов. Свойство &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; выполняется, если его операнд выполняется в ''n&amp;lt;sup&amp;gt;-й&amp;lt;/sup&amp;gt;'' следующий цикл. Например, утверждение 2.3а показывает, что когда бы сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; не выполнялся, сигнал &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; выполниться тремя циклами позже. Утверждение 2.3а выполняется в тактах 2.3(i), 2.3(iii), 2.3(iv), но не выполняется в трактах 2.3(ii) или 2.3(v), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 7, и не выполняется в тракте 2.3(vi), потому что отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в цикле 5.&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Assertion 2.4a holds, but 2.4b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-10-31T09:04:30Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 2.2 Оператор next */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. Логическая импликация &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; выполняется, если prop1 не выполняется или prop2 выполняется. Это хорошо представляется, если принять это, как выражение вида if-then, с частью else. &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; можно понимать, как если prop1, то далее следует prop2, иначе возвращается значение правда. Таким образом, под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt;, в нашем примере, выполняется, если a не выполняется (потому что свойство по умолчание имеет значение правда) или, если a выполняется, а также и next b выполняется. Добавляя оператор always, мы получаем свойство, которое выполняется, если под-свойство &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; выполняется в каждом цикле. Таким образом, утверждение 2.2а показывает, что когда бы ни выполнялось &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должно выполняться в следующем цикле. Утверждение 2.2а выполняется по сигналу &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Это показано в “if” и “then” примечании на тракте 2.2(ii). “Дополнительные” утверждения сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на циклах 1 и 10, спровоцированы утверждение 2.2а, потому что в нем ничего не сказано о значениях b в цикле, кроме того, что следует из из утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Отметим, что циклы вовлеченные в выполнение одного утверждения сигнала, могут перекрываться с теми,которые вовлечены в выполнение другого утверждения. Например, учитывая тракт 2.2(iii), который является простым трактом 2.2(ii) с if-then пронумерованными парами. Имеем четыре утверждения сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на тракте 2.2(iii), и таким образом четыре связанных цикла, в которых &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; должен утверждаться. Каждая пара циклов (утверждение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; следует из утверждения &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) нумерованы в тракте 2.2(iii). Рассматривая пары 2 и 3. Сигнал a утверждается в 4 цикле пары 2, таким образом сигнал b должен утвердиться в 5 цикле, для того, чтобы утверждение 2.2а выполнялось. Сигнал а утверждается в цикле 5 пары 3, таким образом требуется утверждение сигнала b в 6 цикле. Пары 2 и 3 перекрываются, потому что, в то время как мы ищем утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в 5 цикле, для выполнения утверждения &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; в 4 цикле, также, мы видим дополнительное утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, который рассматривается.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Утверждение 2.2а не выполняется в тракте 2.2(iv), потому что третье утверждение сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, в цикле 5, т.к. отсутствует утверждение сигнала &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в следующем цикле.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис.2.2: Операторы next и логическая импликация&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Variations on &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; including &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Assertion 2.4a holds, but 2.4b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-10-26T15:00:05Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Основные временные свойства While */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому подтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, “две последовательные записи не должны располагать по одному и тому же адресу” и “когда мы видим запрос на чтение с тэгом i, на следующих четырех передах данных ожидается увидеть тэг &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой состоит из фундаментального языка (FL) и дополнительного расширения ветвления (OBE). FL используется для выражения свойств одного тракта, а также используется для моделирования или формальной верификации. OBE используется для выражения свойств, относящихся к набору трактов, например, “существует тракт, такой как ...”, и также используется для формальной верификации. В этой книге мы сконцентрируемся на фундаментальном языке.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Фундаментальный язык состоит из двух комплементарных стилей - LTL стиль, названный из-за временной логики LTL, на которой базируется PSL, и SERE стиля, названного из-за последовательного расширения регулярных выражений PSL, или SEREs. В этой главе мы представим основные временные операторы LTL стиля. Мы предоставим то, что будет достаточно для понимания основной идеи, и чтобы дать некий контекст, для философских замечаний,обсуждаемых далее.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В этой книге, мы широко используем примеры. Каждый пример свойства или утверждения связан с временной диаграммой (которую мы называем ''тракт'') сгруппирован вместе на рисунке. Такой рисунок будет содержать один или более трактов, нумерованных в скобках строчными римскими цифрами, одного или более свойств, нумерованных добавление строчной буквы к номеру рисунка. Например, Рисунок 2.1 содержит тракт 2.1(i) и утверждения 2.1а, 2.1b, 2.1c.    &lt;br /&gt;
&lt;br /&gt;
===2.1 Операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
We have already seen the basic temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Most&lt;br /&gt;
PSL properties will start with one or the other. This is because a “bare”&lt;br /&gt;
(Boolean) PSL property refers only to the first cycle of a trace. For example,&lt;br /&gt;
Assertion 2.1a requires only that the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; hold at&lt;br /&gt;
the first cycle. Thus, Assertion 2.1a holds on Trace 2.1(i) because the Boolean&lt;br /&gt;
expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; holds at cycle 0. In order to state that we want it to&lt;br /&gt;
hold at every cycle of the design, we must add the temporal operator &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
to get Assertion 2.1b. Assertion 2.1b does not hold on Trace 2.1(i) because&lt;br /&gt;
the Boolean expression &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; does not hold at cycle 5. Equivalently, we&lt;br /&gt;
could have swapped the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; operator and the Boolean negation &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; with&lt;br /&gt;
&amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, to get Assertion 2.1c.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Нам уже встречались основные временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. Большинство свойств PSL начинаются с одного или с другого. Это, потому что “голое” (Булево) PSL свойство относится только к первому циклу тракта. Например, утверждение 2.1a требует только того, чтобы Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполнялось в первом цикле. Таким образом, утверждение 2.1а выполняется в тракте 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; выполняется в цикле 0. Для того, чтобы сформулировать, что мы хотим, чтобы оно выполнялось в каждом цикле проекта, мы должны добавить временной оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, и получить утверждение 2.1b. Утверждение 2.1b не поддерживает тракт 2.1(i), потому что Булево выражение &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; не выполняется в цикле 5. Эквивалентно, мы можем поменять оператор &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и Булево отрицание &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;, чтобы получить утверждение 2.1с.   &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.1.png]]&lt;br /&gt;
|-&lt;br /&gt;
!(i) Утверждение 2.1a выполняется, но 2.1b and 2.1c нет&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert !(a &amp;amp;&amp;amp; b);              (2.1a)&lt;br /&gt;
assert always !(a &amp;amp;&amp;amp; b);       (2.1b)&lt;br /&gt;
assert never (a &amp;amp;&amp;amp; b);         (2.1c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Рис. 2.1: Операторы always и never&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Both Assertion 2.1b and Assertion 2.1c state that signals a and b are&lt;br /&gt;
mutually exclusive. Obviously, anything that can be stated with the &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;&lt;br /&gt;
operator can be stated with the never operator and vice versa, simply by&lt;br /&gt;
negating the operand when switching between &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL provides&lt;br /&gt;
both operators for convenience, as sometimes it is more natural to state&lt;br /&gt;
the property in the positive (that is, stating what must hold at all cycles)&lt;br /&gt;
and sometimes in the negative (that is, what must not hold for any cycle). In&lt;br /&gt;
general, there are many ways to state any property in PSL. We will see other&lt;br /&gt;
examples throughout the rest of this book.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Оба утверждения 2.1b и 2.1c показывают, что сигналы a и b взаимоисключающиеся. Очевидно, все, что может использоваться с оператором &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;, может также использоваться с оператором &amp;lt;code&amp;gt;never/code&amp;gt; и наоборот, происходит простое отрицанием операнда, когда происходит переключение между &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;never&amp;lt;/code&amp;gt;. PSL, для удобства, предоставляет два варианта использования, иногда более удобно описать свойство положительным (если свойство выполняется на всех циклах), а иногда удобней отрицательным (если свойство не выполняется ни в каком цикле). В общем, существует много путей описания свойств в PSL. Мы рассмотрим другие примеры далее.&lt;br /&gt;
&lt;br /&gt;
===2.2 Оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Another temporal operator is the next operator. It indicates that the property&lt;br /&gt;
will hold if its operand holds at the next cycle. For instance, Assertion 2.2a&lt;br /&gt;
states that whenever a holds, then b should hold in the next cycle. Assertion&lt;br /&gt;
2.2a uses another important operator, the logical implication operator&lt;br /&gt;
(&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). While the logical implication operator is a Boolean and not a temporal&lt;br /&gt;
operator (it does not link two sub-properties over time), it plays a very important&lt;br /&gt;
role in many temporal properties. A logical implication &amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt;&lt;br /&gt;
holds if either prop1 does not hold or &amp;lt;code&amp;gt;prop2&amp;lt;/code&amp;gt; holds. A good way to think of it&lt;br /&gt;
is like an if-then expression, with the else-part being implicitly true. That is,&lt;br /&gt;
&amp;lt;code&amp;gt;prop1 -&amp;gt; prop2&amp;lt;/code&amp;gt; can be understood as “if prop1 then prop2 else true”. Thus,&lt;br /&gt;
the sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; in our example holds if either a does not hold&lt;br /&gt;
(because then the property defaults to true) or if a holds and also next b&lt;br /&gt;
holds. By adding an always operator, we get a property that holds if the&lt;br /&gt;
sub-property &amp;lt;code&amp;gt;a -&amp;gt; next b&amp;lt;/code&amp;gt; holds at every cycle. Thus, Assertion 2.2a states&lt;br /&gt;
that whenever &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must hold at the next cycle. Assertion 2.2a holds on&lt;br /&gt;
Trace 2.2(i) because every assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is followed by an assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. This is shown in the “if” and “then” annotations on Trace 2.2(ii).&lt;br /&gt;
The “additional” assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycles 1 and 10 are allowed by Assertion&lt;br /&gt;
2.2a, because it says nothing about the value of b in cycles other than&lt;br /&gt;
those following an assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Другой временной оператор - это оператор &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Он показывает, что свойство свойство должно выполняться, если его операнд выполняется в следующем цикле. Например, утверждение 2.2a показывает, что когда бы a не выполнялось, b должно выполниться в следующем цикле. Утверждение 2.2a использует другой важный оператор, логический оператор импликации (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;). В то время как оператор логической импликации Булевый, а не временной (он не свяжет два подсвойства по времени), это играет очень важную роль во многих временных свойствах. &lt;br /&gt;
&lt;br /&gt;
Note that the cycles involved in satisfying one assertion of signal a may&lt;br /&gt;
overlap with those involved in satisfying another assertion. For example, consider&lt;br /&gt;
Trace 2.2(iii), which is simply Trace 2.2(ii) with the if-then pairs numbered.&lt;br /&gt;
There are four assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; on Trace 2.2(iii), and thus four&lt;br /&gt;
associated cycles in which &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted. Each pair of cycles (an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; followed by an assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;) is numbered in Trace 2.2(iii). Consider&lt;br /&gt;
pairs 2 and 3. Signal a is asserted at cycle 4 in pair 2, thus signal b needs to&lt;br /&gt;
be asserted at cycle 5 in order for Assertion 2.2a to hold. Signal a is asserted&lt;br /&gt;
at cycle 5 in pair 3, thus requiring that signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; be asserted at cycle 6. Pairs&lt;br /&gt;
2 and 3 overlap, because while we are looking for an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 5 in order to satisfy the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4, we see an additional&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; that must be considered.&lt;br /&gt;
&lt;br /&gt;
Assertion 2.2a does not hold on Trace 2.2(iv) because the third assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, at cycle 5, is missing an assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the following cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.2.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next b);         (2.2a)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.2: The next and logical implication operators&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Variations on &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; including &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; property holds if its operand holds in the next cycle. Variations on the&lt;br /&gt;
&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator allow you to specify the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, and ranges of future&lt;br /&gt;
cycles. A &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt; property holds if its operand holds in the ''n&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle.&lt;br /&gt;
For example, Assertion 2.3a states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds&lt;br /&gt;
three cycles later. Assertion 2.3a holds on Traces 2.3(i), 2.3(iii), and 2.3(iv),&lt;br /&gt;
while it does not hold on Traces 2.3(ii) or 2.3(v) because of a missing assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7, and does not hold on Trace 2.3(vi) because of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; missing&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.3.png]]&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (a -&amp;gt; next[3] (b)); (2.3a)&lt;br /&gt;
assert always (a -&amp;gt; next_a[3:5] (b)); (2.3b)&lt;br /&gt;
assert always (a -&amp;gt; next_e[3:5] (b)); (2.3c)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.3: Операторы &amp;lt;code&amp;gt;next[n]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A next_a[i:j] property holds if its operand holds in ''all'' of the cycles from&lt;br /&gt;
the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle through the ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, inclusive. For example, Assertion&lt;br /&gt;
2.3b states that whenever signal a holds, signal b holds three, four and&lt;br /&gt;
five cycles later. It holds on Trace 2.3(iii) and does not hold on Traces 2.3(i),&lt;br /&gt;
2.3(ii), 2.3(iv), 2.3(v), or 2.3(vi).&lt;br /&gt;
&lt;br /&gt;
Previously we discussed the fact that the cycles involved in satisfying one&lt;br /&gt;
assertion of signal a may overlap those involved in satisfying another assertion&lt;br /&gt;
of a. Trace 2.3(iii) has been annotated to emphasize this point for Assertion&lt;br /&gt;
2.3b. Signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; must be asserted in cycles 5 through 7 (marked as “1”)&lt;br /&gt;
because of the assertion of a at cycle 2, and must be asserted in cycles 7&lt;br /&gt;
through 9 (marked as “2”) because of the assertion of a at cycle 4.&lt;br /&gt;
&lt;br /&gt;
A next_e[i:j] property holds if there ''exists'' a cycle from the next &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
through the next &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cycles in which its operand holds. For example, Assertion&lt;br /&gt;
2.3c states that whenever signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds, signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; holds either three, four,&lt;br /&gt;
or five cycles later. There is nothing in Assertion 2.3c that prevents a single&lt;br /&gt;
assertion of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; from satisfying multiple assertions of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, thus it&lt;br /&gt;
holds on Trace 2.3(vi) because the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at cycle 7 comes five cycles&lt;br /&gt;
after the assertion of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 2, and three cycles after the assertion&lt;br /&gt;
of signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4. We examine the issue of specifying a one-to-one&lt;br /&gt;
correspondence between signals in Section 13.4.2.&lt;br /&gt;
&lt;br /&gt;
Assertion 2.3c also holds on Traces 2.3(i), 2.3(iii), 2.3(iv), and 2.3(v),&lt;br /&gt;
since there are enough assertions of signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at the appropriate times. In&lt;br /&gt;
Traces 2.3(i), 2.3(iii), and 2.3(iv) there are more than enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;&lt;br /&gt;
to satisfy the property being asserted (in Trace 2.3(i), the assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; at&lt;br /&gt;
cycle 7 is enough, because it comes five cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle&lt;br /&gt;
2, and three cycles after the assertion of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; at cycle 4). In Trace 2.3(v) there&lt;br /&gt;
are just enough assertions of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; to satisfy the requirements of Assertion 2.3c.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator is a conceptual extension of the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator.&lt;br /&gt;
While next refers to the next cycle, &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; refers to the next&lt;br /&gt;
cycle in which some Boolean condition holds. For example, Assertion 2.4a&lt;br /&gt;
expresses the requirement that whenever a high priority request is received&lt;br /&gt;
(signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted), then the next grant (assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;) must be to a high priority requester (signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted).&lt;br /&gt;
Assertion 2.4a holds on Trace 2.4(i). There are two assertions of signal&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt;, the first at cycle 1 and the second at cycle 10. The associated&lt;br /&gt;
assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; occur at cycles 4 and 11, respectively, and &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;&lt;br /&gt;
holds in these cycles.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator includes the current cycle. That is, an assertion&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the current cycle will be considered the next assertion of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the&lt;br /&gt;
property &amp;lt;code&amp;gt;next_event(b)(p)&amp;lt;/code&amp;gt;. For instance, consider Trace 2.4(ii). Trace 2.4(ii)&lt;br /&gt;
is similar to Trace 2.4(i) except that there is an additional assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8 and two additional assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycles 8&lt;br /&gt;
and 9, one of which has an associated &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt;. Assertion 2.4a holds on&lt;br /&gt;
Trace 2.4(ii) because the assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; at cycle 8 is considered the next&lt;br /&gt;
assertion of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; for the assertion of &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; at cycle 8. If you want to&lt;br /&gt;
exclude the current cycle, simply insert a &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; operator in order to move the&lt;br /&gt;
current cycle of the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator over by one, as in Assertion 2.4b.&lt;br /&gt;
Assertion 2.4b does not hold on Trace 2.4(ii). Because of the insertion of the&lt;br /&gt;
next operator, the relevant assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt; have changed from cycles 4, 8&lt;br /&gt;
and 11 for Assertion 2.4a to cycles 4, 9 and 11 for Assertion 2.4b, and at cycle&lt;br /&gt;
9 there is no assertion of &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; in Trace 2.4(ii).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.4i.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertions 2.4a and 2.4b hold&lt;br /&gt;
|-&lt;br /&gt;
! [[Файл:Psl fig 02.4ii.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (ii) Assertion 2.4a holds, but 2.4b does not&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4a)&lt;br /&gt;
   next_event(gnt)(high_pri_ack));&lt;br /&gt;
&lt;br /&gt;
assert always (high_pri_req -&amp;gt;             (2.4b)&lt;br /&gt;
   next next_event(gnt)(high_pri_ack));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.4: &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Just as we can use &amp;lt;code&amp;gt;next[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' next cycle, we can use&lt;br /&gt;
&amp;lt;code&amp;gt;next_event(b)[i]&amp;lt;/code&amp;gt; to indicate the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrence of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, in order&lt;br /&gt;
to express the requirement that every time a request is issued (signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is&lt;br /&gt;
asserted), &amp;lt;code&amp;gt;signal_last&amp;lt;/code&amp;gt; ready must be asserted on the fourth assertion of signal&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, we can code Assertion 2.5a. Assertion 2.5a holds on Trace 2.5(i). For&lt;br /&gt;
the first assertion of &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 1, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; happen&lt;br /&gt;
to come immediately and in consecutive cycles. For the second assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, at cycle 7, the four assertions of &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; do not happen immediately and&lt;br /&gt;
do not happen consecutively either – they are spread out over seven cycles,&lt;br /&gt;
interspersed with cycles in which &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; is deasserted. However, the point is&lt;br /&gt;
that in both cases, signal &amp;lt;code&amp;gt;last_ready&amp;lt;/code&amp;gt; is asserted on the fourth assertion of&lt;br /&gt;
&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;, thus Assertion 2.5a holds on Trace 2.5(i).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.5.png]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.5a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert always (req -&amp;gt;                (2.5a)&lt;br /&gt;
   next event(ready)[4](last ready));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.5: next event[n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with &amp;lt;code&amp;gt;next_a[i:j]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;next_e[i:j]&amp;lt;/code&amp;gt;, the &amp;lt;code&amp;gt;next_event&amp;lt;/code&amp;gt; operator also&lt;br /&gt;
comes in forms that allow it to indicate ''all'' of a range of future cycles, or the ''existence''&lt;br /&gt;
of a future cycle in such a range. The form &amp;lt;code&amp;gt;next_event_a(b)[i:j](f)&amp;lt;/code&amp;gt;&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on all of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' occurrences&lt;br /&gt;
of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, Assertion 2.6a indicates that when we see a read request&lt;br /&gt;
(assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;) with tag equal to &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, then on the next four&lt;br /&gt;
data transfers (assertion of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;), we expect to see tag &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Assertion 2.6a&lt;br /&gt;
uses the &amp;lt;code&amp;gt;forall&amp;lt;/code&amp;gt; construct, which we will examine in detail later. For now, suffice&lt;br /&gt;
it to say that Assertion 2.6a states a requirement that must hold for all&lt;br /&gt;
possible values of the signal &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;. Assertion 2.6a holds on Trace 2.6(i)&lt;br /&gt;
because after the first assertion of signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has&lt;br /&gt;
the value 4, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; is also 4 on the next four assertions of&lt;br /&gt;
signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 5, 9, 10 and 11). Likewise, on the second assertion of&lt;br /&gt;
signal &amp;lt;code&amp;gt;read_request&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt; has the value 5, the value of &amp;lt;code&amp;gt;tag[2:0]&amp;lt;/code&amp;gt;&lt;br /&gt;
is also 5 on the next four assertions of signal &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; (at cycles 17 through 20).&lt;br /&gt;
&lt;br /&gt;
In order to indicate that we expect something to happen on one of the next&lt;br /&gt;
''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' to ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;'' cycles, we can use the &amp;lt;code&amp;gt;next_event_e(b)[i:j](f)&amp;lt;/code&amp;gt; operator, which&lt;br /&gt;
indicates that we expect &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; to hold on one of the ''i&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  through ''j&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''  occurrences of&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. For example, consider again Assertion 2.4a. It requires that whenever a high&lt;br /&gt;
priority request is received, the next grant must be to a high priority requester.&lt;br /&gt;
Suppose instead that we require that one of the next ''two'' grants be to a high&lt;br /&gt;
priority requester. We can express this using Assertion 2.7a. Assertion 2.7a&lt;br /&gt;
holds on Trace 2.7(i) because every time that signal &amp;lt;code&amp;gt;high_pri_req&amp;lt;/code&amp;gt; is asserted,&lt;br /&gt;
signal &amp;lt;code&amp;gt;high_pri_ack&amp;lt;/code&amp;gt; is asserted on one of the next two assertions of &amp;lt;code&amp;gt;gnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the range specification for all operators – including those&lt;br /&gt;
we have not yet seen – is flavor dependent. In the Verilog, SystemVerilog and&lt;br /&gt;
SystemC flavors, it is &amp;lt;code&amp;gt;[i:j]&amp;lt;/code&amp;gt;. In the VHDL flavor it is &amp;lt;code&amp;gt;[i to j]&amp;lt;/code&amp;gt;. In the GDL&lt;br /&gt;
flavor it is &amp;lt;code&amp;gt;[i..j]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Psl fig 02.6.png|600px]]&lt;br /&gt;
|-&lt;br /&gt;
! (i) Assertion 2.6a holds&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
assert forall i in {0:7}:                      (2.6a)&lt;br /&gt;
   always ((read_request &amp;amp;&amp;amp; tag[2:0]==i) -&amp;gt;&lt;br /&gt;
      next_event_a(data)[1:4](tag[2:0]==i));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Fig. 2.6 &amp;lt;code&amp;gt;next_event a[i:j]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 The &amp;lt;code&amp;gt;until&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; operators ===&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru</id>
		<title>PSL/A Practical Introduction to PSL/Basic Temporal Properties/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Basic_Temporal_Properties/ru"/>
				<updated>2013-10-25T10:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* Basic Temporal Properties While */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
==Основные временные свойства While==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
While the Boolean layer consists of Boolean expressions that hold or do not&lt;br /&gt;
hold at a given cycle, the temporal layer provides a way to describe relationships&lt;br /&gt;
between Boolean expressions over time. A PSL assertion typically looks&lt;br /&gt;
in only one direction – forwards from the first cycle (although it is possible&lt;br /&gt;
to look backwards using built-in functions such as &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Thus, the simple PSL assertion &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; states that a should hold&lt;br /&gt;
at the very first cycle, while the PSL assertion assert always a; states that&lt;br /&gt;
a should hold at the first cycle and at every cycle following the first cycle –&lt;br /&gt;
that is, at every cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
В то время как Булевый слой состоит из Булевых выражений, которые выполняются или не выполняются в данном цикле, временной слой предоставляет путь для описания взаимоотношений между Булевыми выражениями по времени. PSL утверждение обычно представлено только в одном направлении - вперед, от первого цикла (также можно двигаться в обратном направлении, используя встроенные функции, такие как &amp;lt;code&amp;gt;prev()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rose()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;fell()&amp;lt;/code&amp;gt;). Таким образом, простое PSL утверждение &amp;lt;code&amp;gt;assert a;&amp;lt;/code&amp;gt; показывает, что a должно утверждаться в самом первом цикле, в то время как PSL утверждение &amp;lt;code&amp;gt;assert always a&amp;lt;/code&amp;gt;, показывает, что a должно утверждаться в перовм цикле и в каждом следующем цикле, а это значит, что в каждом цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
By combining the temporal operators in various ways we can state properties&lt;br /&gt;
such as “every request receives an acknowledge”, “every acknowledged&lt;br /&gt;
request receives a grant within four to seven cycles unless the request is canceled&lt;br /&gt;
first”, “two consecutive writes should not be to the same address”, and&lt;br /&gt;
“when we see a read request with tag equal to i, then on the next four data&lt;br /&gt;
transfers we expect to see a tag of &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;”.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Комбинированием временных операторов различными путями, мы можем установить свойства, такие как “каждый запрос получает подтверждение”, “каждому одтвержденному запросу предоставляется от четырех до семи циклов, в случаи, если запрос не приостановится первым”, &lt;br /&gt;
&lt;br /&gt;
The temporal layer is composed of the Foundation Language (FL) and the&lt;br /&gt;
Optional Branching Extension (OBE). The FL is used to express properties&lt;br /&gt;
of single traces, and can be used in either simulation or formal verification.&lt;br /&gt;
The OBE is used to express properties referring to sets of traces, for example&lt;br /&gt;
“there exists a trace such that ...”, and is used in formal verification. In this&lt;br /&gt;
book we concentrate on the Foundation Language.&lt;br /&gt;
&lt;br /&gt;
The Foundation Language itself is composed of two complementary styles&lt;br /&gt;
– LTL style, named after the temporal logic LTL on which PSL is based, and&lt;br /&gt;
SERE style, named after PSL’s Sequential Extended Regular Expressions, or&lt;br /&gt;
SEREs. In this chapter we present the basic temporal operators of LTL style.&lt;br /&gt;
We provide only a taste – enough to get the basic idea and to give some&lt;br /&gt;
context to the philosophical issues that we discuss next.&lt;br /&gt;
&lt;br /&gt;
Throughout this book, we make extensive use of examples. Each example&lt;br /&gt;
property or assertion and its associated timing diagram (which we term a&lt;br /&gt;
''trace'') are grouped together in a figure. Such a figure will contain one or more&lt;br /&gt;
traces numbered with a parenthesized lower case Roman numeral, and one&lt;br /&gt;
or more properties numbered by appending a lower case letter to the figure&lt;br /&gt;
number. For instance, Figure 2.1 contains Trace 2.1(i) and Assertions 2.1a,&lt;br /&gt;
2.1b, and 2.1c.&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru</id>
		<title>PSL/A Practical Introduction to PSL/Introduction/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru"/>
				<updated>2013-10-25T09:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a property specification language. It is a means to express ''properties''&lt;br /&gt;
of a design, and in addition to specify how verification tools should use those&lt;br /&gt;
properties. For example, a property may be ''asserted'' – this specifies that the&lt;br /&gt;
design in question is expected to behave as described by the property. A&lt;br /&gt;
property may also be ''assumed'' – this specifies that the design in question&lt;br /&gt;
expects its inputs to behave as described by the property. PSL also provides&lt;br /&gt;
other directives, for instance a means to specify scenarios that should be&lt;br /&gt;
''covered''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL - это язык спецификации свойств. Это средство выразить ''свойства'' проекта и, в дополнение, показать, как программы верификации должны использовать эти свойства. Например, свойство может быть ''утверждение'' - это означает, что проект в спорных ситуациях должен вести себя так, как описано в свойстве. Свойство, также, может быть ''предположение'' - это означает, что проект в спорных ситуациях ожидает входных данных, чтобы вести себя так, как описано в свойстве. PSL, также, предоставляет другие директивы, например средства определения сценариев, которые должны быть  ''покрыты''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is much more than simply an assertion language. Nevertheless, assertions are at the heart of PSL, and many PSL users will use PSL only for its&lt;br /&gt;
assertion capabilities. Thus, before we examine the complete language, a few&lt;br /&gt;
words about what exactly a PSL assertion is are in order. Many programming languages (for example Java) and hardware description languages (for&lt;br /&gt;
example VHDL) contain assert constructs. An assert construct provides the&lt;br /&gt;
user with a way to check at run time or at simulation time that a certain&lt;br /&gt;
condition holds, and to report a warning or an error if it does not. PSL assertions are similar in motivation, but much more extensive in their scope. In&lt;br /&gt;
addition to simple Boolean conditions, a PSL assertion can contain ''temporal''&lt;br /&gt;
operators that allow the user to describe relations over time. For example,&lt;br /&gt;
the PSL assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; specifies that whenever&lt;br /&gt;
signal a holds, signal b must hold on the next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL гораздо больше, чем просто язык утверждений. Тем не менее, утверждения - это сердце PSL, и многие пользователи PSL используют его только из-за возможностей утверждений. Таким образом, перед тем как мы разберем весь язык, пару слов о том, что на самом деле дают нам эти утверждения. Многие языки программирования (например Java) и языки описания аппаратуры (например VHDL) содержат утверждающие конструкции. Утверждающие конструкции предоставляются пользователю возможность во время выполнения или во время моделирования, что нужное условие выполняется и выдать сообщение об ошибке или предупреждении, если оно не выполняется. PSL утверждения похожи по своей сущности, но куда как более масштабные. В дополнение к простым Булевым условиям, PSL условия могут содержат ''временные'' операторы, которые разрешают пользователю описывать отношения по времени. Например, PSL утверждение  &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; показывает, что когда бы сигнал а не принимал значение, сигнал b должен принять значение в следующем цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Java and VHDL assertions are designed to be embedded in executable&lt;br /&gt;
code, and to be checked whenever execution reaches the point at which they&lt;br /&gt;
appear. PSL assertions, on the other hand, typically stand alone, making a&lt;br /&gt;
statement ''about'' the code without being a part of it. (While some tools support&lt;br /&gt;
embedded PSL assertions, an embedded assertion is still not part of the code&lt;br /&gt;
in the sense that there is no way to nest PSL assertions inside of executable&lt;br /&gt;
statements. Embedded PSL assertions are located near the code they specify,&lt;br /&gt;
but they are still about the code and not a part of it.)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Java и VHDL утверждения встраиваются в исполняемый код, и должны быть проверены, когда достигается точка выполнения,на которой они появляются. PSL утверждения, с другой стороны, типично располагаются отдельно, и делают утверждения ''о'' коде, не являясь его частью. (Пока некоторые программы поддерживают встроенные PSL утверждения, встроенное утверждение по-прежнему не является частью кода, в том смысле, что нет возможности поместить PSL утверждение внутрь исполняемого утверждения. Встроенные PSL утверждения располагаются рядом с кодом и они определены, но не являются частью кода.)    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was designed to be mathematically rigorous, with the result that a&lt;br /&gt;
PSL specification is both precise and automatically verifiable. Thus, a hardware specification written in PSL is machine readable and can be used as&lt;br /&gt;
input to verification tools. In addition, PSL was designed to be easy to read&lt;br /&gt;
and write, thus a PSL specification is human readable and can be used for&lt;br /&gt;
documentation in order to clarify subtle points of an English specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был создан, чтобы быть математически строгим, с результатом таким, что спецификация PSL точная и автоматически русифицируемая. Таким образом, аппаратная спецификация написанная на PSL читается машиной и может использоваться как вход для программ верификации. В дополнение, PSL был создам для легкого чтения и записи, таким образом PSL спецификация читается человеком и используется для документации, в целях уточнения спорных моментов из английской спецификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The definitive definition of PSL can be found in IEEE Std 1850-2005. In&lt;br /&gt;
this book, our goal is to give a more relaxed, user-friendly introduction to the&lt;br /&gt;
language, as well as an in-depth discussion of its fine points. We do cover the&lt;br /&gt;
whole of PSL, and for completeness have included as well the BNF and formal&lt;br /&gt;
semantics as appendices.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Окончательное определение PSL можно найти в IEEE Std 1850-2005. В этой книге, нашей целью является получить более спокойное, легко воспринимаемое представление языка, а также углубиться в изучение его тонкостей. Мы покроем весь PSL, а также, для полноты, включим BNF и формальную семантику, в качестве приложений. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The structure of PSL is based on four layers – the Boolean layer, the&lt;br /&gt;
temporal layer, the verification layer and the modeling layer – and comes in&lt;br /&gt;
a numbers of flavors, which influence the syntax in a limited way. The four&lt;br /&gt;
layers of the language are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Структура языка PSL базируется на четырех слоях - Булевый слой, временной слой,  слой верификации и слой моделирования - и представляются в нескольких вариантах, что влияет на синтаксис в ограниченной форме. Четыре слоя это: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* The ''Boolean layer'' is composed of Boolean expressions, that is, expressions whose value is either true or false. For example, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is a Boolean expression. PSL interprets a high signal as true, and &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; low signal as false, independent of whether the signal is active-high or active-low. Thus, if signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is activehigh, the Boolean expression &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; has the value true when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, and false when it is deasserted. And if signal b is active-low, the Boolean expression &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; has the value false when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted and true when it is deasserted. In the remainder of this book, we will assume that all signals are active-high unless stated otherwise. Of course, it is easy to get the active-low versions of the example properties by switching a with &amp;lt;code&amp;gt;!a&amp;lt;/code&amp;gt; and vice versa. The Boolean layer consists of any Boolean expression in the underlying flavor. For example, &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; is a Boolean expression in the Verilog flavor stating that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; does not, &amp;lt;code&amp;gt;a[31:0]==b[31:0]&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 32-bit vectors &amp;lt;code&amp;gt;a[31:0]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b[31:0]&amp;lt;/code&amp;gt; are equal, and &amp;lt;code&amp;gt;addr1[127:0]==128’b0&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 128-bit vector &amp;lt;code&amp;gt;addr1[127:0]&amp;lt;/code&amp;gt; has the value zero.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* ''Булевый слой'' состоит из Булевых выражений, это выражения, значения которого могут быть правда или ложь. Например, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; Булево выражение. PSL интерпретирует высокий уровень сигнала, как правда, а &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; низкий уровень, как ложь, независимо от того, какой уровень для сигнала, считается активным. Таким образом, если сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; активный-высокий, Булево выражение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение правда, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; утверждается, и ложь, когда не утверждается. А если сигнал b активный-низкий, Булево выражение &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение ложь, когда &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается, и правда, когда не утверждается. Далее в этой книге, мы будем считать, что все сигналы имеют активный высокий уровень, если не указано иначе. Конечно, проще принять активный низкий уровень для примера свойств за счет перехода a из &amp;lt;code&amp;gt;!a&amp;lt;/code&amp;gt; и наоборот. Булевый слой состоит из Булевых выражений определенного варианта. Например, &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; - это Булево выражение в варианте Verilog, означает, что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; утверждается, а &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; нет, &amp;lt;code&amp;gt;a[31:0]==b[31:0]&amp;lt;/code&amp;gt; - это Булево выражение варианта Verilog, означает, что 32-х битные векторы &amp;lt;code&amp;gt;a[31:0]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b[31:0]&amp;lt;/code&amp;gt; эквивалентны, и &amp;lt;code&amp;gt;addr1[127:0]==128’b0&amp;lt;/code&amp;gt; - это булево выражение варианта Verilog, означает, что 128-и битный вектор &amp;lt;code&amp;gt;addr1[127:0]&amp;lt;/code&amp;gt; имеет нулевое значение.         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* The ''temporal layer'' consists of temporal properties which describe the relationships between Boolean expressions over time. For example, &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; is a temporal property expressing the fact that whenever (&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;) signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) at the next cycle (&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;), signal ack is asserted.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* ''Временной слой'' состоит из временных свойств, которые описывают взаимоотношения между Булевыми выражениями по времени. Например, &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; временное свойство, выражающее, что когда бы ни (&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;) не утверждался сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt;, далее (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) в следующем цикле (&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;), утверждается сигнал &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* The ''verification layer'' consists of directives which describe how the temporal properties should be used by verification tools. For example, assert &amp;lt;code&amp;gt;always (req -&amp;gt; next ack);&amp;lt;/code&amp;gt; is a verification directive that tells the tools to verify that the property &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; holds. Other verification directives include an instruction to assume, rather than verify, that a particular temporal property holds, or to specify coverage criteria. The verification layer also provides a means to group PSL statements into ''verification units''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* слой верификации состоит из директив, которые описывают, как временные свойства должны использоваться программами верификации. Например, утверждение &amp;lt;code&amp;gt;always (req -&amp;gt; next ack);&amp;lt;/code&amp;gt; - это директива верификации, которая говорит программе верифицировать, что свойство &amp;lt;code&amp;gt;always (req -&amp;gt; next ack);&amp;lt;/code&amp;gt; выполняется. Другая директива верификации включает инструкцию предположения, а не верификации, того что конкретное временное свойство выполняется или определяет критерий зоны покрытия. Слой верификации также предоставляет возможность группировать PSL утверждения в ''verification units''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a and b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a &amp;amp;&amp;amp; b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! (i) VHDL вариант&lt;br /&gt;
! (ii) Verilog вариант&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2| Рис. 1.1: Один и тот же vunit в двух различных вариантах&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* The ''modeling layer'' provides a means to model behavior of design inputs, and to declare and give behavior to auxiliary signals and variables. This part of the modeling layer is simply a subset of the underlying flavor. For instance, the declaration of auxiliary signals in the Verilog flavor follows Verilog syntax.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* ''Слой моделирования'' предоставляет возможности моделирования поведения входов проекта, и декларировать и передавать поведение вспомогательным сигналам и переменным. Эта часть слоя моделирования - просто подмножество какого-либо варианта. Например, декларация вспомогательных сигналов в варианте Verilog предполагает синтаксис Verilog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The five flavors of PSL correspond to the hardware description languages&lt;br /&gt;
Verilog and VHDL, to the language GDL, the environment description language of the RuleBase model checker, and to SystemVerilog and SystemC.&lt;br /&gt;
While the flavor has some influence over the syntax – for instance, it affects&lt;br /&gt;
the syntax of Boolean expressions – the vast majority of the language is the&lt;br /&gt;
same across flavors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пять вариантов PSL соответствуют языкам описания аппаратуры Verilog и VHDL, языку GDL, языку описания среды RuleBase, и SystemVerilog и SystemC. Т.к. все варианты имеют некоторое влияние на синтаксис - например, это влияет на синтаксис Булевых выражений - большинство языков имеют схожий синтаксис. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Figure 1.1 shows a PSL specification in the VHDL and Verilog flavors. In&lt;br /&gt;
each case, the specification states that signals a and b are mutually exclusive.&lt;br /&gt;
While a PSL user typically does not spend a lot of time thinking about the&lt;br /&gt;
boundaries between the various layers, we will point them out in this first&lt;br /&gt;
example. The Boolean expressions a and b in the VHDL flavor and &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt;&lt;br /&gt;
in the Verilog flavor belong to the Boolean layer and describe the situation&lt;br /&gt;
in which both signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are asserted. The keyword never belongs&lt;br /&gt;
to the temporal layer and indicates that the Boolean expression is expected&lt;br /&gt;
to hold in no cycle. Together, the temporal keyword never and the Boolean&lt;br /&gt;
expressions &amp;lt;code&amp;gt;a and b&amp;lt;/code&amp;gt; in the VHDL flavor or &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt; in the Verilog flavor form&lt;br /&gt;
a ''property''. The keyword assert belongs to the verification layer and instructs&lt;br /&gt;
the verification tool to check that the property holds in the design under test.&lt;br /&gt;
The keyword vunit also belongs to the verification layer and introduces the&lt;br /&gt;
name of the verification unit (&amp;lt;code&amp;gt;example1&amp;lt;/code&amp;gt;). The modeling layer is not used in&lt;br /&gt;
this example.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Рисунок 1.1 показывает спецификацию PSL для VHDL и Verilog вариантов. В каждом случаи, в спецификации говориться, что сигналы a и b взаимоисключающиеся. Пока PSL пользователь не проводит много времени, думая о границах между слоями, мы будем указывать на них в первом примере. Булевы выражения &amp;lt;code&amp;gt;a and b&amp;lt;/code&amp;gt; в VHDL варианте и &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt; в Verilog варианте, принадлежать Булевому слою и описывают ситуацию, в которой оба сигнала &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждаются. Ключевое слово never относиться к временному слою и показывает, что Булево выражение  не ожидает своего выполнения в цикле. Вместе, ключево слово never и Булевы выражения &amp;lt;code&amp;gt;a and b&amp;lt;/code&amp;gt; в VHDL варианте или &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt; в Verilog варианте, формируют ''свойство''. Ключевое слово assert принадлежит слою верификации и инструктирует программу верификации на проверку того, что свойство выполняется в ходе тестирования проекта. Ключевое слово vunit также принадлежит слою верификации и представляет имя юнита верификации (&amp;lt;code&amp;gt;example1&amp;lt;/code&amp;gt;). Слой, моделирования в данном примере, не используется. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
In the remainder of this book we use the Verilog flavor unless stated otherwise. We focus almost exclusively on the temporal layer, which is the heart of&lt;br /&gt;
the language and makes extensive use of the Boolean layer. Chapter 10 briefly&lt;br /&gt;
discusses various aspects of the Boolean, modeling and verification layers not&lt;br /&gt;
covered elsewhere. Throughout, we will assume that &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; has been defined to&lt;br /&gt;
be &amp;lt;code&amp;gt;1’b1&amp;lt;/code&amp;gt; (i.e., a Verilog expression that holds at every cycle) and that &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;&lt;br /&gt;
has been defined to be &amp;lt;code&amp;gt;1’b0&amp;lt;/code&amp;gt; (i.e., a Verilog expression that does not hold at&lt;br /&gt;
any cycle).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Далее в книге, и\мы будем использовать Verilog вариант, если не указано иное. В основном мы сфокусируем наше внимание на временном слое, который является сердцем языка, и будем широко использовать Булевый слой. В глава 10 кратко обговорим различые аспекты Булевого слоя, слоя моделирования и слоя верификации, не затронутые в других главах. Также, мы сделаем предположение, что &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; был определен, как &amp;lt;code&amp;gt;1’b1&amp;lt;/code&amp;gt; (т.е. Verilog выражение, которое выполняется в каждом цикле) и, что &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt; опреден, как &amp;lt;code&amp;gt;1’b0&amp;lt;/code&amp;gt; (т.е. Verilog выражение, которое не выполняется).&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru</id>
		<title>PSL/A Practical Introduction to PSL/Introduction/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru"/>
				<updated>2013-10-25T08:18:29Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a property specification language. It is a means to express ''properties''&lt;br /&gt;
of a design, and in addition to specify how verification tools should use those&lt;br /&gt;
properties. For example, a property may be ''asserted'' – this specifies that the&lt;br /&gt;
design in question is expected to behave as described by the property. A&lt;br /&gt;
property may also be ''assumed'' – this specifies that the design in question&lt;br /&gt;
expects its inputs to behave as described by the property. PSL also provides&lt;br /&gt;
other directives, for instance a means to specify scenarios that should be&lt;br /&gt;
''covered''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL - это язык спецификации свойств. Это средство выразить ''свойства'' проекта и, в дополнение, показать, как программы верификации должны использовать эти свойства. Например, свойство может быть ''утверждение'' - это означает, что проект в спорных ситуациях должен вести себя так, как описано в свойстве. Свойство, также, может быть ''предположение'' - это означает, что проект в спорных ситуациях ожидает входных данных, чтобы вести себя так, как описано в свойстве. PSL, также, предоставляет другие директивы, например средства определения сценариев, которые должны быть  ''покрыты''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is much more than simply an assertion language. Nevertheless, assertions are at the heart of PSL, and many PSL users will use PSL only for its&lt;br /&gt;
assertion capabilities. Thus, before we examine the complete language, a few&lt;br /&gt;
words about what exactly a PSL assertion is are in order. Many programming languages (for example Java) and hardware description languages (for&lt;br /&gt;
example VHDL) contain assert constructs. An assert construct provides the&lt;br /&gt;
user with a way to check at run time or at simulation time that a certain&lt;br /&gt;
condition holds, and to report a warning or an error if it does not. PSL assertions are similar in motivation, but much more extensive in their scope. In&lt;br /&gt;
addition to simple Boolean conditions, a PSL assertion can contain ''temporal''&lt;br /&gt;
operators that allow the user to describe relations over time. For example,&lt;br /&gt;
the PSL assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; specifies that whenever&lt;br /&gt;
signal a holds, signal b must hold on the next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL гораздо больше, чем просто язык утверждений. Тем не менее, утверждения - это сердце PSL, и многие пользователи PSL используют его только из-за возможностей утверждений. Таким образом, перед тем как мы разберем весь язык, пару слов о том, что на самом деле дают нам эти утверждения. Многие языки программирования (например Java) и языки описания аппаратуры (например VHDL) содержат утверждающие конструкции. Утверждающие конструкции предоставляются пользователю возможность во время выполнения или во время моделирования, что нужное условие выполняется и выдать сообщение об ошибке или предупреждении, если оно не выполняется. PSL утверждения похожи по своей сущности, но куда как более масштабные. В дополнение к простым Булевым условиям, PSL условия могут содержат ''временные'' операторы, которые разрешают пользователю описывать отношения по времени. Например, PSL утверждение  &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; показывает, что когда бы сигнал а не принимал значение, сигнал b должен принять значение в следующем цикле. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Java and VHDL assertions are designed to be embedded in executable&lt;br /&gt;
code, and to be checked whenever execution reaches the point at which they&lt;br /&gt;
appear. PSL assertions, on the other hand, typically stand alone, making a&lt;br /&gt;
statement ''about'' the code without being a part of it. (While some tools support&lt;br /&gt;
embedded PSL assertions, an embedded assertion is still not part of the code&lt;br /&gt;
in the sense that there is no way to nest PSL assertions inside of executable&lt;br /&gt;
statements. Embedded PSL assertions are located near the code they specify,&lt;br /&gt;
but they are still about the code and not a part of it.)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Java и VHDL утверждения встраиваются в исполняемый код, и должны быть проверены, когда достигается точка выполнения,на которой они появляются. PSL утверждения, с другой стороны, типично располагаются отдельно, и делают утверждения ''о'' коде, не являясь его частью. (Пока некоторые программы поддерживают встроенные PSL утверждения, встроенное утверждение по-прежнему не является частью кода, в том смысле, что нет возможности поместить PSL утверждение внутрь исполняемого утверждения. Встроенные PSL утверждения располагаются рядом с кодом и они определены, но не являются частью кода.)    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was designed to be mathematically rigorous, with the result that a&lt;br /&gt;
PSL specification is both precise and automatically verifiable. Thus, a hardware specification written in PSL is machine readable and can be used as&lt;br /&gt;
input to verification tools. In addition, PSL was designed to be easy to read&lt;br /&gt;
and write, thus a PSL specification is human readable and can be used for&lt;br /&gt;
documentation in order to clarify subtle points of an English specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был создан, чтобы быть математически строгим, с результатом таким, что спецификация PSL точная и автоматически русифицируемая. Таким образом, аппаратная спецификация написанная на PSL читается машиной и может использоваться как вход для программ верификации. В дополнение, PSL был создам для легкого чтения и записи, таким образом PSL спецификация читается человеком и используется для документации, в целях уточнения спорных моментов из английской спецификации.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The definitive definition of PSL can be found in IEEE Std 1850-2005. In&lt;br /&gt;
this book, our goal is to give a more relaxed, user-friendly introduction to the&lt;br /&gt;
language, as well as an in-depth discussion of its fine points. We do cover the&lt;br /&gt;
whole of PSL, and for completeness have included as well the BNF and formal&lt;br /&gt;
semantics as appendices.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Окончательное определение PSL можно найти в IEEE Std 1850-2005. В этой книге, нашей целью является получить более спокойное, легко воспринимаемое представление языка, а также углубиться в изучение его тонкостей. Мы покроем весь PSL, а также, для полноты, включим BNF и формальную семантику, в качестве приложений. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The structure of PSL is based on four layers – the Boolean layer, the&lt;br /&gt;
temporal layer, the verification layer and the modeling layer – and comes in&lt;br /&gt;
a numbers of flavors, which influence the syntax in a limited way. The four&lt;br /&gt;
layers of the language are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Структура языка PSL базируется на четырех слоях - Булевый слой, временной слой,  слой верификации и слой моделирования - и представляются в нескольких вариантах, что влияет на синтаксис в ограниченной форме. Четыре слоя это: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* The ''Boolean layer'' is composed of Boolean expressions, that is, expressions whose value is either true or false. For example, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is a Boolean expression. PSL interprets a high signal as true, and &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; low signal as false, independent of whether the signal is active-high or active-low. Thus, if signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is activehigh, the Boolean expression &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; has the value true when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, and false when it is deasserted. And if signal b is active-low, the Boolean expression &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; has the value false when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted and true when it is deasserted. In the remainder of this book, we will assume that all signals are active-high unless stated otherwise. Of course, it is easy to get the active-low versions of the example properties by switching a with &amp;lt;code&amp;gt;!a&amp;lt;/code&amp;gt; and vice versa. The Boolean layer consists of any Boolean expression in the underlying flavor. For example, &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; is a Boolean expression in the Verilog flavor stating that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; does not, &amp;lt;code&amp;gt;a[31:0]==b[31:0]&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 32-bit vectors &amp;lt;code&amp;gt;a[31:0]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b[31:0]&amp;lt;/code&amp;gt; are equal, and &amp;lt;code&amp;gt;addr1[127:0]==128’b0&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 128-bit vector &amp;lt;code&amp;gt;addr1[127:0]&amp;lt;/code&amp;gt; has the value zero.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* ''Булевый слой'' состоит из Булевых выражений, это выражения, значения которого могут быть правда или ложь. Например, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; Булево выражение. PSL интерпретирует высокий уровень сигнала, как правда, а &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; низкий уровень, как ложь, независимо от того, какой уровень для сигнала, считается активным. Таким образом, если сигнал &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; активный-высокий, Булево выражение &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; имеет значение правда, когда &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; утверждается, и ложь, когда не утверждается. А если сигнал b активный-низкий, Булево выражение &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение ложь, когда &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; утверждается, и правда, когда не утверждается. Далее в этой книге, мы будем считать, что все сигналы имеют активный высокий уровень, если не указано иначе. Конечно, проще принять активный низкий уровень для примера свойств за счет перехода a из &amp;lt;code&amp;gt;!a&amp;lt;/code&amp;gt; и наоборот. Булевый слой состоит из Булевых выражений определенного варианта. Например, &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; - это Булево выражение в варианте Verilog, означает, что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; утверждается, а &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; нет, &amp;lt;code&amp;gt;a[31:0]==b[31:0]&amp;lt;/code&amp;gt; - это Булево выражение варианта Verilog, означает, что 32-х битные векторы &amp;lt;code&amp;gt;a[31:0]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b[31:0]&amp;lt;/code&amp;gt; эквивалентны, и &amp;lt;code&amp;gt;addr1[127:0]==128’b0&amp;lt;/code&amp;gt; - это булево выражение варианта Verilog, означает, что 128-и битный вектор &amp;lt;code&amp;gt;addr1[127:0]&amp;lt;/code&amp;gt; имеет нулевое значение.         &lt;br /&gt;
&lt;br /&gt;
* The ''temporal layer'' consists of temporal properties which describe the relationships between Boolean expressions over time. For example, &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; is a temporal property expressing the fact that whenever (&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;) signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) at the next cycle (&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;), signal ack is asserted.&lt;br /&gt;
&lt;br /&gt;
* The ''verification layer'' consists of directives which describe how the temporal properties should be used by verification tools. For example, assert &amp;lt;code&amp;gt;always (req -&amp;gt; next ack);&amp;lt;/code&amp;gt; is a verification directive that tells the tools to verify that the property &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; holds. Other verification directives include an instruction to assume, rather than verify, that a particular temporal property holds, or to specify coverage criteria. The verification layer also provides a means to group PSL statements into ''verification units''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a and b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a &amp;amp;&amp;amp; b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! (i) VHDL flavor&lt;br /&gt;
! (ii) Verilog flavor&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2| Fig. 1.1: The same vunit in two different flavors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* The ''modeling layer'' provides a means to model behavior of design inputs, and to declare and give behavior to auxiliary signals and variables. This part of the modeling layer is simply a subset of the underlying flavor. For instance, the declaration of auxiliary signals in the Verilog flavor follows Verilog syntax.&lt;br /&gt;
&lt;br /&gt;
The five flavors of PSL correspond to the hardware description languages&lt;br /&gt;
Verilog and VHDL, to the language GDL, the environment description language of the RuleBase model checker, and to SystemVerilog and SystemC.&lt;br /&gt;
While the flavor has some influence over the syntax – for instance, it affects&lt;br /&gt;
the syntax of Boolean expressions – the vast majority of the language is the&lt;br /&gt;
same across flavors.&lt;br /&gt;
&lt;br /&gt;
Figure 1.1 shows a PSL specification in the VHDL and Verilog flavors. In&lt;br /&gt;
each case, the specification states that signals a and b are mutually exclusive.&lt;br /&gt;
While a PSL user typically does not spend a lot of time thinking about the&lt;br /&gt;
boundaries between the various layers, we will point them out in this first&lt;br /&gt;
example. The Boolean expressions a and b in the VHDL flavor and &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt;&lt;br /&gt;
in the Verilog flavor belong to the Boolean layer and describe the situation&lt;br /&gt;
in which both signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are asserted. The keyword never belongs&lt;br /&gt;
to the temporal layer and indicates that the Boolean expression is expected&lt;br /&gt;
to hold in no cycle. Together, the temporal keyword never and the Boolean&lt;br /&gt;
expressions &amp;lt;code&amp;gt;a and b&amp;lt;/code&amp;gt; in the VHDL flavor or &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt; in the Verilog flavor form&lt;br /&gt;
a ''property''. The keyword assert belongs to the verification layer and instructs&lt;br /&gt;
the verification tool to check that the property holds in the design under test.&lt;br /&gt;
The keyword vunit also belongs to the verification layer and introduces the&lt;br /&gt;
name of the verification unit (&amp;lt;code&amp;gt;example1&amp;lt;/code&amp;gt;). The modeling layer is not used in&lt;br /&gt;
this example.&lt;br /&gt;
&lt;br /&gt;
In the remainder of this book we use the Verilog flavor unless stated otherwise. We focus almost exclusively on the temporal layer, which is the heart of&lt;br /&gt;
the language and makes extensive use of the Boolean layer. Chapter 10 briefly&lt;br /&gt;
discusses various aspects of the Boolean, modeling and verification layers not&lt;br /&gt;
covered elsewhere. Throughout, we will assume that &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; has been defined to&lt;br /&gt;
be &amp;lt;code&amp;gt;1’b1&amp;lt;/code&amp;gt; (i.e., a Verilog expression that holds at every cycle) and that &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;&lt;br /&gt;
has been defined to be &amp;lt;code&amp;gt;1’b0&amp;lt;/code&amp;gt; (i.e., a Verilog expression that does not hold at&lt;br /&gt;
any cycle).&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru</id>
		<title>PSL/A Practical Introduction to PSL/Introduction/ru</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/A_Practical_Introduction_to_PSL/Introduction/ru"/>
				<updated>2013-10-23T17:07:16Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a property specification language. It is a means to express ''properties''&lt;br /&gt;
of a design, and in addition to specify how verification tools should use those&lt;br /&gt;
properties. For example, a property may be ''asserted'' – this specifies that the&lt;br /&gt;
design in question is expected to behave as described by the property. A&lt;br /&gt;
property may also be ''assumed'' – this specifies that the design in question&lt;br /&gt;
expects its inputs to behave as described by the property. PSL also provides&lt;br /&gt;
other directives, for instance a means to specify scenarios that should be&lt;br /&gt;
''covered''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL - это язык спецификации свойств. Это средство выразить ''свойства'' проекта и, в дополнение, показать, как программы верификации должны использовать эти свойства. Например, свойство может быть ''утверждение'' - это означает, что проект в спорных ситуациях должен вести себя так, как описано в свойстве. Свойство, также, может быть ''предположение'' - это означает, что проект в спорных ситуациях ожидает входных данных, чтобы вести себя так, как описано в свойстве. PSL, также, предоставляет другие директивы, например средства определения сценариев, которые должны быть  ''покрыты''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is much more than simply an assertion language. Nevertheless, assertions are at the heart of PSL, and many PSL users will use PSL only for its&lt;br /&gt;
assertion capabilities. Thus, before we examine the complete language, a few&lt;br /&gt;
words about what exactly a PSL assertion is are in order. Many programming languages (for example Java) and hardware description languages (for&lt;br /&gt;
example VHDL) contain assert constructs. An assert construct provides the&lt;br /&gt;
user with a way to check at run time or at simulation time that a certain&lt;br /&gt;
condition holds, and to report a warning or an error if it does not. PSL assertions are similar in motivation, but much more extensive in their scope. In&lt;br /&gt;
addition to simple Boolean conditions, a PSL assertion can contain ''temporal''&lt;br /&gt;
operators that allow the user to describe relations over time. For example,&lt;br /&gt;
the PSL assertion &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; specifies that whenever&lt;br /&gt;
signal a holds, signal b must hold on the next cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL гораздо больше, чем просто язык утверждений. Тем не менее, утверждения - это сердце PSL, и многие пользователи PSL используют его только из-за возможностей утверждений. Таким образом, перед тем как мы разберем весь язык, пару слов о том, что на самом деле дают нам эти утверждения. Многие языки программирования (например Java) и языки описания аппаратуры (например VHDL) содержат утверждающие конструкции. Утверждающие конструкции предоставляются пользователю возможность во время выполнения или во время моделирования, что нужное условие выполняется и выдать сообщение об ошибке или предупреждении, если оно не выполняется. PSL утверждения похожи по своей сущности, но куда как более масштабные. В дополнение к простым Булевым условиям, PSL условия могут содержат ''временные'' операторы, которые разрешают пользователю описывать отношения по времени. Например, PSL утверждение  &amp;lt;code&amp;gt;assert always (a -&amp;gt; next b);&amp;lt;/code&amp;gt; показывает, что когда бы сигнал а не принимал значение, сигнал b должен принять значение в следующем цикле. &lt;br /&gt;
&lt;br /&gt;
Java and VHDL assertions are designed to be embedded in executable&lt;br /&gt;
code, and to be checked whenever execution reaches the point at which they&lt;br /&gt;
appear. PSL assertions, on the other hand, typically stand alone, making a&lt;br /&gt;
statement ''about'' the code without being a part of it. (While some tools support&lt;br /&gt;
embedded PSL assertions, an embedded assertion is still not part of the code&lt;br /&gt;
in the sense that there is no way to nest PSL assertions inside of executable&lt;br /&gt;
statements. Embedded PSL assertions are located near the code they specify,&lt;br /&gt;
but they are still about the code and not a part of it.)&lt;br /&gt;
&lt;br /&gt;
PSL was designed to be mathematically rigorous, with the result that a&lt;br /&gt;
PSL specification is both precise and automatically verifiable. Thus, a hardware specification written in PSL is machine readable and can be used as&lt;br /&gt;
input to verification tools. In addition, PSL was designed to be easy to read&lt;br /&gt;
and write, thus a PSL specification is human readable and can be used for&lt;br /&gt;
documentation in order to clarify subtle points of an English specification.&lt;br /&gt;
&lt;br /&gt;
The definitive definition of PSL can be found in IEEE Std 1850-2005. In&lt;br /&gt;
this book, our goal is to give a more relaxed, user-friendly introduction to the&lt;br /&gt;
language, as well as an in-depth discussion of its fine points. We do cover the&lt;br /&gt;
whole of PSL, and for completeness have included as well the BNF and formal&lt;br /&gt;
semantics as appendices.&lt;br /&gt;
&lt;br /&gt;
The structure of PSL is based on four layers – the Boolean layer, the&lt;br /&gt;
temporal layer, the verification layer and the modeling layer – and comes in&lt;br /&gt;
a numbers of flavors, which influence the syntax in a limited way. The four&lt;br /&gt;
layers of the language are:&lt;br /&gt;
&lt;br /&gt;
* The ''Boolean layer'' is composed of Boolean expressions, that is, expressions whose value is either true or false. For example, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is a Boolean expression. PSL interprets a high signal as true, and &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; low signal as false, independent of whether the signal is active-high or active-low. Thus, if signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is activehigh, the Boolean expression &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; has the value true when &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, and false when it is deasserted. And if signal b is active-low, the Boolean expression &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; has the value false when &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted and true when it is deasserted. In the remainder of this book, we will assume that all signals are active-high unless stated otherwise. Of course, it is easy to get the active-low versions of the example properties by switching a with &amp;lt;code&amp;gt;!a&amp;lt;/code&amp;gt; and vice versa. The Boolean layer consists of any Boolean expression in the underlying flavor. For example, &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; is a Boolean expression in the Verilog flavor stating that &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; holds and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; does not, &amp;lt;code&amp;gt;a[31:0]==b[31:0]&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 32-bit vectors &amp;lt;code&amp;gt;a[31:0]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b[31:0]&amp;lt;/code&amp;gt; are equal, and &amp;lt;code&amp;gt;addr1[127:0]==128’b0&amp;lt;/code&amp;gt; is a Verilog-flavored Boolean expression stating that the 128-bit vector &amp;lt;code&amp;gt;addr1[127:0]&amp;lt;/code&amp;gt; has the value zero.&lt;br /&gt;
&lt;br /&gt;
* The ''temporal layer'' consists of temporal properties which describe the relationships between Boolean expressions over time. For example, &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; is a temporal property expressing the fact that whenever (&amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt;) signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is asserted, then (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) at the next cycle (&amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;), signal ack is asserted.&lt;br /&gt;
&lt;br /&gt;
* The ''verification layer'' consists of directives which describe how the temporal properties should be used by verification tools. For example, assert &amp;lt;code&amp;gt;always (req -&amp;gt; next ack);&amp;lt;/code&amp;gt; is a verification directive that tells the tools to verify that the property &amp;lt;code&amp;gt;always (req -&amp;gt; next ack)&amp;lt;/code&amp;gt; holds. Other verification directives include an instruction to assume, rather than verify, that a particular temporal property holds, or to specify coverage criteria. The verification layer also provides a means to group PSL statements into ''verification units''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a and b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
vunit example1 {&lt;br /&gt;
  assert never (a &amp;amp;&amp;amp; b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! (i) VHDL flavor&lt;br /&gt;
! (ii) Verilog flavor&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2| Fig. 1.1: The same vunit in two different flavors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* The ''modeling layer'' provides a means to model behavior of design inputs, and to declare and give behavior to auxiliary signals and variables. This part of the modeling layer is simply a subset of the underlying flavor. For instance, the declaration of auxiliary signals in the Verilog flavor follows Verilog syntax.&lt;br /&gt;
&lt;br /&gt;
The five flavors of PSL correspond to the hardware description languages&lt;br /&gt;
Verilog and VHDL, to the language GDL, the environment description language of the RuleBase model checker, and to SystemVerilog and SystemC.&lt;br /&gt;
While the flavor has some influence over the syntax – for instance, it affects&lt;br /&gt;
the syntax of Boolean expressions – the vast majority of the language is the&lt;br /&gt;
same across flavors.&lt;br /&gt;
&lt;br /&gt;
Figure 1.1 shows a PSL specification in the VHDL and Verilog flavors. In&lt;br /&gt;
each case, the specification states that signals a and b are mutually exclusive.&lt;br /&gt;
While a PSL user typically does not spend a lot of time thinking about the&lt;br /&gt;
boundaries between the various layers, we will point them out in this first&lt;br /&gt;
example. The Boolean expressions a and b in the VHDL flavor and &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt;&lt;br /&gt;
in the Verilog flavor belong to the Boolean layer and describe the situation&lt;br /&gt;
in which both signal &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and signal &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; are asserted. The keyword never belongs&lt;br /&gt;
to the temporal layer and indicates that the Boolean expression is expected&lt;br /&gt;
to hold in no cycle. Together, the temporal keyword never and the Boolean&lt;br /&gt;
expressions &amp;lt;code&amp;gt;a and b&amp;lt;/code&amp;gt; in the VHDL flavor or &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; b&amp;lt;/code&amp;gt; in the Verilog flavor form&lt;br /&gt;
a ''property''. The keyword assert belongs to the verification layer and instructs&lt;br /&gt;
the verification tool to check that the property holds in the design under test.&lt;br /&gt;
The keyword vunit also belongs to the verification layer and introduces the&lt;br /&gt;
name of the verification unit (&amp;lt;code&amp;gt;example1&amp;lt;/code&amp;gt;). The modeling layer is not used in&lt;br /&gt;
this example.&lt;br /&gt;
&lt;br /&gt;
In the remainder of this book we use the Verilog flavor unless stated otherwise. We focus almost exclusively on the temporal layer, which is the heart of&lt;br /&gt;
the language and makes extensive use of the Boolean layer. Chapter 10 briefly&lt;br /&gt;
discusses various aspects of the Boolean, modeling and verification layers not&lt;br /&gt;
covered elsewhere. Throughout, we will assume that &amp;lt;code&amp;gt;‘true&amp;lt;/code&amp;gt; has been defined to&lt;br /&gt;
be &amp;lt;code&amp;gt;1’b1&amp;lt;/code&amp;gt; (i.e., a Verilog expression that holds at every cycle) and that &amp;lt;code&amp;gt;‘false&amp;lt;/code&amp;gt;&lt;br /&gt;
has been defined to be &amp;lt;code&amp;gt;1’b0&amp;lt;/code&amp;gt; (i.e., a Verilog expression that does not hold at&lt;br /&gt;
any cycle).&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)</id>
		<title>PSL/IEEE Standard 1850-2010 for Property Specification Language (PSL)</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)"/>
				<updated>2013-10-23T16:23:30Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.4 Semantics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Обзор ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Возможность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard defines the property specification language (PSL), which formally describes electronic system&lt;br /&gt;
behavior. This standard specifies the syntax and semantics for PSL and also clarifies how PSL interfaces&lt;br /&gt;
with various standard electronic system design languages.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт определяет язык свойств спецификации (PSL), который формально описывает поведение электронных систем. Этот стандарт специфицирует синтаксис и семантику для PSL, а также разъясняет, как PSL взаимодействует с различными стандартами языков описания электронных систем.&lt;br /&gt;
&lt;br /&gt;
===1.2 Назначение===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of this standard is to provide a well-defined language for formal specification of electronic&lt;br /&gt;
system behavior, one that is compatible with multiple electronic system design languages, including IEEE&lt;br /&gt;
Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), and IEEE Std&lt;br /&gt;
1666TM (SystemC®), to facilitate a common specification and verification flow for multi-language and&lt;br /&gt;
mixed-language designs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Назначение этого стандарта заключается в том, чтобы предоставить четкий язык для формальной спецификации поведения электронных систем, который будет совместим с множеством языков описания электронных систем, включая IEEE Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), и IEEE Std 1666TM (SystemC®), способствуя общему потоку верификации и спецификации для проектов описанных на разных и смешанных языках.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard creates an updated IEEE standard based upon IEEE Std 1850-2005. The updated standard will&lt;br /&gt;
refine IEEE standard, addressing errata, minor technical issues, and proposed extensions specifically related&lt;br /&gt;
to property reuse and improved simulation usability.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт создает обновленный IEEE стандарт базирующийся на IEEE Std 1850-2005. Обновленный стандарт усовершенствует IEEE стандарт, адресные опечатки, незначительные технические вопросы и предполагаемого расширения непосредственно связанных свойств, для дальнейшего использования и облегчения моделирования.&lt;br /&gt;
       &lt;br /&gt;
==== 1.2.1 Происхождение ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The complexity of Very Large Scale Integration (VLSI) has grown to such a degree that traditional&lt;br /&gt;
approaches have begun to reach their limitations, and verification costs have reached 60%–70% of&lt;br /&gt;
development resources. The need for advanced verification methodology, with improved observability of&lt;br /&gt;
design behavior and improved controllability of the verification process, has become critical. Over the last&lt;br /&gt;
decade, a methodology based on the notion of “properties” has been identified as a powerful verification&lt;br /&gt;
paradigm that can assure enhanced productivity, higher design quality, and, ultimately, faster time to market&lt;br /&gt;
and higher value to engineers and end-users of electronics products. Properties, as used in this context, are&lt;br /&gt;
concise, declarative, expressive, and unambiguous specifications of desired system behavior that are used to&lt;br /&gt;
guide the verification process. IEEE 1850 PSL is a standard language for specifying electronic system&lt;br /&gt;
behavior using properties. PSL facilitates property-based verification using both simulation and formal&lt;br /&gt;
verification, thereby enabling a productivity boost in functional verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сложность проектов с очень большой степенью интеграции (VLSI) выросла до такого уровня, что традиционные подходы начали достигать своего предела, а издержки верификации достигли 60%-70% от ресурсов разработки. Потребность в более продвинутой методологии верификации, с улучшенной наблюдаемостью  поведения проекта и улучшенной контролируемостью (способностью контроля) процесса верификации, стала критической. За последние 10 лет, методология, базирующаяся на понятии &amp;quot;свойств&amp;quot;, была определена, как мощная парадигма верификации, которая способна обеспечить повышение производительности (эффективности), повышенное качество проекта, и значительно ускорить время выхода на рынок (time to market), увеличить число производителей (higher value to engineers?) и пользователей электронных продуктов. Свойства, используемые в данном контексте, являются краткие, декларативные/описательные (declarative), выразительные/ясные/точные (expressive) и однозначные спецификации желаемого поведения системы, которые используются для проведения процесса верификации. IEEE 1850 PSL стандартный язык для описания (спецификации) поведения электронной системы, используя свойства. PSL облегчает верификацию основанную на свойствах (property-based verification) с использованием как моделирования так и формальной верификации, что позволяет повысить эффективность функциональной верификации.&lt;br /&gt;
&lt;br /&gt;
====1.2.2 Мотивация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Ensuring that a design’s implementation satisfies its specification is the foundation of hardware verification.&lt;br /&gt;
Key to the design and verification process is the act of specification. Yet historically, the process of&lt;br /&gt;
specification has consisted of creating a natural language description of a set of design requirements. This&lt;br /&gt;
form of specification is both ambiguous and, in many cases, unverifiable due to the lack of a standard&lt;br /&gt;
machine-executable representation. Furthermore, ensuring that all functional aspects of the specification&lt;br /&gt;
have been adequately ''verified'' (that is, covered) is problematic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Обеспечение реализации проекта удовлетворяющей его спецификацию, является  основным для верификации аппаратуры. Ключ к проекту и процессу верификации является законом спецификации. Исторически, процесс спецификации состоял из создания языкового описания набора требований к проекту. Эта форма спецификации неоднозначная, и во многих случаях неверифицируема в связи с отсутствием стандарта машинно-выполняемого представления. Кроме того, обеспечение, того чтобы все функциональные аспекты спецификации были адекватно ''верифицированы'' (т.е. покрыты), довольно проблематично.           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The IEEE PSL was developed to address these shortcomings. It gives the design architect a standard means&lt;br /&gt;
of specifying design properties using a concise syntax with clearly-defined formal semantics. Similarly, it&lt;br /&gt;
enables the RTL implementer to capture design intent in a verifiable form, while enabling the verification&lt;br /&gt;
engineer to validate that the implementation satisfies its specification through ''dynamic'' (that is, simulation)&lt;br /&gt;
and ''static'' (that is, formal) verification means. Furthermore, it provides a means to measure the quality of the&lt;br /&gt;
verification process through the creation of functional coverage models built on formally specified&lt;br /&gt;
properties. In addition, it provides a standard means for hardware designers and verification engineers to&lt;br /&gt;
create a rigorous and machine-executable design specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
IEEE PSL был создан, чтобы устранить эти недостатки. Это дает архитектуре проекта стандарт, означающий спецификацию свойств проекта&lt;br /&gt;
используемых краткий синтаксис с простой формальной семантикой. Аналогичным образом, позволяется RTL-исполнителю определить цели проекта в проверяемых формах, пока разрешается верификации подтвердить, что выполнение окончено и его спецификация определена через ''динамическую'' ( моделирование) и статическую (формальную) верификацию. Более того, он предоставляет средства для определения качества процесса верификации, через создание полной функциональной модели построения на формально специфицированных свойствах. В дополнение, он предоставляет стандартные средства для аппаратуры проекта и инженера верификации при создании строгой и исполняемой машиной спецификации проекта.&lt;br /&gt;
&lt;br /&gt;
====1.2.3 Цели====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was specifically developed to fulfill the following general hardware functional specification&lt;br /&gt;
requirements:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был специально создан для исполнения следующих общих аппаратных функциональных требований:&lt;br /&gt;
* Легко обучать, чиать и писать&lt;br /&gt;
* Краткий синтаксис&lt;br /&gt;
* Строго определенная формальная семантика&lt;br /&gt;
* Выразительная мощность, позволяющая специфицировать большие классы реальных проектов&lt;br /&gt;
* Известные эффективные алгоритмы моделирования, такие же как формальная верификация&lt;br /&gt;
&lt;br /&gt;
===1.3 Использование===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a language for the formal specification of hardware. It is used to describe properties that are required&lt;br /&gt;
to hold in the design under verification. PSL provides a means to write specifications that are both easy to&lt;br /&gt;
read and mathematically precise. It is intended to be used for functional specification on the one hand and as&lt;br /&gt;
input to functional verification tools on the other. Thus, a PSL specification is an executable specification of&lt;br /&gt;
a hardware design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL язык для формальной спецификации аппаратуры. Он используется для описания свойств, которые требуют поддержки в проекте под верификацию. PSL предоставляет средства для написания спецификаций, которые легко читаются и математически точны. Это предназначение используется для функциональной спецификации, с одной стороны, и как вход в программы функциональной верификации, с другой. Таким образом, спецификация PSL - это исполняемая спецификация для аппаратного проекта.&lt;br /&gt;
      &lt;br /&gt;
====1.3.1 Функциональная спецификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can be used to capture requirements regarding the overall behavior of a design, as well as assumptions&lt;br /&gt;
about the environment in which the design is expected to operate. PSL can also capture internal behavioral&lt;br /&gt;
requirements and assumptions that arise during the design process. Both enable more effective functional&lt;br /&gt;
verification and reuse of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL может использоваться для выделения требований относительно общего поведения проекта, также как допущения о среде, в которой ожидается обработка проекта. PSL также может выделять внутреннее поведение требований и допущений, которые возникают в процессе обработки проекта. Доступными являются более эффективная функциональная верификация и продолжения обработки самого проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
One important use of PSL is for documentation, either in place of or along with an English specification. A&lt;br /&gt;
PSL specification can describe simple invariants (for example, signals &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; are never asserted simultaneously) as well as multi-cycle behavior (for example, correct&lt;br /&gt;
behavior of an interface with respect to a bus protocol or correct behavior of pipelined operations).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Один из важных аспектов использования PSL - это использование для документации, как вместо, так и совместно с английской спецификацией. Спецификация PSL может описать простые инварианты (например: сигналы &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; никогда не используются в одно время), также как многотактовое поведение (например: правильное поведение интерфейса с поддержкой протокола шины или правильное поведение конвейерных операций).  &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification consists of ''assertions'' regarding ''properties'' of a design under a set of ''assumptions''. A&lt;br /&gt;
''property'' is built from three kinds of elements: ''Boolean expressions'', which describe behavior over one cycle;&lt;br /&gt;
''sequential expressions'', which can describe multi-cycle behavior; and ''temporal operators'', which describe&lt;br /&gt;
temporal relationships among Boolean expressions and sequences. For example, consider the following&lt;br /&gt;
Verilog Boolean expression:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL состоит из ''утверждений'' относительно ''свойства'' проекта под набором ''допущений''. ''Свойство'' строится из трех видов элементов: ''Булевы выражения'', которые описывают поведение в одно цикле; ''последовательные выражения'', которые могут описывать многотактовое поведение;  и ''временные операторы'', которые описывают временные взаимоотношения между Булевыми выражениями и последовательностями. Например, Булево выражение в Verilog:&lt;br /&gt;
&lt;br /&gt;
 ena || enb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This expression describes a cycle in which at least one of the signals &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; are asserted. The PSL&lt;br /&gt;
sequential expression&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это выражение описывает цикл, в котором, по крайней мере, один из сигналов &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен. Последовательное выражение PSL&lt;br /&gt;
&lt;br /&gt;
 {req; ack; !cancel}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
describes a sequence of cycles, such that req is asserted in the first cycle, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is asserted in the second&lt;br /&gt;
cycle, and &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; is deasserted in the third cycle. The following property, obtained by applying the&lt;br /&gt;
temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; to these expressions,&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
описывает последовательность циклов, такую, что если &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; активен в первом цикле, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; активен во втором цикле, а &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt;  неактивен  в третьем цикле. Следующее свойство получается, применяя временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; к этим выражениям,&lt;br /&gt;
&lt;br /&gt;
 always {req;ack;!cancel} |=&amp;gt; (ena || enb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
means that always (that is, in every cycle), if the sequence &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt; occurs, then either &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;&lt;br /&gt;
or &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; is asserted one cycle after the sequence ends. Adding the directive &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
это значит, что всегда (в каждом цикле), если встречается последовательность &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt;, то либо &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;, либо &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен в течение цикла после окончания последовательности. Добавляя директиву &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; следующей:   &lt;br /&gt;
&lt;br /&gt;
 assert always {req;ack;!cancel} |=&amp;gt; (ena || enb);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
completes the specification, indicating that this property is expected to hold in the design and that this&lt;br /&gt;
expectation needs to be verified.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
завершается спецификация, указывая, что это свойство ожидается в проекте и что потребности это ожидания нужно верифицировать.&lt;br /&gt;
  &lt;br /&gt;
====1.3.2 Функциональная верификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can also be used as input to verification tools, for both verification by simulation, as well as formal&lt;br /&gt;
verification using a model checker or a theorem prover. Each of these is discussed in the subclauses that&lt;br /&gt;
follow.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL также может использоваться, как вход для программ верификации, как для верификации моделированием, так и для формальной верификации, используется проверка модели или теоретическое доказательство. Каждый вариант обсуждается в следующих пунктах.&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.1 Моделирование=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification can also be used to automatically generate checks of simulated behavior. This can be&lt;br /&gt;
done, for example, by directly integrating the checks in the simulation tool; by interpreting PSL properties in&lt;br /&gt;
a testbench automation tool that drives the simulator; by generating HDL monitors that are simulated&lt;br /&gt;
alongside the design; or by analyzing the traces produced during simulation.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL также может использоваться для автоматического генерирования проверок поведения моделирования. Это может быть реализовано, например, прямой интеграцией проверок в программе моделирования; интерпретацией свойств PSL в тестовую автоматизированную программу, которая сопровождает симулятор; генерированием HDL контроллеров, которые моделируются рядом с проектом; или анализом путей пройденных во время моделирования.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  &lt;br /&gt;
For instance, the following PSL property:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Например, следующие PSL свойства:&lt;br /&gt;
&lt;br /&gt;
 Свойство 1: always (req -&amp;gt; next !req)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is a pulsed signal, i.e., if it is high in some cycle, then it is low in the following cycle.&lt;br /&gt;
Such a property can be easily checked using a simulation checker written in some HDL that has the&lt;br /&gt;
functionality of the finite state machine (FSM) shown in Figure 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
означает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; пульсирующий сигнал, т.е. если он принимает высокие значения в одном цикле,то он примет низкие значения в следующем цикле. Такое свойство может быть легко проверенно, используя проверки моделирования, написанные на каком-нибудь HDL, который имеет функциональность конечного автомат (FSM), показанный на Рисунке 1. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig01.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
!Рисунок 1—Простой FSM, который проверяет свойство 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For properties more complicated than the property shown in Figure 1, manually writing a corresponding&lt;br /&gt;
checker is painstaking and error-prone, and maintaining a collection of such checkers for a constantly changing design under development is a time-consuming task. Instead, a PSL specification can be used as input to&lt;br /&gt;
a tool that automatically generates simulatable checkers.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для более сложных свойств, чем то что представлено на рисунке 1, писать вручную соответствующие проверки - это кропотливый труд, подверженный ошибкам, и содержание набора таких проверок для постоянно изменяющегося проекта - это очень трудоемкое задание. Вместо этого, спецификация PSL может использоваться, как вход для программы, которая автоматически генерирует проверки, поддающиеся моделированию.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--     &lt;br /&gt;
Although in principle, all PSL properties can be checked for finite paths in simulation, the implementation&lt;br /&gt;
of the checks is often significantly simpler for a subset called the ''simple subset'' of PSL. Informally, in this&lt;br /&gt;
subset, composition of temporal properties is restricted to ensure that time ''moves forward'' from left to right&lt;br /&gt;
through a property, as it does in a timing diagram. (See 4.4.4 for the formal definition of the simple subset.)&lt;br /&gt;
&lt;br /&gt;
For example, the property&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Хотя в принципе, все свойства PSL могут быть проверены при окончание моделирования, исполнение проверок, часто, значительно проще для подмножеств, называемых ''простые подмножества'' PSL. Неформально, в этих подмножествах, состав временных свойств ограничен для обеспечения того, что бы время ''двигалось вперед'' слева направо через свойство, как это делается на временной диаграмме. (Смотрите 4.4.4 для формального понимания простых подмножеств.)&lt;br /&gt;
&lt;br /&gt;
Например, свойство &lt;br /&gt;
&lt;br /&gt;
 Свойство 2: always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
which states that, if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted three cycles later, belongs to the simple subset, because&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; appears to the left of b in the property and also appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the timing diagram of any&lt;br /&gt;
behavior that is not a violation of the property. Figure 2 shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
которое означает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значения, то &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет значение через три цикла, принадлежит простому подмножеству, потому что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве и, также, появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на временной диаграмме любой поведенческой модели, что не нарушает свойство. Рисунок 2 показывает пример такой временной диаграммы.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig02.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 2—Вариант удовлетворяющий свойство 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
An example of a property that is not in this subset is the property&lt;br /&gt;
&lt;br /&gt;
 Property 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
which states that, if a is asserted and b is asserted three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is asserted (in the same cycle as&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;). This property does not belong to the simple subset, because although &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; appears to the right of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in&lt;br /&gt;
the property, it appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; timing diagram that is not a violation of the property. Figure 3&lt;br /&gt;
shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пример свойства не принадлежащего этому подмножеству&lt;br /&gt;
&lt;br /&gt;
 Свойство 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
которое значит, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значение и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение через три цикла, то &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; принимает значение в том же цикле, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Это свойство не принадлежит простому подмножеству, потому что хотя &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; появляется справа от &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве, он появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на временной диаграмме, и это не нарушает свойство. Рисунок 3 показывает пример такой временной диаграммы.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig03.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 3 3—Вариант, удовлетворяющий свойство 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.2 Формальная верификация=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is an extension of the standard temporal logics Linear-Time Temporal Logic (LTL) and Computation&lt;br /&gt;
Tree Logic (CTL). A specification in the PSL Foundation Language (respectively, the PSL Optional Branching Extension) can be ''compiled down'' to a formula of pure LTL (respectively, CTL), possibly with some&lt;br /&gt;
auxiliary HDL code, known as a ''satellite''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL это расширение стандарта временной логики Линейной временной логике (LTL) и Вычисляемого логического дерева (CTL). Спецификация  в PSL фундаментального языка (соответственно, PSL дополнительного ветвления) может быть ''скомпилирована'' в виде чистого LTL (соответственно, CTL), возможно с некоторым вспомогательным HDL- кодом, известным, как ''спутник''.&lt;br /&gt;
&lt;br /&gt;
== 3. Определения, сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;--&lt;br /&gt;
For the purposes of this document, the following terms and definitions apply. The IEEE Standards Diction-&lt;br /&gt;
ary: Glossary of Terms &amp;amp; Definitions should be referenced for terms not defined in this clause.6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цели этого документа - текущие термины и определения. IEEE словарь стандартов: Cловарь терминов и определений должен ссылаться на условия неопределенные в этом пункте.6 &lt;br /&gt;
&lt;br /&gt;
===3.1 Определения (Definitions) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the terms used in this standard.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет термины, используемые в этом стандарте. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- '''assertion''': A statement that a given property is required to hold and a directive to functional verification&lt;br /&gt;
tools to verify that it does hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''утверждение (assertion)''': значит, что данное свойство требуется выполнить и указать программе функциональной верификации, чтобы убедиться, что оно выполняется. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''assumption''': A statement that the design is constrained by the given property and a directive to functional&lt;br /&gt;
verification tools to consider only paths on which the given property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''допущение (assumption)''': значит, что проект ограничен данным свойством и программе функциональной верификации указывается учитывать только тот путь, на котором данное свойство выполняется.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''asynchronous property''': A property whose clock context is equivalent to True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''асинхронное свойство (asynchronous property)''': Свойство, временной контекст которого эквивалентен значению Правда.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
'''behavior''': A path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение (behavior)''': Путь.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Boolean (expression)''': An expression that yields a logical value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''Булевы (выражения) (Boolean (expression))''': Выражения, которые принимают на выходе логические значения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''checker''': An auxiliary process (usually constructed as a finite state machine) that monitors simulation of a&lt;br /&gt;
design and reports errors when asserted properties do not hold. A checker may be represented in the same&lt;br /&gt;
HDL code as the design or in some other form that can be linked with a simulation of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка (checker)''': Вспомогательный процесс (обычно применяемый, как конечный автомат), который проверяет моделирование проекта и сообщения об ошибках, когда утвержденное свойство не выполняется. Проверка может быть представлена в том же HDL-коде, что и проект или в какой-либо другой форме, которая может ссылаться на моделирование проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''completes''': A term used to identify the last cycle of a path that satisfies a sequential expression or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''завершение (completes)''': Термин используемый для определения последнего цикла пути, который удовлетворяет последовательности выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''computation path''': A succession of states of the design, such that the design can actually transition from&lt;br /&gt;
each state on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''вычисленный путь (computation path)''': Правопреемство состояний проекта, такое что проект может актуально переходить из каждого состояния на пути к его преемнику. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''constraint''': A condition (usually on the input signals) that limits the set of behaviors to be considered. A&lt;br /&gt;
constraint may represent real requirements (e.g., clocking requirements) on the environment in which the&lt;br /&gt;
design is used, or it may represent artificial limitations (e.g., mode settings) imposed in order to partition the&lt;br /&gt;
functional verification task.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (constraint)''': Состояние ( обычно для входного сигнала), которое ограничивает набор поведений, которые следует рассматривать. Ограничение может представлять реальные требования (т.е. временные требования) в среде, в которой используется проект, или может представлять искусственные ограничения (т.е. настройки режима) наложенные в порядке разделения задания функциональной верификации.       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''count''': A number or range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''счетчик (count)''': Число или диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''coverage''': A measure of the occurrence of certain behavior during (typically dynamic) functional&lt;br /&gt;
verification and, therefore, a measure of the completeness of the (dynamic) functional verification process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''зона покрытия (coverage)''': Мера возникновения определенного поведения в течение (обычно динамическое) функциональной верификации и поэтому расчет сложности (динамического) процесса функциональной верификации.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''cycle''': An evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''цикл (cycle)''': Оценочный цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''describes''': A term used to identify the set of behaviors for which Boolean expression, sequential expression,&lt;br /&gt;
or property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''описания (describes)''': Термин, используемый для определения набора поведений, для которого Булевы выражения, последовательные выражения или выполняемые свойства.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design''': A model of a piece of hardware, described in some hardware description language (HDL). A design&lt;br /&gt;
typically involves a collection of inputs, outputs, state elements, and combinational functions that compute&lt;br /&gt;
next state and outputs from current state and inputs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проект (design)''': Модель кусочка аппаратуры, описанная на некотором языке описания аппаратуры (HDL). Проект типично включает в себя набор входов, выходов, элементов состояния и комбинационных функций, которые рассчитывают следующие состояние и выходы из текущего состояния и входов.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design behavior''': A computation path for a given design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение проекта (design behavior)''': Рассчитанный путь для данного проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''dynamic verification''': A verification process such as simulation, in which a property is checked over indi-&lt;br /&gt;
vidual, finite design behaviors that are typically obtained by dynamically exercising the design through a&lt;br /&gt;
finite number of evaluation cycles. Generally, dynamic verification supports no inference about whether the&lt;br /&gt;
property holds for a behavior over which the property has not yet been checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''динамическая верификация (dynamic verification)''': Процесс верификации, такой как моделирование, в котором свойство проверяется &lt;br /&gt;
отдельно, конечные поведения проекта, которые обычно получаются динамическим проведением проекта через конечное число оценочных циклов. В общем, динамическая верификация не дает вывода о выполняющемся свойстве поведения, через которое свойство еще не было проверено.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
'''evaluation''': The process of exercising a design by iteratively applying values to its inputs, computing its&lt;br /&gt;
next state and output values, advancing time, and assigning to the state variables and outputs their next&lt;br /&gt;
values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценка (evaluation)''': Процесс проведения проекта итеративным принятием значений на его входы, рассчитывая его следующие состояния и выходные значения, время опережения, и назначение переменных состояний и выходов своих следующих значений.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''evaluation cycle''': One iteration of the evaluation process. At an evaluation cycle, the state of the design is&lt;br /&gt;
recomputed (and may change).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценочный цикл (evaluation cycle)''': Одна итерация оценочного процесса. На одном оценочном цикле, состояние проекта пересчитывается ( и может быть изменено). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''extension (of a given path)''': A path that starts with precisely the succession of states in the given path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''расширения (данного пути) (extension (of a given path))''': Путь, который начинается  с точного правопреемства состояний в данном пути.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* '''False''': An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog flavors, the single bit values 1’b0, 1 ’bx, and 1’bz are interpreted as the logical value False. In the VHDL flavor, the values STD.Standard.Boolean’(False) and STD.Standard.Bit’(‘0’), as well as the values IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’( ‘X’), and IEEE.std_logic_1164.std_logic’(‘Z’) are all interpreted as the logical value False. In the SystemC flavor, the value 'false' of type bool and any integer literal with a numeric value of 0 are interpreted as the logical value False. In the GDL flavor, the Boolean value 'false' and bit value 0B are both interpreted as the logical value False.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''False''' — Интерпритация определённых значений определённых типов в HDL языках. В SystemVerilog и Verilog стилях, битовые значения 1’b0, 1 ’bx, и 1’bz интерпретируются как логическое значение False. В VHDL стиле, значения STD.Standard.Boolean’(False) и STD.Standard.Bit’(‘0’), также как значения IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’(‘X’), и IEEE.std_logic_1164.std_logic’(‘Z’) все интерпретируются как логическое значение False. В SystemC стиле, значение 'false' типа bool и любой литерал типа integer с числовым значением 0 интерпретируется как значение False. В GDL стиле, значение типа Boolean 'false' и значение типа bit 0B оба интерпретируются как логическое значение False.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''finite range''': A range with a finite high bound.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''конечный диапазон (finite range)''': Диапазон с большой конечной границей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''formal verification''': A functional verification process in which analysis of a design and a property yields a&lt;br /&gt;
logical inference about whether the property holds for all behaviors of the design. If a property is declared&lt;br /&gt;
true by a formal verification tool, no simulation can show it to be false. If the property does not hold for all&lt;br /&gt;
behaviors, then the formal verification process should provide a specific counterexample to the property, if&lt;br /&gt;
possible.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''формальная верификация (formal verification)''': Процесс функциональной верификации, в котором анализ дизайна и выхода свойства логически разъясняет о выполняемое свойство для все поведений проекта. Если свойство продекларировано значение &amp;quot;правда&amp;quot; программой формальной верификации, моделирование не может сделать его значение &amp;quot;ложным&amp;quot;. Если свойство не выполняется для каждого поведения, то процесс формальной верификации должен предоставить специфический контрпример свойства, если это возможно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''functional verification''': The process of confirming that, for a given design and a given set of constraints, a&lt;br /&gt;
property that is required to hold in that design actually does hold under those constraints.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''функциональная верификация (functional verification)''': Процесс подтверждения того, что для данного проекта и данного набора ограничений, свойство, которое требует выполнение в этом проекте, действительно выполняется в соответствие с данными ограничениями.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds''': A term used to talk about the meaning of a Boolean expression, sequential expression, or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''исполнение (holds)''': Термин используемый для разъяснения значения Булевых выражений, последовательных выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds tightly''': A term used to talk about the meaning of a sequential expression. Sequential expressions are&lt;br /&gt;
evaluated over finite paths (behavior).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''обязательное исполнение(holds tightly)''': Термин используемый для разъяснения значения последовательных выражений. Последовательные выражения оцениваются на конечной стадии (поведение). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''liveness property''': A property that specifies an eventuality that is unbounded in time. Loosely speaking, a&lt;br /&gt;
liveness property claims that “something good” eventually happens. More formally, a liveness property is a&lt;br /&gt;
property for which any finite path can be extended to a path satisfying the property. For example, the prop-&lt;br /&gt;
erty “whenever signal req is asserted, signal ack is asserted some time in the future” is a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''живучие свойства (liveness property)''': Свойства, которые указывают на случайность, которая не ограничена во времени. Грубо говоря, живучие свойства утверждает, что что-то “хорошее” в конечном счете произошло. Более формально, живучие свойство - это свойство, для которого любая конечная стадия может быть продолжена до стадии удовлетворения свойства. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через некоторое время” это живучие свойство. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logic type''': An HDL data type that includes values that are interpreted as logical values. A logic type may&lt;br /&gt;
also include values that are not interpreted as logical values. Such a logic type usually represents a multi-val-&lt;br /&gt;
ued logic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логический тип (logic type)''': Тип данных HDL, который включает значения, которые интерпретируются, как логические значения. Логический тип, также, включает значения, которые не интерпретируются, как логические значения. Как логический тип, обычно, представляет многозначную логику.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logical value''': A value in the set {True, False}.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логическое значение (logical value)''': Значение из набора {True, False}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''model checking''': A type of formal verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка на модели (model checking)''': Тип формальной верификации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''number''': A non-negative integer value, and a statically computable expression yielding such a value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''число (number)''': Неотрицательное целочисленное значение, и статично подсчитанное выражение полученное, как выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurs''': A term used to indicate that a Boolean expression holds in a given cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
''' (occurs)''': Термин используемый для индикации того, что Булево выражение выполняется в данном цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurrence (of a Boolean expression)''': A cycle in which the Boolean expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''occurrence (of a Boolean expression)''': Цикл, в котором выполняется Булево выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''path''': A succession of states of the design, whether or not the design can actually transition from one state&lt;br /&gt;
on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''стадия (путь) (path)''': Правопреемственность состояний проекта, ??? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive count''': A positive number or a positive range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный счетчик (positive count)''': Положительное число или положительный диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive number''': A number that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительное число (positive number)''': Число, которое больше нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive range''': A range with a low bound that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный диапазон (positive range)''': Диапазон с нижней границей большей нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''prefix (of a given path)''': A path of which the given path is an extension.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''префикс (данной стадии) (prefix (of a given path))''': Стадия в которую расширяется данная стадия.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''property''': A collection of logical and temporal relationships between and among subordinate Boolean&lt;br /&gt;
expressions, sequential expressions, and other properties that in aggregate represent a set of behaviors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство (property)''': Набор логических и временных взаимоотношений между и среди подчиненных Булевых выражений, последовательных выражений и других свойств, которые в совокупности представляют набор поведений.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''range''': A series of consecutive numbers, from a low bound to a high bound, inclusive, such that the low&lt;br /&gt;
bound is less than or equal to the high bound. In particular, this includes the case in which the low bound is&lt;br /&gt;
equal to the high bound. Also, a pair of statically computable integer expressions specifying such a series of&lt;br /&gt;
consecutive numbers, where the left expression specifies the low bound of the series, and the right expression specifies the high bound of the series. A range may describe a set of values or a variable number of&lt;br /&gt;
cycles or event repetitions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''диапазон (range)''': Набор последовательных чисел, от нижней до верней границы, включительно, такой, что нижняя граница меньше или равна верхней. В частности, это предполагает случай, в котором нижняя граница эквивалентна верхней. Также, пара статически подсчитанных целочисленных выражений представляются, как наборы последовательных чисел, где левая выражения является нижней границей, а правое выражение верхней границей набора. Диапазон может описывать набор значении и переменное число циклов или повторяющихся событий.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''restriction''': A statement that the design is constrained by the given sequential expression and a directive to&lt;br /&gt;
functional verification tools to consider only paths on which the given sequential expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (restriction)''': Утверждение, что проект ограничивается данным последовательным выражением, и директива программе функциональной верификации рассматривать только стадию, на которой выполняется данное последовательное выражение.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''safety property''': A property that specifies an invariant over the states in a design. The invariant is not necessarily limited to a single cycle, but it is bounded in time. Loosely speaking, a safety property claims that&lt;br /&gt;
“something bad” does not happen. More formally, a safety property is a property for which any path&lt;br /&gt;
violating the property has a finite prefix such that every extension of the prefix violates the property. For&lt;br /&gt;
example, the property, “whenever signal req is asserted, signal ack is asserted within 3 cycles” is a safety&lt;br /&gt;
property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''защищенное свойство (safety property)''': Свойство, которое указывает инвариантность по состояниям в проекте. Инвариантность - это необязательно ограниченность в один цикл, но ограниченность по времени. Грубо говоря, защищенное свойство показывает, что ничего “плохого” не произошло. Более формально, защищенное свойство - это свойство, для которого любая стадия имеющая навязывающееся свойство получает конечный префикс, такой ,что каждое расширение префикса навязывается свойству. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через три цикла”, является защищенным свойством.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequence''': A sequential expression that may be used directly within a property or directive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательность (sequence)''': Последовательное выражение, которое может напрямую использоваться в течение свойства или директивы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequential expression''': A finite series of terms that represent a set of behaviors.&lt;br /&gt;
sequential extended regular expression: A form of sequential expression, and a component of a sequence.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательное выражение (sequential expression)''': Законченный набор терминов, который представляет набор поведений.&lt;br /&gt;
&lt;br /&gt;
'''последовательные регулярно расширяемые выражения (sequential extended regular expression)''': Форма последовательных выражений и компонентов последовательностей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''starts''': A term used to identify the first cycle of a path that satisfies a sequential expression.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''начало (starts)''': Термин используемый для идентификации первого цикла пути, который удовлетворяет последовательное выражение. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strictly before''': Before, and not in the same cycle as.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''строго перед (strictly before)''': Перед, и не в этом же цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strong operator''': A temporal operator, the non-negated use of which usually creates a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''сильный оператор (strong operator)''': Временной оператор, неотрицательное использование которого, обычно, создает живучие свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal expression''': An expression that involves one or more temporal operators.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временное выражение (temporal expression)''': Выражение, которое включает один или более временных операторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal operator''': An operator that represents a temporal (i.e., time-oriented) relationship between its&lt;br /&gt;
operands.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временной оператор (temporal operator)''' Оператор, который представляет временные ( т.е. ориентированные во времени) взаимоотношения между операндами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating condition''': A Boolean expression, the occurrence of which causes a property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''условие завершения (terminating condition)''': Булево выражение, появление которого, приводит к завершению свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating property''': A property that, when it holds, causes another property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство завершения (terminating property)''': Свойство, выполнение которого, приводит к завершению другого свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
True: An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog&lt;br /&gt;
flavors, the single bit value 1'b1 is interpreted as the logical value True. In the VHDL flavor, the values&lt;br /&gt;
STD.Standard.Boolean'(True), STD.Standard.Bit'('1'),&lt;br /&gt;
IEEE.std_logic_1164.std_logic'('1'), and IEEE.std_logic_1164.std_logic'('H')&lt;br /&gt;
interpreted as the logical value True. In the SystemC flavor, the value 'true' of type bool and any integer&lt;br /&gt;
literal with a non-zero numeric value are interpreted as the logical value True. In the GDL flavor, the Boolean value 'true' and bit value 1B are both interpreted as the logical value True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* '''True''': Интерпритация определённых значений определённых типов в HDL языках. &lt;br /&gt;
** В SystemVerilog и Verilog стилях, битовые значение  1'b1 интерпретируется как логическое значение True. &lt;br /&gt;
** В VHDL стиле, значения STD.Standard.Boolean'(True), STD.Standard.Bit'('1'), IEEE.std_logic_1164.std_logic'('1'), и IEEE.std_logic_1164.std_logic'('H') интерпретируются как логическое значение True.&lt;br /&gt;
** В SystemC стиле, значение 'true' типа bool и любой литерал типа integer  с ненулевым числовым значением интерпретируется как логическое значение True.&lt;br /&gt;
** В GDL стиле, значение типа Boolean 'true' и значение типа bit 1B интерпретируются как логическое значение True.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''unknown value''': A value of a (multi-valued) logic type, other than 0 or 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''неизвестное значение (unknown value)''': Значение (многозначного) логического типа, отличное от 0 и 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''weak operator''': A temporal operator, the non-negated use of which does not create a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''слабый оператор (weak operator)''': Временной оператор, неотрицательное использование которого не создает живучего свойства.&lt;br /&gt;
&lt;br /&gt;
== 3.2 Сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
* ABV — утверждения, базирующиеся на верификации&lt;br /&gt;
* BNF — расширенная форма Бакуса-Наура&lt;br /&gt;
* cpp — C препроцессор&lt;br /&gt;
* CTL — вычисляемое логическое дерево&lt;br /&gt;
* EDA — авторматизация проектирования&lt;br /&gt;
* FL — фундаметальный язык&lt;br /&gt;
* FSM — конечный автомат&lt;br /&gt;
* GDL — общий язык описания&lt;br /&gt;
* HDL — язык описания аппаратуры&lt;br /&gt;
* iff — если, и только если&lt;br /&gt;
* LTL — линейная временная логика&lt;br /&gt;
* PSL — язык спецификации свойств&lt;br /&gt;
* OBE — дополнительное расширение ветвления&lt;br /&gt;
* RTL — уровень регистровых передач&lt;br /&gt;
* SERE — последовательное расширенное регулярное выражение&lt;br /&gt;
* VHDL — VHSIC язык описания аппаратуры&lt;br /&gt;
* VHSIC — высоко скоростная интегральная схема&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 4.1.1 Слои (Layers) ====&lt;br /&gt;
PSL состоит из четырёх слоёв: булевый (Boolean), временной (temporal), верификационный (verification), и модельный (modeling).&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.1 Булевый слой (Boolean layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The Boolean layer is used to build expressions that are, in turn, used by the other layers. Although it contains&lt;br /&gt;
expressions of many types, it is known as the Boolean layer because it is the supplier of Boolean&lt;br /&gt;
expressions to the heart of the language—the temporal layer. Boolean layer expressions are evaluated in a&lt;br /&gt;
single evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Булевый слой используется для создания выражений, которые, в свою очередь, используются другими слоями. Хотя этот слой содержит выражения над многими типами, он называется как булевый слой, потому что он является поставщиком булевых (логических) выражений для основы (сердца)  языка — временнОго слоя. Выражения булевого слоя выполняются в едином (одиночном) цикле выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.2 ВременнОй слой (Temporal layer) =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
The temporal layer is the heart of the language; it is used to describe properties of the design. It is known as&lt;br /&gt;
the temporal layer because, in addition to simple properties, such as “signals a and b are mutually&lt;br /&gt;
exclusive,” it can also describe properties involving complex temporal relations between signals, such as, “if&lt;br /&gt;
signal c is asserted, then signal d shall be asserted before signal e is asserted, but no more than eight clock&lt;br /&gt;
cycles later.” Temporal expressions are evaluated over a series of evaluation cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой является основой языка; он используется для описания свойств проекта. Он называется временным, потому что, в дополнение к простым свойствам, таким как &amp;quot;сигналы a и b являются взаимноисключающими&amp;quot;, он может также описывать свойства включающие сложные временные отношения между сигналами, например &amp;quot;если сигнал c устанавливается, тогда сигнал d должен установиться прежде, чем сигнал e установится, но не позже более восьми периодов синхросигнала&amp;quot;. ВременнЫе выражения выполняются в течении серии циклов выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.3 Верификационный слой (Verification layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The verification layer is used to tell the verification tools what to do with the properties described by the&lt;br /&gt;
temporal layer. For example, the verification layer contains directives that tell a tool to verify that a property&lt;br /&gt;
holds or to check that a specified sequence is covered by some test case.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верификационный слой используется для того чтобы сказать верификационному инструменту (САПР), что делать с свойствами описанными во временном слое. Например, верификационный слой включает директивы, которые говорят инструменту (САПР) чтобы верифицировал (verify) то, что свойство удерживает (hold) или  проверил (check) то, что заданная последовательность покрыта некоторым тестирующим случаем.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.4 Моделирующий слой (Modeling layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The modeling layer is used to model the behavior of design inputs (for tools, such as formal verification&lt;br /&gt;
tools, which do not use test cases) and to model auxiliary hardware that is not part of the design, but is&lt;br /&gt;
needed for verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Моделирующий слой (Modeling layer) используется для моделирования поведения входов проекта (для инструментов (САПР), таких как инструменты (САПР) для формальной верификации, которые не используют тестов) и для моделирования дополнительной аппаратуры, которая не является частью проекта, но необходима для верификации.&lt;br /&gt;
&lt;br /&gt;
==== 4.1.2 Стили/Варианты (Flavors) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL comes in five flavors: one for each of the hardware description languages SystemVerilog, Verilog,&lt;br /&gt;
VHDL, SystemC, and GDL. The syntax of each flavor conforms to the syntax of the corresponding HDL in&lt;br /&gt;
a number of specific areas—a given flavor of PSL is compatible with the corresponding HDL’s syntax in&lt;br /&gt;
those areas.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идёт с пятью вариантами/стилями (flavors): один для каждого HDL языка SystemVerilog, Verilog, VHDL, SystemC, и GDL. Синтаксис каждого варианта (стиля) соответствует синтаксису соответствующего HDL языка в ряде конкретных областей — данный стиль PSL совместим с соответствующим синтаксисом HDL-языка в этой области.&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Влияние стиля на слои PSL&lt;br /&gt;
!rowspan=2| Слой ||colspan=5 | HDL&lt;br /&gt;
|-&lt;br /&gt;
!  SystemVerilog || Verolog || VHDL || SystemC || GDL&lt;br /&gt;
|-&lt;br /&gt;
| Булевый || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Модельный  || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Временной || i:j || i:j || i to j || i:j ||  i..j&lt;br /&gt;
|-&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Лексическая структура ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the identifiers, keywords, operators, macros, and comments used in PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет идентификаторы, ключевые слова, операторы, макросы и комментарии, используемые в PSL.&lt;br /&gt;
 &lt;br /&gt;
==== 4.2.1 Идентификаторы (Identifiers) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Identifiers in PSL consist of an alphabetic character, followed by zero or more alphanumeric characters;&lt;br /&gt;
each subsequent alphanumeric character may optionally be preceded by a single underscore character.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Идентификаторы в PSL состоят из символа латинского алфавита, за которым следует ноль или более символов латинского алфавита; каждый последующий символ алфавита может по желанию предшествовать одному символу подчеркивания. Например:&lt;br /&gt;
&lt;br /&gt;
 mutex&lt;br /&gt;
 Read_Transaction&lt;br /&gt;
 L_123&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL identifiers are case-sensitive in the SystemVerilog, Verilog, and SystemC flavors and case-insensitive in&lt;br /&gt;
the VHDL and GDL flavors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идентификаторы являются чувстительными к регистру в SystemVerilog, Verilog, и SystemC вариантах/стилях и не чувствительными к регистру в VHDL и GDL вариантах.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.2 Ключевые слова ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;poem&amp;gt; A&lt;br /&gt;
 E&lt;br /&gt;
 next!&lt;br /&gt;
 rose&lt;br /&gt;
AF&lt;br /&gt;
 EF&lt;br /&gt;
 next_a&lt;br /&gt;
AG&lt;br /&gt;
 EG&lt;br /&gt;
 next_a!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; sequence&lt;br /&gt;
AX&lt;br /&gt;
abort&lt;br /&gt;
 EX&lt;br /&gt;
 next_e&lt;br /&gt;
 stable&lt;br /&gt;
always&lt;br /&gt;
 ended&lt;br /&gt;
 next_e!&lt;br /&gt;
string&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;anda&lt;br /&gt;
 eventually!&lt;br /&gt;
 next_event&lt;br /&gt;
 strong&lt;br /&gt;
assert&lt;br /&gt;
 next_event!&lt;br /&gt;
 sync_abort&lt;br /&gt;
assume&lt;br /&gt;
 F&lt;br /&gt;
 next_event_a&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;async_abort&lt;br /&gt;
fairness&lt;br /&gt;
 next_event_a!&lt;br /&gt;
 toe&lt;br /&gt;
before&lt;br /&gt;
 fell&lt;br /&gt;
 next_event_e&lt;br /&gt;
before!&lt;br /&gt;
 for&lt;br /&gt;
 next_event_e!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; U&lt;br /&gt;
before!_&lt;br /&gt;
 forall&lt;br /&gt;
 nondet&lt;br /&gt;
 union&lt;br /&gt;
before_&lt;br /&gt;
 nondet_vector&lt;br /&gt;
 until&lt;br /&gt;
bitvector&lt;br /&gt;
 bit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; G&lt;br /&gt;
 notc&lt;br /&gt;
 until!&lt;br /&gt;
boolean&lt;br /&gt;
 numeric&lt;br /&gt;
 until!_&lt;br /&gt;
hdltype&lt;br /&gt;
until_&lt;br /&gt;
clock&lt;br /&gt;
 onehot&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;const&lt;br /&gt;
 in&lt;br /&gt;
 onehot0&lt;br /&gt;
 vmode&lt;br /&gt;
countones&lt;br /&gt;
 inf&lt;br /&gt;
 ord&lt;br /&gt;
 vpkg&lt;br /&gt;
cover&lt;br /&gt;
 inherit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; vprop&lt;br /&gt;
isb&lt;br /&gt;
 property&lt;br /&gt;
 vunit&lt;br /&gt;
default&lt;br /&gt;
 isunknown&lt;br /&gt;
 prev&lt;br /&gt;
W&lt;br /&gt;
report&lt;br /&gt;
mutable&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; within&lt;br /&gt;
restrict&lt;br /&gt;
restrict!&lt;br /&gt;
never&lt;br /&gt;
 X&lt;br /&gt;
next&lt;br /&gt;
 X!&amp;lt;/poem&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*a and is a keyword only in the VHDL flavor; see the flavor macro AND_OP (4.3.2.6).&lt;br /&gt;
*b is is a keyword only in the VHDL flavor; see the flavor macro DEF_SYM (4.3.2.9).&lt;br /&gt;
*c not is a keyword only in the VHDL flavor; see the flavor macro NOT_OP (4.3.2.6).&lt;br /&gt;
*d or is a keyword only in the VHDL flavor; see the flavor macro OR_OP (4.3.2.6).&lt;br /&gt;
*e to is a keyword only in the VHDL flavor; see the flavor macro RANGE_SYM (4.3.2.7).&lt;br /&gt;
&lt;br /&gt;
==== 4.2.3 Операторы ====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.1 Операторы HDL языка =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
For a given flavor of PSL, the operators of the underlying HDL have the highest precedence. In particular,&lt;br /&gt;
this includes logical, relational, and arithmetic operators of the HDL. The HDL’s logical operators for&lt;br /&gt;
negation, conjunction, and disjunction of Boolean values may be used in PSL for negation, conjunction, and&lt;br /&gt;
disjunction of properties as well. In such applications, those operators have their usual precedence and&lt;br /&gt;
associativity, as if the PSL properties that are operands produced Boolean values of a type appropriate to the&lt;br /&gt;
logical operators native to the HDL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для заданного стиля PSL, операторы основного HDL языка имеют наивысший преоритет. В частности это включает логические, арифметические операторы и операторы отношения языка HDL. Логические операции HDL языка для отрицания,  конъюнкции и дизъюнкции булевых (логических) значений могут использоваться в PSL для отрицания, конъюнкции и дизъюнкции свойств. В таких приложениях, эти операторы имеют их обычный приоритет и ассоциативность, как если бы PSL свойства,....&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.2 Операторы фундаментального языка =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Various operators are available in PSL. Each operator has a precedence relative to other operators. In&lt;br /&gt;
general, operators with a higher relative precedence are associated with their operands before operators with&lt;br /&gt;
a lower relative precedence. If two operators with the same precedence appear in sequence, then the&lt;br /&gt;
operators are associated with their operands according to the associativity of the operators. Left-associative&lt;br /&gt;
operators are associated with operands in left-to-right order of appearance in the text; right-associative&lt;br /&gt;
operators are associated with operands in right-to-left order of appearance in the text.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Различные операторы доступны в PSL. Каждый оператор имеет приоритет по отношению к другим операторам. В общем операторы с большим приоритетом получают доступ к свои операндам, раньше, чем операнды с меньшим приоритетом. Если два оператора имеют одинаковый приоритет и появляются в последовательности, то они получают доступ к свои операндам в соответствие с ассоциативностью операторов. Лева-ассоциативные оператор получает доступ к своим операндам слева на право в порядке появления в тексте, право-ассоциативные операторы получают доступ к своим операндам справа на лева в порядке появления в тексте.   &lt;br /&gt;
 &lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица приоритетов и ассоциативности двух операторов фундаментального языка  &lt;br /&gt;
|-&lt;br /&gt;
! Оператор класс || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| ''(наивысший приоритет)''&lt;br /&gt;
&lt;br /&gt;
HDL операторы&lt;br /&gt;
| ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор объединения || left || union ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор времени || left || @ ||&lt;br /&gt;
|-&lt;br /&gt;
| SERE повторяющийся оператор || left || [* ] [+] [= ] [-&amp;gt; ] ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный предельный оператор || left || within ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор И || left || &amp;amp; || &amp;amp;&amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор ИЛИ || left || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор слияния || left || : ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор конкатенации || left || ; ||&lt;br /&gt;
|-&lt;br /&gt;
|  Операторы прерывания фундаментального языка || left || abort &amp;lt;br/&amp;gt; sync_abort || async_abort&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, указывающие местонахождение || right || next* || eventually!&lt;br /&gt;
|-&lt;br /&gt;
| || || X   X! || F&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, показывающие границы ||  right ||  U ||  W&lt;br /&gt;
|-&lt;br /&gt;
| || || until* || before*&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор импликации ||  right || &amp;lt;nowiki&amp;gt;|-&amp;gt;&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|=&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булевы операторы импликации || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Неизменные операторы фундаментального языка &amp;lt;br/&amp;gt; ''(низший приоритет)'' || right || always &amp;lt;br/&amp;gt; G || never&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 NOTE—The notation next* represents the next family of operators, which includes the operators next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a!, and&lt;br /&gt;
 next_event_e!. The notation until* represents the until family of operators, which includes the operators until,&lt;br /&gt;
 until!, until_, and until!_. The notation before* represents the before family of operators, which includes&lt;br /&gt;
 the operators before, before!, before_, and before!_.7&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 Примечание - Обозначение next* представляет семейство next-операторов, которое включает операторы: next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a! и&lt;br /&gt;
 next_event_e!. Обозначение until* представляет семейство until-операторов, которое включает операторы: until,&lt;br /&gt;
 until!, until_ и until!_. Обозначение before* представляет семейство before-операторов, которое включает операторы: before, before!, before_, and before!_.7&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.1 Объединительные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence after the HDL operators is that used to indicate a non-deterministic expression:&lt;br /&gt;
&lt;br /&gt;
 union   union operator&lt;br /&gt;
&lt;br /&gt;
The union operator is left-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL оператор со следующим наибольшим приоритетом после HDL операторов является тот, который используется для обозначения недетерминированного выражения:&lt;br /&gt;
&lt;br /&gt;
 union   union оператор&lt;br /&gt;
&lt;br /&gt;
Оператор union является лева-ассоциативным.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.2 Операторы времени ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the clocking operator, which is&lt;br /&gt;
used to associate a clock expression with a property or sequence:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это оператор времени, который используется для связи временного выражения со свойством или последовательностью:&lt;br /&gt;
&lt;br /&gt;
 @   clock event&lt;br /&gt;
&lt;br /&gt;
Временной оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.3 SERE операторы повторов (repetition operators) ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For any flavor of PSL, the FL operators with the next highest precedence are the repetition operators, which&lt;br /&gt;
are used to construct Sequential Extended Regular Expressions (SEREs). These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL операторы со следующим наибольшим приоритетом являются операторами повторов, которые используются для создания последовательных расширенных регулярных выражений (Sequential Extended Regular Expressions — SEREs). Эти операторы следующие:&lt;br /&gt;
&lt;br /&gt;
 [* ]   последовательное повторение (consecutive repetition)&lt;br /&gt;
 [+]    последовательное повторение (consecutive repetition)&lt;br /&gt;
 [= ]   не последовательное повторение (non-consecutive repetition)&lt;br /&gt;
 [-&amp;gt; ]  goto repetition&lt;br /&gt;
&lt;br /&gt;
SERE операторы повторения являются лева-ассоциативными.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.4 Последовательный предельный оператор ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence within operator,&lt;br /&gt;
which is used to describe behavior in which one sequence occurs during the course of another, or within a&lt;br /&gt;
time-bounded interval:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный предельный оператор, который используется для описания поведения, в котором одна последовательность появляется в ходе другой, или в пределах интервала ограниченного временем.&lt;br /&gt;
&lt;br /&gt;
 within    последовательность within оператор&lt;br /&gt;
&lt;br /&gt;
Последовательный предельный оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.5 Последовательные операторы конъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the sequence conjunction&lt;br /&gt;
operators, which are used to describe behavior consisting of parallel paths. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетов - это последовательные операторы конъюнкции, которые описывают поведение состоящие из параллельных стадий. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;    последовательная конъюнкция без сопоставления длинны&lt;br /&gt;
 &amp;amp;&amp;amp;   последовательная конъюнкция с сопоставлением длины&lt;br /&gt;
&lt;br /&gt;
Последовательные операторы конъюнкции лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.6 Последовательный оператор дизъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence disjunction operator,&lt;br /&gt;
which is used to describe behavior consisting of alternative paths:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор дизъюнкции, который используются для описания поведения состоящего из альтернативных стадий:&lt;br /&gt;
&lt;br /&gt;
 |    последовательная дизъюнкция&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор дизъюнкции лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.7 Последовательный оператор слияния ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence fusion operator,&lt;br /&gt;
which is used to describe behavior in which a later sequence starts in the same cycle in which an earlier&lt;br /&gt;
sequence completes:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор слияния, который используется для описания поведения, в котором более поздняя последовательность начинает выполняться в том же цикле, в котором заканчивает выполняться более ранняя.&lt;br /&gt;
&lt;br /&gt;
 :    последовательное слияние&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор слияния лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.8 Последовательный оператор конкатенации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence concatenation&lt;br /&gt;
operator, which is used to describe behavior in which one sequence is followed by another:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального со следующим наивысшим приоритетом - это последовательный оператор конкатенации, который используется, чтобы описывать поведение, в котором одна последовательность следует за другой:&lt;br /&gt;
&lt;br /&gt;
 ;    последовательная конкатенация&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор конкатенации лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.9 Операторы прерывания фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the FL termination operators,&lt;br /&gt;
which are used to describe behavior in which a condition causes both current and future obligations to be&lt;br /&gt;
canceled:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом - это операторы прерывания фундаментального языка, которые используются для описания поведения, в котором условие вызывает текущие и будущие процессы, которые будут прерваны:&lt;br /&gt;
&lt;br /&gt;
 sync_abort    немедленное завершение текущего и следующего процесса, синхронизовано по времени&lt;br /&gt;
 async_abort   немедленное прерывание текущего и следующего процесса, независт от времени&lt;br /&gt;
 abort         эквивалентно to async_abort&lt;br /&gt;
&lt;br /&gt;
Операторы прерывания фундаментального языка лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.10 Операторы местонахождения фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which an operand holds in the future. These operators are as follows:&lt;br /&gt;
eventually! the right operand holds at some time in the indefinite future&lt;br /&gt;
 next*     the right operand holds at some specified future time or range of future times&lt;br /&gt;
FL occurrence operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором операнды используются в будущем. Это следующие операторы: &lt;br /&gt;
eventually! правый операнд выполняется через некоторое время в неопределенном будущем&lt;br /&gt;
 next*     правый операнд выполняется в некотором специфицированном будущем времени или диапазоне будущего времени&lt;br /&gt;
операторы местонахождения фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.11 Граничные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which one property holds in some cycle or in all cycles before another property holds. These operators are&lt;br /&gt;
as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые описывают поведение, в котором одно свойство выполняется в некотором цикле или во всех циклах перед выполнением следующего слова. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
until*     левый операнд выполняется в любое время до выполнения правого операнда &lt;br /&gt;
before*    левый операнд выполняется через некоторое время после выполнения правого&lt;br /&gt;
&lt;br /&gt;
Граничные операторы фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.12 Суффиксные операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a property that holds at the end of a given sequence. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из свойства, которое выполняется в конце данной последовательности. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 |-&amp;gt;    суффиксная импликация с перекрытием&lt;br /&gt;
 |=&amp;gt;    суффиксная импликация без перекрытия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The suffix implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы суффиксной импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE—The FL Property {r} (f) is an alternative form for (and has the same semantics as) the FL Property {r} |-&amp;gt; f.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание - Свойство фундаментального языка {r} (f) - это альтернативная форма (и имеет такую же семантику) для свойства фундаментального языка {r} |-&amp;gt; f.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.13 Операторы логической импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a Boolean, a sequence, or a property that holds if another Boolean, sequence, or property holds.&lt;br /&gt;
These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторый фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из Булевых выражений, последовательности или свойства, которое выполняется, если выполняется другое Булево выражение, последовательность или свойство.  &lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;    логическая IF импикация&lt;br /&gt;
 &amp;lt;-&amp;gt;   логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The logical IF and logical IFF implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы логической импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.14 Операторы неизменности фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which a property does or does not hold, globally. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором выполняется или не выполняется глобально. &lt;br /&gt;
&lt;br /&gt;
 always   правый операнд выполняется глобально&lt;br /&gt;
 never    правый операнд не выполняется глобально&lt;br /&gt;
&lt;br /&gt;
Операторы неизменности фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.3 Операторы дополнительного расширенного ветвления (OBE) =====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица 3—OBE оператор, приоритет и ассоциативность&lt;br /&gt;
|-&lt;br /&gt;
! Класс оператора || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| (наивысший приоритет)&amp;lt;br/&amp;gt;HDL операторы || || ||&lt;br /&gt;
|-&lt;br /&gt;
| OBE операторы местонахождения ||left ||  AX AG AF&amp;lt;br/&amp;gt; A [ U ] || EX EG EF &amp;lt;br/&amp;gt;E [ U ]&lt;br /&gt;
|-&lt;br /&gt;
| Операторы Булевой импликации&amp;lt;br/&amp;gt;(низший приоритет) || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.1 OBE операторы местонахождения ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence after the HDL operators are&lt;br /&gt;
those used to specify when a subordinate property is required to hold, if the parent property is to hold. These&lt;br /&gt;
operators include the following:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы являются следующими операторами с наивысшим приоритетом, после HDL операторов, они используются для указания, когда подчиненное свойство должно выполняться, если выполняется старшее свойство. Это следующие операторы:   &lt;br /&gt;
&lt;br /&gt;
 AX    на всех путях, на следующем состоянии каждого пути&lt;br /&gt;
 AG    на всех путях, на каждом состоянии любого пути&lt;br /&gt;
 AF    на всех путях, на некотором будущем состоянии каждого пути&lt;br /&gt;
 EX    на некотором пути, на следующем состоянии пути&lt;br /&gt;
 EG    на некотором пути, на всех состояния пути&lt;br /&gt;
 EF    на некотором пути , на некотором будущем состоянии пути&lt;br /&gt;
 A[U]  на всех путях, в каждом состоянии до определенного состояния пути&lt;br /&gt;
 E[U]  на некотором пути, в каждом состоянии до определенного состояния пути&lt;br /&gt;
&lt;br /&gt;
OBE операторы местонахождения лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.2 OBE операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence are those used to describe&lt;br /&gt;
behavior consisting of a Boolean or a property that holds if another Boolean or property holds. These&lt;br /&gt;
operators are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы со следующим наивысшим приоритетом, это те которые используются для описания поведения, состоящего из Булевых выражений или свойства, которое выполняется, если Булево выражение или другое свойство выполняется. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;   логическая IF импликация&lt;br /&gt;
 &amp;lt;-&amp;gt;  логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
Операторы логической IF и логической IFF импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.4 Макросы ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL provides macro processing capabilities that facilitate the definition of properties. SystemC, VHDL, and&lt;br /&gt;
GDL flavors support cpp pre-processing directives (e.g., #define, #ifdef, #else, #include, and #undef).&lt;br /&gt;
SystemVerilog and Verilog flavors support Verilog compiler directives (e.g., `define, `ifdef, `else, `include,&lt;br /&gt;
and `undef). All flavors also support PSL macros %for and %if, which can be used to conditionally or&lt;br /&gt;
iteratively generate PSL statements. The cpp or Verilog compiler directives shall be interpreted first, and&lt;br /&gt;
PSL %if and %for macros shall be interpreted second.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предоставляет возможность обработки макросов, которые помогают в определении свойств. SystemC, VHDL и&lt;br /&gt;
GDL варианты поддерживают cpp препроцессорные директивы (т.е.  #define, #ifdef, #else, #include и #undef).&lt;br /&gt;
SystemVerilog и Verilog поддерживают директивы Verilog компилятора (т.е. `define, `ifdef, `else, `include и `undef). Все варианты, также поддерживают PSL макросы %for и %if, которые могут использоваться для условно или итеративно генерированного PSL утверждения. Компилированные директивы Verilog или cpp должны быть интерпретированы первыми, макросы PSL %if и %for должны быть интепретированы вторыми &lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.1 Конструкция %for =====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.2 Конструкция %if =====&lt;br /&gt;
&lt;br /&gt;
==== 4.2.5 Комментарии ====&lt;br /&gt;
&lt;br /&gt;
PSL обеспечивает возможность вставки комментариев в PSL спецификацию. Для каждого стиля, возможность комментариев совместима с тем, что обеспечивается соответсвующией средой PSL.&lt;br /&gt;
&lt;br /&gt;
Для SystemC, SystemVerilog, и Verilog стиля, оба варианта блочных комментариев (/* .... */) и (// .... ''&amp;lt;eol&amp;gt;'') поддерживается. (''&amp;lt;eol&amp;gt;'' — конец строки)&lt;br /&gt;
&lt;br /&gt;
Для стиля VHDL, поддерживается комментарии (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Для стиля GDL, оба блочных стилей комментариев поддерживаются: (/* .... */) и (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Синтаксис ===&lt;br /&gt;
&lt;br /&gt;
==== 4.3.1 Соответствия ====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
! Операнд || SystemVerilog || Verilog || VHDL || SystemC ||  GDL&lt;br /&gt;
|-&lt;br /&gt;
| И || &amp;amp;&amp;amp; || &amp;amp;&amp;amp; || and || &amp;amp;&amp;amp; || &amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| ИЛИ || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || or || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| НЕ || ! || ! || not || ! || !&lt;br /&gt;
|-&lt;br /&gt;
| ДИАПАЗОН ||  : ||  : ||  to || :|| ..&lt;br /&gt;
|-&lt;br /&gt;
| МИНИМАЛЬНОЕ ЗНАЧЕНИЕ || 0 || 0 || 0 || 0 || null&lt;br /&gt;
|-&lt;br /&gt;
| МАКСИМАЛЬНОЕ ЗНАЧЕНИЯ || $ ||  inf || inf || inf || null&lt;br /&gt;
|-&lt;br /&gt;
| ЛЕВАЯ ГРАНИЦА || [ || [ || ( || [ || (&lt;br /&gt;
|-&lt;br /&gt;
| ПРАВАЯ ГРАНИЦА || ] || ] || ) || ] || )&lt;br /&gt;
|-&lt;br /&gt;
| ПРИСВАИВАНИЕ || = || = || is || = || :=&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Семантика ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The following subclauses introduce various general concepts related to temporal property specification and&lt;br /&gt;
explain how they apply to PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Следующие подпункты представляют различные общие концепции связанные со спецификацией временных свойств и пояснения того, как они применяются в PSL.  &lt;br /&gt;
&lt;br /&gt;
==== 4.4.1 Временная оценка против не временной оценки ====&lt;br /&gt;
&lt;br /&gt;
== NEW ==&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)</id>
		<title>PSL/IEEE Standard 1850-2010 for Property Specification Language (PSL)</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)"/>
				<updated>2013-10-23T16:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.3 Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Обзор ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Возможность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard defines the property specification language (PSL), which formally describes electronic system&lt;br /&gt;
behavior. This standard specifies the syntax and semantics for PSL and also clarifies how PSL interfaces&lt;br /&gt;
with various standard electronic system design languages.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт определяет язык свойств спецификации (PSL), который формально описывает поведение электронных систем. Этот стандарт специфицирует синтаксис и семантику для PSL, а также разъясняет, как PSL взаимодействует с различными стандартами языков описания электронных систем.&lt;br /&gt;
&lt;br /&gt;
===1.2 Назначение===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of this standard is to provide a well-defined language for formal specification of electronic&lt;br /&gt;
system behavior, one that is compatible with multiple electronic system design languages, including IEEE&lt;br /&gt;
Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), and IEEE Std&lt;br /&gt;
1666TM (SystemC®), to facilitate a common specification and verification flow for multi-language and&lt;br /&gt;
mixed-language designs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Назначение этого стандарта заключается в том, чтобы предоставить четкий язык для формальной спецификации поведения электронных систем, который будет совместим с множеством языков описания электронных систем, включая IEEE Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), и IEEE Std 1666TM (SystemC®), способствуя общему потоку верификации и спецификации для проектов описанных на разных и смешанных языках.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard creates an updated IEEE standard based upon IEEE Std 1850-2005. The updated standard will&lt;br /&gt;
refine IEEE standard, addressing errata, minor technical issues, and proposed extensions specifically related&lt;br /&gt;
to property reuse and improved simulation usability.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт создает обновленный IEEE стандарт базирующийся на IEEE Std 1850-2005. Обновленный стандарт усовершенствует IEEE стандарт, адресные опечатки, незначительные технические вопросы и предполагаемого расширения непосредственно связанных свойств, для дальнейшего использования и облегчения моделирования.&lt;br /&gt;
       &lt;br /&gt;
==== 1.2.1 Происхождение ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The complexity of Very Large Scale Integration (VLSI) has grown to such a degree that traditional&lt;br /&gt;
approaches have begun to reach their limitations, and verification costs have reached 60%–70% of&lt;br /&gt;
development resources. The need for advanced verification methodology, with improved observability of&lt;br /&gt;
design behavior and improved controllability of the verification process, has become critical. Over the last&lt;br /&gt;
decade, a methodology based on the notion of “properties” has been identified as a powerful verification&lt;br /&gt;
paradigm that can assure enhanced productivity, higher design quality, and, ultimately, faster time to market&lt;br /&gt;
and higher value to engineers and end-users of electronics products. Properties, as used in this context, are&lt;br /&gt;
concise, declarative, expressive, and unambiguous specifications of desired system behavior that are used to&lt;br /&gt;
guide the verification process. IEEE 1850 PSL is a standard language for specifying electronic system&lt;br /&gt;
behavior using properties. PSL facilitates property-based verification using both simulation and formal&lt;br /&gt;
verification, thereby enabling a productivity boost in functional verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сложность проектов с очень большой степенью интеграции (VLSI) выросла до такого уровня, что традиционные подходы начали достигать своего предела, а издержки верификации достигли 60%-70% от ресурсов разработки. Потребность в более продвинутой методологии верификации, с улучшенной наблюдаемостью  поведения проекта и улучшенной контролируемостью (способностью контроля) процесса верификации, стала критической. За последние 10 лет, методология, базирующаяся на понятии &amp;quot;свойств&amp;quot;, была определена, как мощная парадигма верификации, которая способна обеспечить повышение производительности (эффективности), повышенное качество проекта, и значительно ускорить время выхода на рынок (time to market), увеличить число производителей (higher value to engineers?) и пользователей электронных продуктов. Свойства, используемые в данном контексте, являются краткие, декларативные/описательные (declarative), выразительные/ясные/точные (expressive) и однозначные спецификации желаемого поведения системы, которые используются для проведения процесса верификации. IEEE 1850 PSL стандартный язык для описания (спецификации) поведения электронной системы, используя свойства. PSL облегчает верификацию основанную на свойствах (property-based verification) с использованием как моделирования так и формальной верификации, что позволяет повысить эффективность функциональной верификации.&lt;br /&gt;
&lt;br /&gt;
====1.2.2 Мотивация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Ensuring that a design’s implementation satisfies its specification is the foundation of hardware verification.&lt;br /&gt;
Key to the design and verification process is the act of specification. Yet historically, the process of&lt;br /&gt;
specification has consisted of creating a natural language description of a set of design requirements. This&lt;br /&gt;
form of specification is both ambiguous and, in many cases, unverifiable due to the lack of a standard&lt;br /&gt;
machine-executable representation. Furthermore, ensuring that all functional aspects of the specification&lt;br /&gt;
have been adequately ''verified'' (that is, covered) is problematic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Обеспечение реализации проекта удовлетворяющей его спецификацию, является  основным для верификации аппаратуры. Ключ к проекту и процессу верификации является законом спецификации. Исторически, процесс спецификации состоял из создания языкового описания набора требований к проекту. Эта форма спецификации неоднозначная, и во многих случаях неверифицируема в связи с отсутствием стандарта машинно-выполняемого представления. Кроме того, обеспечение, того чтобы все функциональные аспекты спецификации были адекватно ''верифицированы'' (т.е. покрыты), довольно проблематично.           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The IEEE PSL was developed to address these shortcomings. It gives the design architect a standard means&lt;br /&gt;
of specifying design properties using a concise syntax with clearly-defined formal semantics. Similarly, it&lt;br /&gt;
enables the RTL implementer to capture design intent in a verifiable form, while enabling the verification&lt;br /&gt;
engineer to validate that the implementation satisfies its specification through ''dynamic'' (that is, simulation)&lt;br /&gt;
and ''static'' (that is, formal) verification means. Furthermore, it provides a means to measure the quality of the&lt;br /&gt;
verification process through the creation of functional coverage models built on formally specified&lt;br /&gt;
properties. In addition, it provides a standard means for hardware designers and verification engineers to&lt;br /&gt;
create a rigorous and machine-executable design specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
IEEE PSL был создан, чтобы устранить эти недостатки. Это дает архитектуре проекта стандарт, означающий спецификацию свойств проекта&lt;br /&gt;
используемых краткий синтаксис с простой формальной семантикой. Аналогичным образом, позволяется RTL-исполнителю определить цели проекта в проверяемых формах, пока разрешается верификации подтвердить, что выполнение окончено и его спецификация определена через ''динамическую'' ( моделирование) и статическую (формальную) верификацию. Более того, он предоставляет средства для определения качества процесса верификации, через создание полной функциональной модели построения на формально специфицированных свойствах. В дополнение, он предоставляет стандартные средства для аппаратуры проекта и инженера верификации при создании строгой и исполняемой машиной спецификации проекта.&lt;br /&gt;
&lt;br /&gt;
====1.2.3 Цели====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was specifically developed to fulfill the following general hardware functional specification&lt;br /&gt;
requirements:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был специально создан для исполнения следующих общих аппаратных функциональных требований:&lt;br /&gt;
* Легко обучать, чиать и писать&lt;br /&gt;
* Краткий синтаксис&lt;br /&gt;
* Строго определенная формальная семантика&lt;br /&gt;
* Выразительная мощность, позволяющая специфицировать большие классы реальных проектов&lt;br /&gt;
* Известные эффективные алгоритмы моделирования, такие же как формальная верификация&lt;br /&gt;
&lt;br /&gt;
===1.3 Использование===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a language for the formal specification of hardware. It is used to describe properties that are required&lt;br /&gt;
to hold in the design under verification. PSL provides a means to write specifications that are both easy to&lt;br /&gt;
read and mathematically precise. It is intended to be used for functional specification on the one hand and as&lt;br /&gt;
input to functional verification tools on the other. Thus, a PSL specification is an executable specification of&lt;br /&gt;
a hardware design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL язык для формальной спецификации аппаратуры. Он используется для описания свойств, которые требуют поддержки в проекте под верификацию. PSL предоставляет средства для написания спецификаций, которые легко читаются и математически точны. Это предназначение используется для функциональной спецификации, с одной стороны, и как вход в программы функциональной верификации, с другой. Таким образом, спецификация PSL - это исполняемая спецификация для аппаратного проекта.&lt;br /&gt;
      &lt;br /&gt;
====1.3.1 Функциональная спецификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can be used to capture requirements regarding the overall behavior of a design, as well as assumptions&lt;br /&gt;
about the environment in which the design is expected to operate. PSL can also capture internal behavioral&lt;br /&gt;
requirements and assumptions that arise during the design process. Both enable more effective functional&lt;br /&gt;
verification and reuse of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL может использоваться для выделения требований относительно общего поведения проекта, также как допущения о среде, в которой ожидается обработка проекта. PSL также может выделять внутреннее поведение требований и допущений, которые возникают в процессе обработки проекта. Доступными являются более эффективная функциональная верификация и продолжения обработки самого проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
One important use of PSL is for documentation, either in place of or along with an English specification. A&lt;br /&gt;
PSL specification can describe simple invariants (for example, signals &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; are never asserted simultaneously) as well as multi-cycle behavior (for example, correct&lt;br /&gt;
behavior of an interface with respect to a bus protocol or correct behavior of pipelined operations).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Один из важных аспектов использования PSL - это использование для документации, как вместо, так и совместно с английской спецификацией. Спецификация PSL может описать простые инварианты (например: сигналы &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; никогда не используются в одно время), также как многотактовое поведение (например: правильное поведение интерфейса с поддержкой протокола шины или правильное поведение конвейерных операций).  &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification consists of ''assertions'' regarding ''properties'' of a design under a set of ''assumptions''. A&lt;br /&gt;
''property'' is built from three kinds of elements: ''Boolean expressions'', which describe behavior over one cycle;&lt;br /&gt;
''sequential expressions'', which can describe multi-cycle behavior; and ''temporal operators'', which describe&lt;br /&gt;
temporal relationships among Boolean expressions and sequences. For example, consider the following&lt;br /&gt;
Verilog Boolean expression:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL состоит из ''утверждений'' относительно ''свойства'' проекта под набором ''допущений''. ''Свойство'' строится из трех видов элементов: ''Булевы выражения'', которые описывают поведение в одно цикле; ''последовательные выражения'', которые могут описывать многотактовое поведение;  и ''временные операторы'', которые описывают временные взаимоотношения между Булевыми выражениями и последовательностями. Например, Булево выражение в Verilog:&lt;br /&gt;
&lt;br /&gt;
 ena || enb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This expression describes a cycle in which at least one of the signals &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; are asserted. The PSL&lt;br /&gt;
sequential expression&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это выражение описывает цикл, в котором, по крайней мере, один из сигналов &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен. Последовательное выражение PSL&lt;br /&gt;
&lt;br /&gt;
 {req; ack; !cancel}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
describes a sequence of cycles, such that req is asserted in the first cycle, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is asserted in the second&lt;br /&gt;
cycle, and &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; is deasserted in the third cycle. The following property, obtained by applying the&lt;br /&gt;
temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; to these expressions,&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
описывает последовательность циклов, такую, что если &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; активен в первом цикле, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; активен во втором цикле, а &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt;  неактивен  в третьем цикле. Следующее свойство получается, применяя временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; к этим выражениям,&lt;br /&gt;
&lt;br /&gt;
 always {req;ack;!cancel} |=&amp;gt; (ena || enb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
means that always (that is, in every cycle), if the sequence &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt; occurs, then either &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;&lt;br /&gt;
or &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; is asserted one cycle after the sequence ends. Adding the directive &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
это значит, что всегда (в каждом цикле), если встречается последовательность &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt;, то либо &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;, либо &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен в течение цикла после окончания последовательности. Добавляя директиву &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; следующей:   &lt;br /&gt;
&lt;br /&gt;
 assert always {req;ack;!cancel} |=&amp;gt; (ena || enb);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
completes the specification, indicating that this property is expected to hold in the design and that this&lt;br /&gt;
expectation needs to be verified.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
завершается спецификация, указывая, что это свойство ожидается в проекте и что потребности это ожидания нужно верифицировать.&lt;br /&gt;
  &lt;br /&gt;
====1.3.2 Функциональная верификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can also be used as input to verification tools, for both verification by simulation, as well as formal&lt;br /&gt;
verification using a model checker or a theorem prover. Each of these is discussed in the subclauses that&lt;br /&gt;
follow.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL также может использоваться, как вход для программ верификации, как для верификации моделированием, так и для формальной верификации, используется проверка модели или теоретическое доказательство. Каждый вариант обсуждается в следующих пунктах.&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.1 Моделирование=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification can also be used to automatically generate checks of simulated behavior. This can be&lt;br /&gt;
done, for example, by directly integrating the checks in the simulation tool; by interpreting PSL properties in&lt;br /&gt;
a testbench automation tool that drives the simulator; by generating HDL monitors that are simulated&lt;br /&gt;
alongside the design; or by analyzing the traces produced during simulation.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL также может использоваться для автоматического генерирования проверок поведения моделирования. Это может быть реализовано, например, прямой интеграцией проверок в программе моделирования; интерпретацией свойств PSL в тестовую автоматизированную программу, которая сопровождает симулятор; генерированием HDL контроллеров, которые моделируются рядом с проектом; или анализом путей пройденных во время моделирования.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  &lt;br /&gt;
For instance, the following PSL property:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Например, следующие PSL свойства:&lt;br /&gt;
&lt;br /&gt;
 Свойство 1: always (req -&amp;gt; next !req)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is a pulsed signal, i.e., if it is high in some cycle, then it is low in the following cycle.&lt;br /&gt;
Such a property can be easily checked using a simulation checker written in some HDL that has the&lt;br /&gt;
functionality of the finite state machine (FSM) shown in Figure 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
означает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; пульсирующий сигнал, т.е. если он принимает высокие значения в одном цикле,то он примет низкие значения в следующем цикле. Такое свойство может быть легко проверенно, используя проверки моделирования, написанные на каком-нибудь HDL, который имеет функциональность конечного автомат (FSM), показанный на Рисунке 1. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig01.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
!Рисунок 1—Простой FSM, который проверяет свойство 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For properties more complicated than the property shown in Figure 1, manually writing a corresponding&lt;br /&gt;
checker is painstaking and error-prone, and maintaining a collection of such checkers for a constantly changing design under development is a time-consuming task. Instead, a PSL specification can be used as input to&lt;br /&gt;
a tool that automatically generates simulatable checkers.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для более сложных свойств, чем то что представлено на рисунке 1, писать вручную соответствующие проверки - это кропотливый труд, подверженный ошибкам, и содержание набора таких проверок для постоянно изменяющегося проекта - это очень трудоемкое задание. Вместо этого, спецификация PSL может использоваться, как вход для программы, которая автоматически генерирует проверки, поддающиеся моделированию.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--     &lt;br /&gt;
Although in principle, all PSL properties can be checked for finite paths in simulation, the implementation&lt;br /&gt;
of the checks is often significantly simpler for a subset called the ''simple subset'' of PSL. Informally, in this&lt;br /&gt;
subset, composition of temporal properties is restricted to ensure that time ''moves forward'' from left to right&lt;br /&gt;
through a property, as it does in a timing diagram. (See 4.4.4 for the formal definition of the simple subset.)&lt;br /&gt;
&lt;br /&gt;
For example, the property&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Хотя в принципе, все свойства PSL могут быть проверены при окончание моделирования, исполнение проверок, часто, значительно проще для подмножеств, называемых ''простые подмножества'' PSL. Неформально, в этих подмножествах, состав временных свойств ограничен для обеспечения того, что бы время ''двигалось вперед'' слева направо через свойство, как это делается на временной диаграмме. (Смотрите 4.4.4 для формального понимания простых подмножеств.)&lt;br /&gt;
&lt;br /&gt;
Например, свойство &lt;br /&gt;
&lt;br /&gt;
 Свойство 2: always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
which states that, if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted three cycles later, belongs to the simple subset, because&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; appears to the left of b in the property and also appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the timing diagram of any&lt;br /&gt;
behavior that is not a violation of the property. Figure 2 shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
которое означает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значения, то &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет значение через три цикла, принадлежит простому подмножеству, потому что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве и, также, появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на временной диаграмме любой поведенческой модели, что не нарушает свойство. Рисунок 2 показывает пример такой временной диаграммы.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig02.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 2—Вариант удовлетворяющий свойство 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
An example of a property that is not in this subset is the property&lt;br /&gt;
&lt;br /&gt;
 Property 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
which states that, if a is asserted and b is asserted three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is asserted (in the same cycle as&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;). This property does not belong to the simple subset, because although &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; appears to the right of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in&lt;br /&gt;
the property, it appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; timing diagram that is not a violation of the property. Figure 3&lt;br /&gt;
shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пример свойства не принадлежащего этому подмножеству&lt;br /&gt;
&lt;br /&gt;
 Свойство 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
которое значит, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значение и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение через три цикла, то &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; принимает значение в том же цикле, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Это свойство не принадлежит простому подмножеству, потому что хотя &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; появляется справа от &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве, он появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на временной диаграмме, и это не нарушает свойство. Рисунок 3 показывает пример такой временной диаграммы.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig03.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 3 3—Вариант, удовлетворяющий свойство 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.2 Формальная верификация=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is an extension of the standard temporal logics Linear-Time Temporal Logic (LTL) and Computation&lt;br /&gt;
Tree Logic (CTL). A specification in the PSL Foundation Language (respectively, the PSL Optional Branching Extension) can be ''compiled down'' to a formula of pure LTL (respectively, CTL), possibly with some&lt;br /&gt;
auxiliary HDL code, known as a ''satellite''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL это расширение стандарта временной логики Линейной временной логике (LTL) и Вычисляемого логического дерева (CTL). Спецификация  в PSL фундаментального языка (соответственно, PSL дополнительного ветвления) может быть ''скомпилирована'' в виде чистого LTL (соответственно, CTL), возможно с некоторым вспомогательным HDL- кодом, известным, как ''спутник''.&lt;br /&gt;
&lt;br /&gt;
== 3. Определения, сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;--&lt;br /&gt;
For the purposes of this document, the following terms and definitions apply. The IEEE Standards Diction-&lt;br /&gt;
ary: Glossary of Terms &amp;amp; Definitions should be referenced for terms not defined in this clause.6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цели этого документа - текущие термины и определения. IEEE словарь стандартов: Cловарь терминов и определений должен ссылаться на условия неопределенные в этом пункте.6 &lt;br /&gt;
&lt;br /&gt;
===3.1 Определения (Definitions) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the terms used in this standard.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет термины, используемые в этом стандарте. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- '''assertion''': A statement that a given property is required to hold and a directive to functional verification&lt;br /&gt;
tools to verify that it does hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''утверждение (assertion)''': значит, что данное свойство требуется выполнить и указать программе функциональной верификации, чтобы убедиться, что оно выполняется. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''assumption''': A statement that the design is constrained by the given property and a directive to functional&lt;br /&gt;
verification tools to consider only paths on which the given property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''допущение (assumption)''': значит, что проект ограничен данным свойством и программе функциональной верификации указывается учитывать только тот путь, на котором данное свойство выполняется.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''asynchronous property''': A property whose clock context is equivalent to True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''асинхронное свойство (asynchronous property)''': Свойство, временной контекст которого эквивалентен значению Правда.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
'''behavior''': A path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение (behavior)''': Путь.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Boolean (expression)''': An expression that yields a logical value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''Булевы (выражения) (Boolean (expression))''': Выражения, которые принимают на выходе логические значения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''checker''': An auxiliary process (usually constructed as a finite state machine) that monitors simulation of a&lt;br /&gt;
design and reports errors when asserted properties do not hold. A checker may be represented in the same&lt;br /&gt;
HDL code as the design or in some other form that can be linked with a simulation of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка (checker)''': Вспомогательный процесс (обычно применяемый, как конечный автомат), который проверяет моделирование проекта и сообщения об ошибках, когда утвержденное свойство не выполняется. Проверка может быть представлена в том же HDL-коде, что и проект или в какой-либо другой форме, которая может ссылаться на моделирование проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''completes''': A term used to identify the last cycle of a path that satisfies a sequential expression or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''завершение (completes)''': Термин используемый для определения последнего цикла пути, который удовлетворяет последовательности выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''computation path''': A succession of states of the design, such that the design can actually transition from&lt;br /&gt;
each state on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''вычисленный путь (computation path)''': Правопреемство состояний проекта, такое что проект может актуально переходить из каждого состояния на пути к его преемнику. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''constraint''': A condition (usually on the input signals) that limits the set of behaviors to be considered. A&lt;br /&gt;
constraint may represent real requirements (e.g., clocking requirements) on the environment in which the&lt;br /&gt;
design is used, or it may represent artificial limitations (e.g., mode settings) imposed in order to partition the&lt;br /&gt;
functional verification task.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (constraint)''': Состояние ( обычно для входного сигнала), которое ограничивает набор поведений, которые следует рассматривать. Ограничение может представлять реальные требования (т.е. временные требования) в среде, в которой используется проект, или может представлять искусственные ограничения (т.е. настройки режима) наложенные в порядке разделения задания функциональной верификации.       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''count''': A number or range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''счетчик (count)''': Число или диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''coverage''': A measure of the occurrence of certain behavior during (typically dynamic) functional&lt;br /&gt;
verification and, therefore, a measure of the completeness of the (dynamic) functional verification process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''зона покрытия (coverage)''': Мера возникновения определенного поведения в течение (обычно динамическое) функциональной верификации и поэтому расчет сложности (динамического) процесса функциональной верификации.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''cycle''': An evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''цикл (cycle)''': Оценочный цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''describes''': A term used to identify the set of behaviors for which Boolean expression, sequential expression,&lt;br /&gt;
or property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''описания (describes)''': Термин, используемый для определения набора поведений, для которого Булевы выражения, последовательные выражения или выполняемые свойства.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design''': A model of a piece of hardware, described in some hardware description language (HDL). A design&lt;br /&gt;
typically involves a collection of inputs, outputs, state elements, and combinational functions that compute&lt;br /&gt;
next state and outputs from current state and inputs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проект (design)''': Модель кусочка аппаратуры, описанная на некотором языке описания аппаратуры (HDL). Проект типично включает в себя набор входов, выходов, элементов состояния и комбинационных функций, которые рассчитывают следующие состояние и выходы из текущего состояния и входов.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design behavior''': A computation path for a given design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение проекта (design behavior)''': Рассчитанный путь для данного проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''dynamic verification''': A verification process such as simulation, in which a property is checked over indi-&lt;br /&gt;
vidual, finite design behaviors that are typically obtained by dynamically exercising the design through a&lt;br /&gt;
finite number of evaluation cycles. Generally, dynamic verification supports no inference about whether the&lt;br /&gt;
property holds for a behavior over which the property has not yet been checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''динамическая верификация (dynamic verification)''': Процесс верификации, такой как моделирование, в котором свойство проверяется &lt;br /&gt;
отдельно, конечные поведения проекта, которые обычно получаются динамическим проведением проекта через конечное число оценочных циклов. В общем, динамическая верификация не дает вывода о выполняющемся свойстве поведения, через которое свойство еще не было проверено.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
'''evaluation''': The process of exercising a design by iteratively applying values to its inputs, computing its&lt;br /&gt;
next state and output values, advancing time, and assigning to the state variables and outputs their next&lt;br /&gt;
values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценка (evaluation)''': Процесс проведения проекта итеративным принятием значений на его входы, рассчитывая его следующие состояния и выходные значения, время опережения, и назначение переменных состояний и выходов своих следующих значений.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''evaluation cycle''': One iteration of the evaluation process. At an evaluation cycle, the state of the design is&lt;br /&gt;
recomputed (and may change).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценочный цикл (evaluation cycle)''': Одна итерация оценочного процесса. На одном оценочном цикле, состояние проекта пересчитывается ( и может быть изменено). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''extension (of a given path)''': A path that starts with precisely the succession of states in the given path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''расширения (данного пути) (extension (of a given path))''': Путь, который начинается  с точного правопреемства состояний в данном пути.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* '''False''': An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog flavors, the single bit values 1’b0, 1 ’bx, and 1’bz are interpreted as the logical value False. In the VHDL flavor, the values STD.Standard.Boolean’(False) and STD.Standard.Bit’(‘0’), as well as the values IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’( ‘X’), and IEEE.std_logic_1164.std_logic’(‘Z’) are all interpreted as the logical value False. In the SystemC flavor, the value 'false' of type bool and any integer literal with a numeric value of 0 are interpreted as the logical value False. In the GDL flavor, the Boolean value 'false' and bit value 0B are both interpreted as the logical value False.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''False''' — Интерпритация определённых значений определённых типов в HDL языках. В SystemVerilog и Verilog стилях, битовые значения 1’b0, 1 ’bx, и 1’bz интерпретируются как логическое значение False. В VHDL стиле, значения STD.Standard.Boolean’(False) и STD.Standard.Bit’(‘0’), также как значения IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’(‘X’), и IEEE.std_logic_1164.std_logic’(‘Z’) все интерпретируются как логическое значение False. В SystemC стиле, значение 'false' типа bool и любой литерал типа integer с числовым значением 0 интерпретируется как значение False. В GDL стиле, значение типа Boolean 'false' и значение типа bit 0B оба интерпретируются как логическое значение False.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''finite range''': A range with a finite high bound.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''конечный диапазон (finite range)''': Диапазон с большой конечной границей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''formal verification''': A functional verification process in which analysis of a design and a property yields a&lt;br /&gt;
logical inference about whether the property holds for all behaviors of the design. If a property is declared&lt;br /&gt;
true by a formal verification tool, no simulation can show it to be false. If the property does not hold for all&lt;br /&gt;
behaviors, then the formal verification process should provide a specific counterexample to the property, if&lt;br /&gt;
possible.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''формальная верификация (formal verification)''': Процесс функциональной верификации, в котором анализ дизайна и выхода свойства логически разъясняет о выполняемое свойство для все поведений проекта. Если свойство продекларировано значение &amp;quot;правда&amp;quot; программой формальной верификации, моделирование не может сделать его значение &amp;quot;ложным&amp;quot;. Если свойство не выполняется для каждого поведения, то процесс формальной верификации должен предоставить специфический контрпример свойства, если это возможно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''functional verification''': The process of confirming that, for a given design and a given set of constraints, a&lt;br /&gt;
property that is required to hold in that design actually does hold under those constraints.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''функциональная верификация (functional verification)''': Процесс подтверждения того, что для данного проекта и данного набора ограничений, свойство, которое требует выполнение в этом проекте, действительно выполняется в соответствие с данными ограничениями.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds''': A term used to talk about the meaning of a Boolean expression, sequential expression, or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''исполнение (holds)''': Термин используемый для разъяснения значения Булевых выражений, последовательных выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds tightly''': A term used to talk about the meaning of a sequential expression. Sequential expressions are&lt;br /&gt;
evaluated over finite paths (behavior).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''обязательное исполнение(holds tightly)''': Термин используемый для разъяснения значения последовательных выражений. Последовательные выражения оцениваются на конечной стадии (поведение). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''liveness property''': A property that specifies an eventuality that is unbounded in time. Loosely speaking, a&lt;br /&gt;
liveness property claims that “something good” eventually happens. More formally, a liveness property is a&lt;br /&gt;
property for which any finite path can be extended to a path satisfying the property. For example, the prop-&lt;br /&gt;
erty “whenever signal req is asserted, signal ack is asserted some time in the future” is a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''живучие свойства (liveness property)''': Свойства, которые указывают на случайность, которая не ограничена во времени. Грубо говоря, живучие свойства утверждает, что что-то “хорошее” в конечном счете произошло. Более формально, живучие свойство - это свойство, для которого любая конечная стадия может быть продолжена до стадии удовлетворения свойства. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через некоторое время” это живучие свойство. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logic type''': An HDL data type that includes values that are interpreted as logical values. A logic type may&lt;br /&gt;
also include values that are not interpreted as logical values. Such a logic type usually represents a multi-val-&lt;br /&gt;
ued logic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логический тип (logic type)''': Тип данных HDL, который включает значения, которые интерпретируются, как логические значения. Логический тип, также, включает значения, которые не интерпретируются, как логические значения. Как логический тип, обычно, представляет многозначную логику.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logical value''': A value in the set {True, False}.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логическое значение (logical value)''': Значение из набора {True, False}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''model checking''': A type of formal verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка на модели (model checking)''': Тип формальной верификации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''number''': A non-negative integer value, and a statically computable expression yielding such a value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''число (number)''': Неотрицательное целочисленное значение, и статично подсчитанное выражение полученное, как выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurs''': A term used to indicate that a Boolean expression holds in a given cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
''' (occurs)''': Термин используемый для индикации того, что Булево выражение выполняется в данном цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurrence (of a Boolean expression)''': A cycle in which the Boolean expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''occurrence (of a Boolean expression)''': Цикл, в котором выполняется Булево выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''path''': A succession of states of the design, whether or not the design can actually transition from one state&lt;br /&gt;
on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''стадия (путь) (path)''': Правопреемственность состояний проекта, ??? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive count''': A positive number or a positive range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный счетчик (positive count)''': Положительное число или положительный диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive number''': A number that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительное число (positive number)''': Число, которое больше нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive range''': A range with a low bound that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный диапазон (positive range)''': Диапазон с нижней границей большей нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''prefix (of a given path)''': A path of which the given path is an extension.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''префикс (данной стадии) (prefix (of a given path))''': Стадия в которую расширяется данная стадия.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''property''': A collection of logical and temporal relationships between and among subordinate Boolean&lt;br /&gt;
expressions, sequential expressions, and other properties that in aggregate represent a set of behaviors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство (property)''': Набор логических и временных взаимоотношений между и среди подчиненных Булевых выражений, последовательных выражений и других свойств, которые в совокупности представляют набор поведений.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''range''': A series of consecutive numbers, from a low bound to a high bound, inclusive, such that the low&lt;br /&gt;
bound is less than or equal to the high bound. In particular, this includes the case in which the low bound is&lt;br /&gt;
equal to the high bound. Also, a pair of statically computable integer expressions specifying such a series of&lt;br /&gt;
consecutive numbers, where the left expression specifies the low bound of the series, and the right expression specifies the high bound of the series. A range may describe a set of values or a variable number of&lt;br /&gt;
cycles or event repetitions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''диапазон (range)''': Набор последовательных чисел, от нижней до верней границы, включительно, такой, что нижняя граница меньше или равна верхней. В частности, это предполагает случай, в котором нижняя граница эквивалентна верхней. Также, пара статически подсчитанных целочисленных выражений представляются, как наборы последовательных чисел, где левая выражения является нижней границей, а правое выражение верхней границей набора. Диапазон может описывать набор значении и переменное число циклов или повторяющихся событий.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''restriction''': A statement that the design is constrained by the given sequential expression and a directive to&lt;br /&gt;
functional verification tools to consider only paths on which the given sequential expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (restriction)''': Утверждение, что проект ограничивается данным последовательным выражением, и директива программе функциональной верификации рассматривать только стадию, на которой выполняется данное последовательное выражение.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''safety property''': A property that specifies an invariant over the states in a design. The invariant is not necessarily limited to a single cycle, but it is bounded in time. Loosely speaking, a safety property claims that&lt;br /&gt;
“something bad” does not happen. More formally, a safety property is a property for which any path&lt;br /&gt;
violating the property has a finite prefix such that every extension of the prefix violates the property. For&lt;br /&gt;
example, the property, “whenever signal req is asserted, signal ack is asserted within 3 cycles” is a safety&lt;br /&gt;
property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''защищенное свойство (safety property)''': Свойство, которое указывает инвариантность по состояниям в проекте. Инвариантность - это необязательно ограниченность в один цикл, но ограниченность по времени. Грубо говоря, защищенное свойство показывает, что ничего “плохого” не произошло. Более формально, защищенное свойство - это свойство, для которого любая стадия имеющая навязывающееся свойство получает конечный префикс, такой ,что каждое расширение префикса навязывается свойству. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через три цикла”, является защищенным свойством.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequence''': A sequential expression that may be used directly within a property or directive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательность (sequence)''': Последовательное выражение, которое может напрямую использоваться в течение свойства или директивы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequential expression''': A finite series of terms that represent a set of behaviors.&lt;br /&gt;
sequential extended regular expression: A form of sequential expression, and a component of a sequence.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательное выражение (sequential expression)''': Законченный набор терминов, который представляет набор поведений.&lt;br /&gt;
&lt;br /&gt;
'''последовательные регулярно расширяемые выражения (sequential extended regular expression)''': Форма последовательных выражений и компонентов последовательностей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''starts''': A term used to identify the first cycle of a path that satisfies a sequential expression.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''начало (starts)''': Термин используемый для идентификации первого цикла пути, который удовлетворяет последовательное выражение. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strictly before''': Before, and not in the same cycle as.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''строго перед (strictly before)''': Перед, и не в этом же цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strong operator''': A temporal operator, the non-negated use of which usually creates a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''сильный оператор (strong operator)''': Временной оператор, неотрицательное использование которого, обычно, создает живучие свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal expression''': An expression that involves one or more temporal operators.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временное выражение (temporal expression)''': Выражение, которое включает один или более временных операторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal operator''': An operator that represents a temporal (i.e., time-oriented) relationship between its&lt;br /&gt;
operands.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временной оператор (temporal operator)''' Оператор, который представляет временные ( т.е. ориентированные во времени) взаимоотношения между операндами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating condition''': A Boolean expression, the occurrence of which causes a property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''условие завершения (terminating condition)''': Булево выражение, появление которого, приводит к завершению свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating property''': A property that, when it holds, causes another property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство завершения (terminating property)''': Свойство, выполнение которого, приводит к завершению другого свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
True: An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog&lt;br /&gt;
flavors, the single bit value 1'b1 is interpreted as the logical value True. In the VHDL flavor, the values&lt;br /&gt;
STD.Standard.Boolean'(True), STD.Standard.Bit'('1'),&lt;br /&gt;
IEEE.std_logic_1164.std_logic'('1'), and IEEE.std_logic_1164.std_logic'('H')&lt;br /&gt;
interpreted as the logical value True. In the SystemC flavor, the value 'true' of type bool and any integer&lt;br /&gt;
literal with a non-zero numeric value are interpreted as the logical value True. In the GDL flavor, the Boolean value 'true' and bit value 1B are both interpreted as the logical value True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* '''True''': Интерпритация определённых значений определённых типов в HDL языках. &lt;br /&gt;
** В SystemVerilog и Verilog стилях, битовые значение  1'b1 интерпретируется как логическое значение True. &lt;br /&gt;
** В VHDL стиле, значения STD.Standard.Boolean'(True), STD.Standard.Bit'('1'), IEEE.std_logic_1164.std_logic'('1'), и IEEE.std_logic_1164.std_logic'('H') интерпретируются как логическое значение True.&lt;br /&gt;
** В SystemC стиле, значение 'true' типа bool и любой литерал типа integer  с ненулевым числовым значением интерпретируется как логическое значение True.&lt;br /&gt;
** В GDL стиле, значение типа Boolean 'true' и значение типа bit 1B интерпретируются как логическое значение True.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''unknown value''': A value of a (multi-valued) logic type, other than 0 or 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''неизвестное значение (unknown value)''': Значение (многозначного) логического типа, отличное от 0 и 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''weak operator''': A temporal operator, the non-negated use of which does not create a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''слабый оператор (weak operator)''': Временной оператор, неотрицательное использование которого не создает живучего свойства.&lt;br /&gt;
&lt;br /&gt;
== 3.2 Сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
* ABV — утверждения, базирующиеся на верификации&lt;br /&gt;
* BNF — расширенная форма Бакуса-Наура&lt;br /&gt;
* cpp — C препроцессор&lt;br /&gt;
* CTL — вычисляемое логическое дерево&lt;br /&gt;
* EDA — авторматизация проектирования&lt;br /&gt;
* FL — фундаметальный язык&lt;br /&gt;
* FSM — конечный автомат&lt;br /&gt;
* GDL — общий язык описания&lt;br /&gt;
* HDL — язык описания аппаратуры&lt;br /&gt;
* iff — если, и только если&lt;br /&gt;
* LTL — линейная временная логика&lt;br /&gt;
* PSL — язык спецификации свойств&lt;br /&gt;
* OBE — дополнительное расширение ветвления&lt;br /&gt;
* RTL — уровень регистровых передач&lt;br /&gt;
* SERE — последовательное расширенное регулярное выражение&lt;br /&gt;
* VHDL — VHSIC язык описания аппаратуры&lt;br /&gt;
* VHSIC — высоко скоростная интегральная схема&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 4.1.1 Слои (Layers) ====&lt;br /&gt;
PSL состоит из четырёх слоёв: булевый (Boolean), временной (temporal), верификационный (verification), и модельный (modeling).&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.1 Булевый слой (Boolean layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The Boolean layer is used to build expressions that are, in turn, used by the other layers. Although it contains&lt;br /&gt;
expressions of many types, it is known as the Boolean layer because it is the supplier of Boolean&lt;br /&gt;
expressions to the heart of the language—the temporal layer. Boolean layer expressions are evaluated in a&lt;br /&gt;
single evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Булевый слой используется для создания выражений, которые, в свою очередь, используются другими слоями. Хотя этот слой содержит выражения над многими типами, он называется как булевый слой, потому что он является поставщиком булевых (логических) выражений для основы (сердца)  языка — временнОго слоя. Выражения булевого слоя выполняются в едином (одиночном) цикле выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.2 ВременнОй слой (Temporal layer) =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
The temporal layer is the heart of the language; it is used to describe properties of the design. It is known as&lt;br /&gt;
the temporal layer because, in addition to simple properties, such as “signals a and b are mutually&lt;br /&gt;
exclusive,” it can also describe properties involving complex temporal relations between signals, such as, “if&lt;br /&gt;
signal c is asserted, then signal d shall be asserted before signal e is asserted, but no more than eight clock&lt;br /&gt;
cycles later.” Temporal expressions are evaluated over a series of evaluation cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой является основой языка; он используется для описания свойств проекта. Он называется временным, потому что, в дополнение к простым свойствам, таким как &amp;quot;сигналы a и b являются взаимноисключающими&amp;quot;, он может также описывать свойства включающие сложные временные отношения между сигналами, например &amp;quot;если сигнал c устанавливается, тогда сигнал d должен установиться прежде, чем сигнал e установится, но не позже более восьми периодов синхросигнала&amp;quot;. ВременнЫе выражения выполняются в течении серии циклов выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.3 Верификационный слой (Verification layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The verification layer is used to tell the verification tools what to do with the properties described by the&lt;br /&gt;
temporal layer. For example, the verification layer contains directives that tell a tool to verify that a property&lt;br /&gt;
holds or to check that a specified sequence is covered by some test case.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верификационный слой используется для того чтобы сказать верификационному инструменту (САПР), что делать с свойствами описанными во временном слое. Например, верификационный слой включает директивы, которые говорят инструменту (САПР) чтобы верифицировал (verify) то, что свойство удерживает (hold) или  проверил (check) то, что заданная последовательность покрыта некоторым тестирующим случаем.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.4 Моделирующий слой (Modeling layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The modeling layer is used to model the behavior of design inputs (for tools, such as formal verification&lt;br /&gt;
tools, which do not use test cases) and to model auxiliary hardware that is not part of the design, but is&lt;br /&gt;
needed for verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Моделирующий слой (Modeling layer) используется для моделирования поведения входов проекта (для инструментов (САПР), таких как инструменты (САПР) для формальной верификации, которые не используют тестов) и для моделирования дополнительной аппаратуры, которая не является частью проекта, но необходима для верификации.&lt;br /&gt;
&lt;br /&gt;
==== 4.1.2 Стили/Варианты (Flavors) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL comes in five flavors: one for each of the hardware description languages SystemVerilog, Verilog,&lt;br /&gt;
VHDL, SystemC, and GDL. The syntax of each flavor conforms to the syntax of the corresponding HDL in&lt;br /&gt;
a number of specific areas—a given flavor of PSL is compatible with the corresponding HDL’s syntax in&lt;br /&gt;
those areas.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идёт с пятью вариантами/стилями (flavors): один для каждого HDL языка SystemVerilog, Verilog, VHDL, SystemC, и GDL. Синтаксис каждого варианта (стиля) соответствует синтаксису соответствующего HDL языка в ряде конкретных областей — данный стиль PSL совместим с соответствующим синтаксисом HDL-языка в этой области.&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Влияние стиля на слои PSL&lt;br /&gt;
!rowspan=2| Слой ||colspan=5 | HDL&lt;br /&gt;
|-&lt;br /&gt;
!  SystemVerilog || Verolog || VHDL || SystemC || GDL&lt;br /&gt;
|-&lt;br /&gt;
| Булевый || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Модельный  || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Временной || i:j || i:j || i to j || i:j ||  i..j&lt;br /&gt;
|-&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Лексическая структура ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the identifiers, keywords, operators, macros, and comments used in PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет идентификаторы, ключевые слова, операторы, макросы и комментарии, используемые в PSL.&lt;br /&gt;
 &lt;br /&gt;
==== 4.2.1 Идентификаторы (Identifiers) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Identifiers in PSL consist of an alphabetic character, followed by zero or more alphanumeric characters;&lt;br /&gt;
each subsequent alphanumeric character may optionally be preceded by a single underscore character.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Идентификаторы в PSL состоят из символа латинского алфавита, за которым следует ноль или более символов латинского алфавита; каждый последующий символ алфавита может по желанию предшествовать одному символу подчеркивания. Например:&lt;br /&gt;
&lt;br /&gt;
 mutex&lt;br /&gt;
 Read_Transaction&lt;br /&gt;
 L_123&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL identifiers are case-sensitive in the SystemVerilog, Verilog, and SystemC flavors and case-insensitive in&lt;br /&gt;
the VHDL and GDL flavors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идентификаторы являются чувстительными к регистру в SystemVerilog, Verilog, и SystemC вариантах/стилях и не чувствительными к регистру в VHDL и GDL вариантах.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.2 Ключевые слова ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;poem&amp;gt; A&lt;br /&gt;
 E&lt;br /&gt;
 next!&lt;br /&gt;
 rose&lt;br /&gt;
AF&lt;br /&gt;
 EF&lt;br /&gt;
 next_a&lt;br /&gt;
AG&lt;br /&gt;
 EG&lt;br /&gt;
 next_a!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; sequence&lt;br /&gt;
AX&lt;br /&gt;
abort&lt;br /&gt;
 EX&lt;br /&gt;
 next_e&lt;br /&gt;
 stable&lt;br /&gt;
always&lt;br /&gt;
 ended&lt;br /&gt;
 next_e!&lt;br /&gt;
string&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;anda&lt;br /&gt;
 eventually!&lt;br /&gt;
 next_event&lt;br /&gt;
 strong&lt;br /&gt;
assert&lt;br /&gt;
 next_event!&lt;br /&gt;
 sync_abort&lt;br /&gt;
assume&lt;br /&gt;
 F&lt;br /&gt;
 next_event_a&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;async_abort&lt;br /&gt;
fairness&lt;br /&gt;
 next_event_a!&lt;br /&gt;
 toe&lt;br /&gt;
before&lt;br /&gt;
 fell&lt;br /&gt;
 next_event_e&lt;br /&gt;
before!&lt;br /&gt;
 for&lt;br /&gt;
 next_event_e!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; U&lt;br /&gt;
before!_&lt;br /&gt;
 forall&lt;br /&gt;
 nondet&lt;br /&gt;
 union&lt;br /&gt;
before_&lt;br /&gt;
 nondet_vector&lt;br /&gt;
 until&lt;br /&gt;
bitvector&lt;br /&gt;
 bit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; G&lt;br /&gt;
 notc&lt;br /&gt;
 until!&lt;br /&gt;
boolean&lt;br /&gt;
 numeric&lt;br /&gt;
 until!_&lt;br /&gt;
hdltype&lt;br /&gt;
until_&lt;br /&gt;
clock&lt;br /&gt;
 onehot&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;const&lt;br /&gt;
 in&lt;br /&gt;
 onehot0&lt;br /&gt;
 vmode&lt;br /&gt;
countones&lt;br /&gt;
 inf&lt;br /&gt;
 ord&lt;br /&gt;
 vpkg&lt;br /&gt;
cover&lt;br /&gt;
 inherit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; vprop&lt;br /&gt;
isb&lt;br /&gt;
 property&lt;br /&gt;
 vunit&lt;br /&gt;
default&lt;br /&gt;
 isunknown&lt;br /&gt;
 prev&lt;br /&gt;
W&lt;br /&gt;
report&lt;br /&gt;
mutable&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; within&lt;br /&gt;
restrict&lt;br /&gt;
restrict!&lt;br /&gt;
never&lt;br /&gt;
 X&lt;br /&gt;
next&lt;br /&gt;
 X!&amp;lt;/poem&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*a and is a keyword only in the VHDL flavor; see the flavor macro AND_OP (4.3.2.6).&lt;br /&gt;
*b is is a keyword only in the VHDL flavor; see the flavor macro DEF_SYM (4.3.2.9).&lt;br /&gt;
*c not is a keyword only in the VHDL flavor; see the flavor macro NOT_OP (4.3.2.6).&lt;br /&gt;
*d or is a keyword only in the VHDL flavor; see the flavor macro OR_OP (4.3.2.6).&lt;br /&gt;
*e to is a keyword only in the VHDL flavor; see the flavor macro RANGE_SYM (4.3.2.7).&lt;br /&gt;
&lt;br /&gt;
==== 4.2.3 Операторы ====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.1 Операторы HDL языка =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
For a given flavor of PSL, the operators of the underlying HDL have the highest precedence. In particular,&lt;br /&gt;
this includes logical, relational, and arithmetic operators of the HDL. The HDL’s logical operators for&lt;br /&gt;
negation, conjunction, and disjunction of Boolean values may be used in PSL for negation, conjunction, and&lt;br /&gt;
disjunction of properties as well. In such applications, those operators have their usual precedence and&lt;br /&gt;
associativity, as if the PSL properties that are operands produced Boolean values of a type appropriate to the&lt;br /&gt;
logical operators native to the HDL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для заданного стиля PSL, операторы основного HDL языка имеют наивысший преоритет. В частности это включает логические, арифметические операторы и операторы отношения языка HDL. Логические операции HDL языка для отрицания,  конъюнкции и дизъюнкции булевых (логических) значений могут использоваться в PSL для отрицания, конъюнкции и дизъюнкции свойств. В таких приложениях, эти операторы имеют их обычный приоритет и ассоциативность, как если бы PSL свойства,....&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.2 Операторы фундаментального языка =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Various operators are available in PSL. Each operator has a precedence relative to other operators. In&lt;br /&gt;
general, operators with a higher relative precedence are associated with their operands before operators with&lt;br /&gt;
a lower relative precedence. If two operators with the same precedence appear in sequence, then the&lt;br /&gt;
operators are associated with their operands according to the associativity of the operators. Left-associative&lt;br /&gt;
operators are associated with operands in left-to-right order of appearance in the text; right-associative&lt;br /&gt;
operators are associated with operands in right-to-left order of appearance in the text.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Различные операторы доступны в PSL. Каждый оператор имеет приоритет по отношению к другим операторам. В общем операторы с большим приоритетом получают доступ к свои операндам, раньше, чем операнды с меньшим приоритетом. Если два оператора имеют одинаковый приоритет и появляются в последовательности, то они получают доступ к свои операндам в соответствие с ассоциативностью операторов. Лева-ассоциативные оператор получает доступ к своим операндам слева на право в порядке появления в тексте, право-ассоциативные операторы получают доступ к своим операндам справа на лева в порядке появления в тексте.   &lt;br /&gt;
 &lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица приоритетов и ассоциативности двух операторов фундаментального языка  &lt;br /&gt;
|-&lt;br /&gt;
! Оператор класс || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| ''(наивысший приоритет)''&lt;br /&gt;
&lt;br /&gt;
HDL операторы&lt;br /&gt;
| ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор объединения || left || union ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор времени || left || @ ||&lt;br /&gt;
|-&lt;br /&gt;
| SERE повторяющийся оператор || left || [* ] [+] [= ] [-&amp;gt; ] ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный предельный оператор || left || within ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор И || left || &amp;amp; || &amp;amp;&amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор ИЛИ || left || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор слияния || left || : ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор конкатенации || left || ; ||&lt;br /&gt;
|-&lt;br /&gt;
|  Операторы прерывания фундаментального языка || left || abort &amp;lt;br/&amp;gt; sync_abort || async_abort&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, указывающие местонахождение || right || next* || eventually!&lt;br /&gt;
|-&lt;br /&gt;
| || || X   X! || F&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, показывающие границы ||  right ||  U ||  W&lt;br /&gt;
|-&lt;br /&gt;
| || || until* || before*&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор импликации ||  right || &amp;lt;nowiki&amp;gt;|-&amp;gt;&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|=&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булевы операторы импликации || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Неизменные операторы фундаментального языка &amp;lt;br/&amp;gt; ''(низший приоритет)'' || right || always &amp;lt;br/&amp;gt; G || never&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 NOTE—The notation next* represents the next family of operators, which includes the operators next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a!, and&lt;br /&gt;
 next_event_e!. The notation until* represents the until family of operators, which includes the operators until,&lt;br /&gt;
 until!, until_, and until!_. The notation before* represents the before family of operators, which includes&lt;br /&gt;
 the operators before, before!, before_, and before!_.7&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 Примечание - Обозначение next* представляет семейство next-операторов, которое включает операторы: next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a! и&lt;br /&gt;
 next_event_e!. Обозначение until* представляет семейство until-операторов, которое включает операторы: until,&lt;br /&gt;
 until!, until_ и until!_. Обозначение before* представляет семейство before-операторов, которое включает операторы: before, before!, before_, and before!_.7&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.1 Объединительные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence after the HDL operators is that used to indicate a non-deterministic expression:&lt;br /&gt;
&lt;br /&gt;
 union   union operator&lt;br /&gt;
&lt;br /&gt;
The union operator is left-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL оператор со следующим наибольшим приоритетом после HDL операторов является тот, который используется для обозначения недетерминированного выражения:&lt;br /&gt;
&lt;br /&gt;
 union   union оператор&lt;br /&gt;
&lt;br /&gt;
Оператор union является лева-ассоциативным.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.2 Операторы времени ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the clocking operator, which is&lt;br /&gt;
used to associate a clock expression with a property or sequence:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это оператор времени, который используется для связи временного выражения со свойством или последовательностью:&lt;br /&gt;
&lt;br /&gt;
 @   clock event&lt;br /&gt;
&lt;br /&gt;
Временной оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.3 SERE операторы повторов (repetition operators) ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For any flavor of PSL, the FL operators with the next highest precedence are the repetition operators, which&lt;br /&gt;
are used to construct Sequential Extended Regular Expressions (SEREs). These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL операторы со следующим наибольшим приоритетом являются операторами повторов, которые используются для создания последовательных расширенных регулярных выражений (Sequential Extended Regular Expressions — SEREs). Эти операторы следующие:&lt;br /&gt;
&lt;br /&gt;
 [* ]   последовательное повторение (consecutive repetition)&lt;br /&gt;
 [+]    последовательное повторение (consecutive repetition)&lt;br /&gt;
 [= ]   не последовательное повторение (non-consecutive repetition)&lt;br /&gt;
 [-&amp;gt; ]  goto repetition&lt;br /&gt;
&lt;br /&gt;
SERE операторы повторения являются лева-ассоциативными.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.4 Последовательный предельный оператор ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence within operator,&lt;br /&gt;
which is used to describe behavior in which one sequence occurs during the course of another, or within a&lt;br /&gt;
time-bounded interval:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный предельный оператор, который используется для описания поведения, в котором одна последовательность появляется в ходе другой, или в пределах интервала ограниченного временем.&lt;br /&gt;
&lt;br /&gt;
 within    последовательность within оператор&lt;br /&gt;
&lt;br /&gt;
Последовательный предельный оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.5 Последовательные операторы конъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the sequence conjunction&lt;br /&gt;
operators, which are used to describe behavior consisting of parallel paths. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетов - это последовательные операторы конъюнкции, которые описывают поведение состоящие из параллельных стадий. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;    последовательная конъюнкция без сопоставления длинны&lt;br /&gt;
 &amp;amp;&amp;amp;   последовательная конъюнкция с сопоставлением длины&lt;br /&gt;
&lt;br /&gt;
Последовательные операторы конъюнкции лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.6 Последовательный оператор дизъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence disjunction operator,&lt;br /&gt;
which is used to describe behavior consisting of alternative paths:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор дизъюнкции, который используются для описания поведения состоящего из альтернативных стадий:&lt;br /&gt;
&lt;br /&gt;
 |    последовательная дизъюнкция&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор дизъюнкции лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.7 Последовательный оператор слияния ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence fusion operator,&lt;br /&gt;
which is used to describe behavior in which a later sequence starts in the same cycle in which an earlier&lt;br /&gt;
sequence completes:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор слияния, который используется для описания поведения, в котором более поздняя последовательность начинает выполняться в том же цикле, в котором заканчивает выполняться более ранняя.&lt;br /&gt;
&lt;br /&gt;
 :    последовательное слияние&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор слияния лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.8 Последовательный оператор конкатенации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence concatenation&lt;br /&gt;
operator, which is used to describe behavior in which one sequence is followed by another:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального со следующим наивысшим приоритетом - это последовательный оператор конкатенации, который используется, чтобы описывать поведение, в котором одна последовательность следует за другой:&lt;br /&gt;
&lt;br /&gt;
 ;    последовательная конкатенация&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор конкатенации лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.9 Операторы прерывания фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the FL termination operators,&lt;br /&gt;
which are used to describe behavior in which a condition causes both current and future obligations to be&lt;br /&gt;
canceled:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом - это операторы прерывания фундаментального языка, которые используются для описания поведения, в котором условие вызывает текущие и будущие процессы, которые будут прерваны:&lt;br /&gt;
&lt;br /&gt;
 sync_abort    немедленное завершение текущего и следующего процесса, синхронизовано по времени&lt;br /&gt;
 async_abort   немедленное прерывание текущего и следующего процесса, независт от времени&lt;br /&gt;
 abort         эквивалентно to async_abort&lt;br /&gt;
&lt;br /&gt;
Операторы прерывания фундаментального языка лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.10 Операторы местонахождения фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which an operand holds in the future. These operators are as follows:&lt;br /&gt;
eventually! the right operand holds at some time in the indefinite future&lt;br /&gt;
 next*     the right operand holds at some specified future time or range of future times&lt;br /&gt;
FL occurrence operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором операнды используются в будущем. Это следующие операторы: &lt;br /&gt;
eventually! правый операнд выполняется через некоторое время в неопределенном будущем&lt;br /&gt;
 next*     правый операнд выполняется в некотором специфицированном будущем времени или диапазоне будущего времени&lt;br /&gt;
операторы местонахождения фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.11 Граничные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which one property holds in some cycle or in all cycles before another property holds. These operators are&lt;br /&gt;
as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые описывают поведение, в котором одно свойство выполняется в некотором цикле или во всех циклах перед выполнением следующего слова. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
until*     левый операнд выполняется в любое время до выполнения правого операнда &lt;br /&gt;
before*    левый операнд выполняется через некоторое время после выполнения правого&lt;br /&gt;
&lt;br /&gt;
Граничные операторы фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.12 Суффиксные операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a property that holds at the end of a given sequence. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из свойства, которое выполняется в конце данной последовательности. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 |-&amp;gt;    суффиксная импликация с перекрытием&lt;br /&gt;
 |=&amp;gt;    суффиксная импликация без перекрытия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The suffix implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы суффиксной импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE—The FL Property {r} (f) is an alternative form for (and has the same semantics as) the FL Property {r} |-&amp;gt; f.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание - Свойство фундаментального языка {r} (f) - это альтернативная форма (и имеет такую же семантику) для свойства фундаментального языка {r} |-&amp;gt; f.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.13 Операторы логической импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a Boolean, a sequence, or a property that holds if another Boolean, sequence, or property holds.&lt;br /&gt;
These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторый фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из Булевых выражений, последовательности или свойства, которое выполняется, если выполняется другое Булево выражение, последовательность или свойство.  &lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;    логическая IF импикация&lt;br /&gt;
 &amp;lt;-&amp;gt;   логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The logical IF and logical IFF implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы логической импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.14 Операторы неизменности фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which a property does or does not hold, globally. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором выполняется или не выполняется глобально. &lt;br /&gt;
&lt;br /&gt;
 always   правый операнд выполняется глобально&lt;br /&gt;
 never    правый операнд не выполняется глобально&lt;br /&gt;
&lt;br /&gt;
Операторы неизменности фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.3 Операторы дополнительного расширенного ветвления (OBE) =====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица 3—OBE оператор, приоритет и ассоциативность&lt;br /&gt;
|-&lt;br /&gt;
! Класс оператора || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| (наивысший приоритет)&amp;lt;br/&amp;gt;HDL операторы || || ||&lt;br /&gt;
|-&lt;br /&gt;
| OBE операторы местонахождения ||left ||  AX AG AF&amp;lt;br/&amp;gt; A [ U ] || EX EG EF &amp;lt;br/&amp;gt;E [ U ]&lt;br /&gt;
|-&lt;br /&gt;
| Операторы Булевой импликации&amp;lt;br/&amp;gt;(низший приоритет) || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.1 OBE операторы местонахождения ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence after the HDL operators are&lt;br /&gt;
those used to specify when a subordinate property is required to hold, if the parent property is to hold. These&lt;br /&gt;
operators include the following:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы являются следующими операторами с наивысшим приоритетом, после HDL операторов, они используются для указания, когда подчиненное свойство должно выполняться, если выполняется старшее свойство. Это следующие операторы:   &lt;br /&gt;
&lt;br /&gt;
 AX    на всех путях, на следующем состоянии каждого пути&lt;br /&gt;
 AG    на всех путях, на каждом состоянии любого пути&lt;br /&gt;
 AF    на всех путях, на некотором будущем состоянии каждого пути&lt;br /&gt;
 EX    на некотором пути, на следующем состоянии пути&lt;br /&gt;
 EG    на некотором пути, на всех состояния пути&lt;br /&gt;
 EF    на некотором пути , на некотором будущем состоянии пути&lt;br /&gt;
 A[U]  на всех путях, в каждом состоянии до определенного состояния пути&lt;br /&gt;
 E[U]  на некотором пути, в каждом состоянии до определенного состояния пути&lt;br /&gt;
&lt;br /&gt;
OBE операторы местонахождения лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.2 OBE операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence are those used to describe&lt;br /&gt;
behavior consisting of a Boolean or a property that holds if another Boolean or property holds. These&lt;br /&gt;
operators are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы со следующим наивысшим приоритетом, это те которые используются для описания поведения, состоящего из Булевых выражений или свойства, которое выполняется, если Булево выражение или другое свойство выполняется. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;   логическая IF импликация&lt;br /&gt;
 &amp;lt;-&amp;gt;  логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
Операторы логической IF и логической IFF импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.4 Макросы ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL provides macro processing capabilities that facilitate the definition of properties. SystemC, VHDL, and&lt;br /&gt;
GDL flavors support cpp pre-processing directives (e.g., #define, #ifdef, #else, #include, and #undef).&lt;br /&gt;
SystemVerilog and Verilog flavors support Verilog compiler directives (e.g., `define, `ifdef, `else, `include,&lt;br /&gt;
and `undef). All flavors also support PSL macros %for and %if, which can be used to conditionally or&lt;br /&gt;
iteratively generate PSL statements. The cpp or Verilog compiler directives shall be interpreted first, and&lt;br /&gt;
PSL %if and %for macros shall be interpreted second.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предоставляет возможность обработки макросов, которые помогают в определении свойств. SystemC, VHDL и&lt;br /&gt;
GDL варианты поддерживают cpp препроцессорные директивы (т.е.  #define, #ifdef, #else, #include и #undef).&lt;br /&gt;
SystemVerilog и Verilog поддерживают директивы Verilog компилятора (т.е. `define, `ifdef, `else, `include и `undef). Все варианты, также поддерживают PSL макросы %for и %if, которые могут использоваться для условно или итеративно генерированного PSL утверждения. Компилированные директивы Verilog или cpp должны быть интерпретированы первыми, макросы PSL %if и %for должны быть интепретированы вторыми &lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.1 Конструкция %for =====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.2 Конструкция %if =====&lt;br /&gt;
&lt;br /&gt;
==== 4.2.5 Комментарии ====&lt;br /&gt;
&lt;br /&gt;
PSL обеспечивает возможность вставки комментариев в PSL спецификацию. Для каждого стиля, возможность комментариев совместима с тем, что обеспечивается соответсвующией средой PSL.&lt;br /&gt;
&lt;br /&gt;
Для SystemC, SystemVerilog, и Verilog стиля, оба варианта блочных комментариев (/* .... */) и (// .... ''&amp;lt;eol&amp;gt;'') поддерживается. (''&amp;lt;eol&amp;gt;'' — конец строки)&lt;br /&gt;
&lt;br /&gt;
Для стиля VHDL, поддерживается комментарии (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Для стиля GDL, оба блочных стилей комментариев поддерживаются: (/* .... */) и (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Синтаксис ===&lt;br /&gt;
&lt;br /&gt;
==== 4.3.1 Соответствия ====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
! Операнд || SystemVerilog || Verilog || VHDL || SystemC ||  GDL&lt;br /&gt;
|-&lt;br /&gt;
| И || &amp;amp;&amp;amp; || &amp;amp;&amp;amp; || and || &amp;amp;&amp;amp; || &amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| ИЛИ || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || or || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| НЕ || ! || ! || not || ! || !&lt;br /&gt;
|-&lt;br /&gt;
| ДИАПАЗОН ||  : ||  : ||  to || :|| ..&lt;br /&gt;
|-&lt;br /&gt;
| МИНИМАЛЬНОЕ ЗНАЧЕНИЕ || 0 || 0 || 0 || 0 || null&lt;br /&gt;
|-&lt;br /&gt;
| МАКСИМАЛЬНОЕ ЗНАЧЕНИЯ || $ ||  inf || inf || inf || null&lt;br /&gt;
|-&lt;br /&gt;
| ЛЕВАЯ ГРАНИЦА || [ || [ || ( || [ || (&lt;br /&gt;
|-&lt;br /&gt;
| ПРАВАЯ ГРАНИЦА || ] || ] || ) || ] || )&lt;br /&gt;
|-&lt;br /&gt;
| ПРИСВАИВАНИЕ || = || = || is || = || :=&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Semantics ===&lt;br /&gt;
&lt;br /&gt;
The following subclauses introduce various general concepts related to temporal property specification and&lt;br /&gt;
explain how they apply to PSL.&lt;br /&gt;
&lt;br /&gt;
==== 4.4.1 Clocked vs. unclocked evaluation ====&lt;br /&gt;
&lt;br /&gt;
== NEW ==&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)</id>
		<title>PSL/IEEE Standard 1850-2010 for Property Specification Language (PSL)</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)"/>
				<updated>2013-10-23T16:13:27Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.2.4 Макросы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Обзор ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Возможность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard defines the property specification language (PSL), which formally describes electronic system&lt;br /&gt;
behavior. This standard specifies the syntax and semantics for PSL and also clarifies how PSL interfaces&lt;br /&gt;
with various standard electronic system design languages.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт определяет язык свойств спецификации (PSL), который формально описывает поведение электронных систем. Этот стандарт специфицирует синтаксис и семантику для PSL, а также разъясняет, как PSL взаимодействует с различными стандартами языков описания электронных систем.&lt;br /&gt;
&lt;br /&gt;
===1.2 Назначение===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of this standard is to provide a well-defined language for formal specification of electronic&lt;br /&gt;
system behavior, one that is compatible with multiple electronic system design languages, including IEEE&lt;br /&gt;
Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), and IEEE Std&lt;br /&gt;
1666TM (SystemC®), to facilitate a common specification and verification flow for multi-language and&lt;br /&gt;
mixed-language designs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Назначение этого стандарта заключается в том, чтобы предоставить четкий язык для формальной спецификации поведения электронных систем, который будет совместим с множеством языков описания электронных систем, включая IEEE Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), и IEEE Std 1666TM (SystemC®), способствуя общему потоку верификации и спецификации для проектов описанных на разных и смешанных языках.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard creates an updated IEEE standard based upon IEEE Std 1850-2005. The updated standard will&lt;br /&gt;
refine IEEE standard, addressing errata, minor technical issues, and proposed extensions specifically related&lt;br /&gt;
to property reuse and improved simulation usability.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт создает обновленный IEEE стандарт базирующийся на IEEE Std 1850-2005. Обновленный стандарт усовершенствует IEEE стандарт, адресные опечатки, незначительные технические вопросы и предполагаемого расширения непосредственно связанных свойств, для дальнейшего использования и облегчения моделирования.&lt;br /&gt;
       &lt;br /&gt;
==== 1.2.1 Происхождение ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The complexity of Very Large Scale Integration (VLSI) has grown to such a degree that traditional&lt;br /&gt;
approaches have begun to reach their limitations, and verification costs have reached 60%–70% of&lt;br /&gt;
development resources. The need for advanced verification methodology, with improved observability of&lt;br /&gt;
design behavior and improved controllability of the verification process, has become critical. Over the last&lt;br /&gt;
decade, a methodology based on the notion of “properties” has been identified as a powerful verification&lt;br /&gt;
paradigm that can assure enhanced productivity, higher design quality, and, ultimately, faster time to market&lt;br /&gt;
and higher value to engineers and end-users of electronics products. Properties, as used in this context, are&lt;br /&gt;
concise, declarative, expressive, and unambiguous specifications of desired system behavior that are used to&lt;br /&gt;
guide the verification process. IEEE 1850 PSL is a standard language for specifying electronic system&lt;br /&gt;
behavior using properties. PSL facilitates property-based verification using both simulation and formal&lt;br /&gt;
verification, thereby enabling a productivity boost in functional verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сложность проектов с очень большой степенью интеграции (VLSI) выросла до такого уровня, что традиционные подходы начали достигать своего предела, а издержки верификации достигли 60%-70% от ресурсов разработки. Потребность в более продвинутой методологии верификации, с улучшенной наблюдаемостью  поведения проекта и улучшенной контролируемостью (способностью контроля) процесса верификации, стала критической. За последние 10 лет, методология, базирующаяся на понятии &amp;quot;свойств&amp;quot;, была определена, как мощная парадигма верификации, которая способна обеспечить повышение производительности (эффективности), повышенное качество проекта, и значительно ускорить время выхода на рынок (time to market), увеличить число производителей (higher value to engineers?) и пользователей электронных продуктов. Свойства, используемые в данном контексте, являются краткие, декларативные/описательные (declarative), выразительные/ясные/точные (expressive) и однозначные спецификации желаемого поведения системы, которые используются для проведения процесса верификации. IEEE 1850 PSL стандартный язык для описания (спецификации) поведения электронной системы, используя свойства. PSL облегчает верификацию основанную на свойствах (property-based verification) с использованием как моделирования так и формальной верификации, что позволяет повысить эффективность функциональной верификации.&lt;br /&gt;
&lt;br /&gt;
====1.2.2 Мотивация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Ensuring that a design’s implementation satisfies its specification is the foundation of hardware verification.&lt;br /&gt;
Key to the design and verification process is the act of specification. Yet historically, the process of&lt;br /&gt;
specification has consisted of creating a natural language description of a set of design requirements. This&lt;br /&gt;
form of specification is both ambiguous and, in many cases, unverifiable due to the lack of a standard&lt;br /&gt;
machine-executable representation. Furthermore, ensuring that all functional aspects of the specification&lt;br /&gt;
have been adequately ''verified'' (that is, covered) is problematic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Обеспечение реализации проекта удовлетворяющей его спецификацию, является  основным для верификации аппаратуры. Ключ к проекту и процессу верификации является законом спецификации. Исторически, процесс спецификации состоял из создания языкового описания набора требований к проекту. Эта форма спецификации неоднозначная, и во многих случаях неверифицируема в связи с отсутствием стандарта машинно-выполняемого представления. Кроме того, обеспечение, того чтобы все функциональные аспекты спецификации были адекватно ''верифицированы'' (т.е. покрыты), довольно проблематично.           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The IEEE PSL was developed to address these shortcomings. It gives the design architect a standard means&lt;br /&gt;
of specifying design properties using a concise syntax with clearly-defined formal semantics. Similarly, it&lt;br /&gt;
enables the RTL implementer to capture design intent in a verifiable form, while enabling the verification&lt;br /&gt;
engineer to validate that the implementation satisfies its specification through ''dynamic'' (that is, simulation)&lt;br /&gt;
and ''static'' (that is, formal) verification means. Furthermore, it provides a means to measure the quality of the&lt;br /&gt;
verification process through the creation of functional coverage models built on formally specified&lt;br /&gt;
properties. In addition, it provides a standard means for hardware designers and verification engineers to&lt;br /&gt;
create a rigorous and machine-executable design specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
IEEE PSL был создан, чтобы устранить эти недостатки. Это дает архитектуре проекта стандарт, означающий спецификацию свойств проекта&lt;br /&gt;
используемых краткий синтаксис с простой формальной семантикой. Аналогичным образом, позволяется RTL-исполнителю определить цели проекта в проверяемых формах, пока разрешается верификации подтвердить, что выполнение окончено и его спецификация определена через ''динамическую'' ( моделирование) и статическую (формальную) верификацию. Более того, он предоставляет средства для определения качества процесса верификации, через создание полной функциональной модели построения на формально специфицированных свойствах. В дополнение, он предоставляет стандартные средства для аппаратуры проекта и инженера верификации при создании строгой и исполняемой машиной спецификации проекта.&lt;br /&gt;
&lt;br /&gt;
====1.2.3 Цели====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was specifically developed to fulfill the following general hardware functional specification&lt;br /&gt;
requirements:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был специально создан для исполнения следующих общих аппаратных функциональных требований:&lt;br /&gt;
* Легко обучать, чиать и писать&lt;br /&gt;
* Краткий синтаксис&lt;br /&gt;
* Строго определенная формальная семантика&lt;br /&gt;
* Выразительная мощность, позволяющая специфицировать большие классы реальных проектов&lt;br /&gt;
* Известные эффективные алгоритмы моделирования, такие же как формальная верификация&lt;br /&gt;
&lt;br /&gt;
===1.3 Использование===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a language for the formal specification of hardware. It is used to describe properties that are required&lt;br /&gt;
to hold in the design under verification. PSL provides a means to write specifications that are both easy to&lt;br /&gt;
read and mathematically precise. It is intended to be used for functional specification on the one hand and as&lt;br /&gt;
input to functional verification tools on the other. Thus, a PSL specification is an executable specification of&lt;br /&gt;
a hardware design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL язык для формальной спецификации аппаратуры. Он используется для описания свойств, которые требуют поддержки в проекте под верификацию. PSL предоставляет средства для написания спецификаций, которые легко читаются и математически точны. Это предназначение используется для функциональной спецификации, с одной стороны, и как вход в программы функциональной верификации, с другой. Таким образом, спецификация PSL - это исполняемая спецификация для аппаратного проекта.&lt;br /&gt;
      &lt;br /&gt;
====1.3.1 Функциональная спецификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can be used to capture requirements regarding the overall behavior of a design, as well as assumptions&lt;br /&gt;
about the environment in which the design is expected to operate. PSL can also capture internal behavioral&lt;br /&gt;
requirements and assumptions that arise during the design process. Both enable more effective functional&lt;br /&gt;
verification and reuse of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL может использоваться для выделения требований относительно общего поведения проекта, также как допущения о среде, в которой ожидается обработка проекта. PSL также может выделять внутреннее поведение требований и допущений, которые возникают в процессе обработки проекта. Доступными являются более эффективная функциональная верификация и продолжения обработки самого проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
One important use of PSL is for documentation, either in place of or along with an English specification. A&lt;br /&gt;
PSL specification can describe simple invariants (for example, signals &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; are never asserted simultaneously) as well as multi-cycle behavior (for example, correct&lt;br /&gt;
behavior of an interface with respect to a bus protocol or correct behavior of pipelined operations).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Один из важных аспектов использования PSL - это использование для документации, как вместо, так и совместно с английской спецификацией. Спецификация PSL может описать простые инварианты (например: сигналы &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; никогда не используются в одно время), также как многотактовое поведение (например: правильное поведение интерфейса с поддержкой протокола шины или правильное поведение конвейерных операций).  &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification consists of ''assertions'' regarding ''properties'' of a design under a set of ''assumptions''. A&lt;br /&gt;
''property'' is built from three kinds of elements: ''Boolean expressions'', which describe behavior over one cycle;&lt;br /&gt;
''sequential expressions'', which can describe multi-cycle behavior; and ''temporal operators'', which describe&lt;br /&gt;
temporal relationships among Boolean expressions and sequences. For example, consider the following&lt;br /&gt;
Verilog Boolean expression:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL состоит из ''утверждений'' относительно ''свойства'' проекта под набором ''допущений''. ''Свойство'' строится из трех видов элементов: ''Булевы выражения'', которые описывают поведение в одно цикле; ''последовательные выражения'', которые могут описывать многотактовое поведение;  и ''временные операторы'', которые описывают временные взаимоотношения между Булевыми выражениями и последовательностями. Например, Булево выражение в Verilog:&lt;br /&gt;
&lt;br /&gt;
 ena || enb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This expression describes a cycle in which at least one of the signals &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; are asserted. The PSL&lt;br /&gt;
sequential expression&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это выражение описывает цикл, в котором, по крайней мере, один из сигналов &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен. Последовательное выражение PSL&lt;br /&gt;
&lt;br /&gt;
 {req; ack; !cancel}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
describes a sequence of cycles, such that req is asserted in the first cycle, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is asserted in the second&lt;br /&gt;
cycle, and &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; is deasserted in the third cycle. The following property, obtained by applying the&lt;br /&gt;
temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; to these expressions,&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
описывает последовательность циклов, такую, что если &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; активен в первом цикле, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; активен во втором цикле, а &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt;  неактивен  в третьем цикле. Следующее свойство получается, применяя временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; к этим выражениям,&lt;br /&gt;
&lt;br /&gt;
 always {req;ack;!cancel} |=&amp;gt; (ena || enb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
means that always (that is, in every cycle), if the sequence &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt; occurs, then either &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;&lt;br /&gt;
or &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; is asserted one cycle after the sequence ends. Adding the directive &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
это значит, что всегда (в каждом цикле), если встречается последовательность &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt;, то либо &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;, либо &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен в течение цикла после окончания последовательности. Добавляя директиву &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; следующей:   &lt;br /&gt;
&lt;br /&gt;
 assert always {req;ack;!cancel} |=&amp;gt; (ena || enb);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
completes the specification, indicating that this property is expected to hold in the design and that this&lt;br /&gt;
expectation needs to be verified.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
завершается спецификация, указывая, что это свойство ожидается в проекте и что потребности это ожидания нужно верифицировать.&lt;br /&gt;
  &lt;br /&gt;
====1.3.2 Функциональная верификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can also be used as input to verification tools, for both verification by simulation, as well as formal&lt;br /&gt;
verification using a model checker or a theorem prover. Each of these is discussed in the subclauses that&lt;br /&gt;
follow.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL также может использоваться, как вход для программ верификации, как для верификации моделированием, так и для формальной верификации, используется проверка модели или теоретическое доказательство. Каждый вариант обсуждается в следующих пунктах.&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.1 Моделирование=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification can also be used to automatically generate checks of simulated behavior. This can be&lt;br /&gt;
done, for example, by directly integrating the checks in the simulation tool; by interpreting PSL properties in&lt;br /&gt;
a testbench automation tool that drives the simulator; by generating HDL monitors that are simulated&lt;br /&gt;
alongside the design; or by analyzing the traces produced during simulation.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL также может использоваться для автоматического генерирования проверок поведения моделирования. Это может быть реализовано, например, прямой интеграцией проверок в программе моделирования; интерпретацией свойств PSL в тестовую автоматизированную программу, которая сопровождает симулятор; генерированием HDL контроллеров, которые моделируются рядом с проектом; или анализом путей пройденных во время моделирования.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  &lt;br /&gt;
For instance, the following PSL property:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Например, следующие PSL свойства:&lt;br /&gt;
&lt;br /&gt;
 Свойство 1: always (req -&amp;gt; next !req)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is a pulsed signal, i.e., if it is high in some cycle, then it is low in the following cycle.&lt;br /&gt;
Such a property can be easily checked using a simulation checker written in some HDL that has the&lt;br /&gt;
functionality of the finite state machine (FSM) shown in Figure 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
означает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; пульсирующий сигнал, т.е. если он принимает высокие значения в одном цикле,то он примет низкие значения в следующем цикле. Такое свойство может быть легко проверенно, используя проверки моделирования, написанные на каком-нибудь HDL, который имеет функциональность конечного автомат (FSM), показанный на Рисунке 1. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig01.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
!Рисунок 1—Простой FSM, который проверяет свойство 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For properties more complicated than the property shown in Figure 1, manually writing a corresponding&lt;br /&gt;
checker is painstaking and error-prone, and maintaining a collection of such checkers for a constantly changing design under development is a time-consuming task. Instead, a PSL specification can be used as input to&lt;br /&gt;
a tool that automatically generates simulatable checkers.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для более сложных свойств, чем то что представлено на рисунке 1, писать вручную соответствующие проверки - это кропотливый труд, подверженный ошибкам, и содержание набора таких проверок для постоянно изменяющегося проекта - это очень трудоемкое задание. Вместо этого, спецификация PSL может использоваться, как вход для программы, которая автоматически генерирует проверки, поддающиеся моделированию.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--     &lt;br /&gt;
Although in principle, all PSL properties can be checked for finite paths in simulation, the implementation&lt;br /&gt;
of the checks is often significantly simpler for a subset called the ''simple subset'' of PSL. Informally, in this&lt;br /&gt;
subset, composition of temporal properties is restricted to ensure that time ''moves forward'' from left to right&lt;br /&gt;
through a property, as it does in a timing diagram. (See 4.4.4 for the formal definition of the simple subset.)&lt;br /&gt;
&lt;br /&gt;
For example, the property&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Хотя в принципе, все свойства PSL могут быть проверены при окончание моделирования, исполнение проверок, часто, значительно проще для подмножеств, называемых ''простые подмножества'' PSL. Неформально, в этих подмножествах, состав временных свойств ограничен для обеспечения того, что бы время ''двигалось вперед'' слева направо через свойство, как это делается на временной диаграмме. (Смотрите 4.4.4 для формального понимания простых подмножеств.)&lt;br /&gt;
&lt;br /&gt;
Например, свойство &lt;br /&gt;
&lt;br /&gt;
 Свойство 2: always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
which states that, if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted three cycles later, belongs to the simple subset, because&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; appears to the left of b in the property and also appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the timing diagram of any&lt;br /&gt;
behavior that is not a violation of the property. Figure 2 shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
которое означает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значения, то &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет значение через три цикла, принадлежит простому подмножеству, потому что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве и, также, появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на временной диаграмме любой поведенческой модели, что не нарушает свойство. Рисунок 2 показывает пример такой временной диаграммы.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig02.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 2—Вариант удовлетворяющий свойство 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
An example of a property that is not in this subset is the property&lt;br /&gt;
&lt;br /&gt;
 Property 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
which states that, if a is asserted and b is asserted three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is asserted (in the same cycle as&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;). This property does not belong to the simple subset, because although &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; appears to the right of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in&lt;br /&gt;
the property, it appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; timing diagram that is not a violation of the property. Figure 3&lt;br /&gt;
shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пример свойства не принадлежащего этому подмножеству&lt;br /&gt;
&lt;br /&gt;
 Свойство 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
которое значит, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значение и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение через три цикла, то &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; принимает значение в том же цикле, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Это свойство не принадлежит простому подмножеству, потому что хотя &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; появляется справа от &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве, он появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на временной диаграмме, и это не нарушает свойство. Рисунок 3 показывает пример такой временной диаграммы.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig03.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 3 3—Вариант, удовлетворяющий свойство 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.2 Формальная верификация=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is an extension of the standard temporal logics Linear-Time Temporal Logic (LTL) and Computation&lt;br /&gt;
Tree Logic (CTL). A specification in the PSL Foundation Language (respectively, the PSL Optional Branching Extension) can be ''compiled down'' to a formula of pure LTL (respectively, CTL), possibly with some&lt;br /&gt;
auxiliary HDL code, known as a ''satellite''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL это расширение стандарта временной логики Линейной временной логике (LTL) и Вычисляемого логического дерева (CTL). Спецификация  в PSL фундаментального языка (соответственно, PSL дополнительного ветвления) может быть ''скомпилирована'' в виде чистого LTL (соответственно, CTL), возможно с некоторым вспомогательным HDL- кодом, известным, как ''спутник''.&lt;br /&gt;
&lt;br /&gt;
== 3. Определения, сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;--&lt;br /&gt;
For the purposes of this document, the following terms and definitions apply. The IEEE Standards Diction-&lt;br /&gt;
ary: Glossary of Terms &amp;amp; Definitions should be referenced for terms not defined in this clause.6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цели этого документа - текущие термины и определения. IEEE словарь стандартов: Cловарь терминов и определений должен ссылаться на условия неопределенные в этом пункте.6 &lt;br /&gt;
&lt;br /&gt;
===3.1 Определения (Definitions) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the terms used in this standard.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет термины, используемые в этом стандарте. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- '''assertion''': A statement that a given property is required to hold and a directive to functional verification&lt;br /&gt;
tools to verify that it does hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''утверждение (assertion)''': значит, что данное свойство требуется выполнить и указать программе функциональной верификации, чтобы убедиться, что оно выполняется. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''assumption''': A statement that the design is constrained by the given property and a directive to functional&lt;br /&gt;
verification tools to consider only paths on which the given property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''допущение (assumption)''': значит, что проект ограничен данным свойством и программе функциональной верификации указывается учитывать только тот путь, на котором данное свойство выполняется.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''asynchronous property''': A property whose clock context is equivalent to True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''асинхронное свойство (asynchronous property)''': Свойство, временной контекст которого эквивалентен значению Правда.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
'''behavior''': A path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение (behavior)''': Путь.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Boolean (expression)''': An expression that yields a logical value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''Булевы (выражения) (Boolean (expression))''': Выражения, которые принимают на выходе логические значения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''checker''': An auxiliary process (usually constructed as a finite state machine) that monitors simulation of a&lt;br /&gt;
design and reports errors when asserted properties do not hold. A checker may be represented in the same&lt;br /&gt;
HDL code as the design or in some other form that can be linked with a simulation of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка (checker)''': Вспомогательный процесс (обычно применяемый, как конечный автомат), который проверяет моделирование проекта и сообщения об ошибках, когда утвержденное свойство не выполняется. Проверка может быть представлена в том же HDL-коде, что и проект или в какой-либо другой форме, которая может ссылаться на моделирование проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''completes''': A term used to identify the last cycle of a path that satisfies a sequential expression or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''завершение (completes)''': Термин используемый для определения последнего цикла пути, который удовлетворяет последовательности выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''computation path''': A succession of states of the design, such that the design can actually transition from&lt;br /&gt;
each state on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''вычисленный путь (computation path)''': Правопреемство состояний проекта, такое что проект может актуально переходить из каждого состояния на пути к его преемнику. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''constraint''': A condition (usually on the input signals) that limits the set of behaviors to be considered. A&lt;br /&gt;
constraint may represent real requirements (e.g., clocking requirements) on the environment in which the&lt;br /&gt;
design is used, or it may represent artificial limitations (e.g., mode settings) imposed in order to partition the&lt;br /&gt;
functional verification task.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (constraint)''': Состояние ( обычно для входного сигнала), которое ограничивает набор поведений, которые следует рассматривать. Ограничение может представлять реальные требования (т.е. временные требования) в среде, в которой используется проект, или может представлять искусственные ограничения (т.е. настройки режима) наложенные в порядке разделения задания функциональной верификации.       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''count''': A number or range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''счетчик (count)''': Число или диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''coverage''': A measure of the occurrence of certain behavior during (typically dynamic) functional&lt;br /&gt;
verification and, therefore, a measure of the completeness of the (dynamic) functional verification process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''зона покрытия (coverage)''': Мера возникновения определенного поведения в течение (обычно динамическое) функциональной верификации и поэтому расчет сложности (динамического) процесса функциональной верификации.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''cycle''': An evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''цикл (cycle)''': Оценочный цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''describes''': A term used to identify the set of behaviors for which Boolean expression, sequential expression,&lt;br /&gt;
or property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''описания (describes)''': Термин, используемый для определения набора поведений, для которого Булевы выражения, последовательные выражения или выполняемые свойства.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design''': A model of a piece of hardware, described in some hardware description language (HDL). A design&lt;br /&gt;
typically involves a collection of inputs, outputs, state elements, and combinational functions that compute&lt;br /&gt;
next state and outputs from current state and inputs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проект (design)''': Модель кусочка аппаратуры, описанная на некотором языке описания аппаратуры (HDL). Проект типично включает в себя набор входов, выходов, элементов состояния и комбинационных функций, которые рассчитывают следующие состояние и выходы из текущего состояния и входов.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design behavior''': A computation path for a given design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение проекта (design behavior)''': Рассчитанный путь для данного проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''dynamic verification''': A verification process such as simulation, in which a property is checked over indi-&lt;br /&gt;
vidual, finite design behaviors that are typically obtained by dynamically exercising the design through a&lt;br /&gt;
finite number of evaluation cycles. Generally, dynamic verification supports no inference about whether the&lt;br /&gt;
property holds for a behavior over which the property has not yet been checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''динамическая верификация (dynamic verification)''': Процесс верификации, такой как моделирование, в котором свойство проверяется &lt;br /&gt;
отдельно, конечные поведения проекта, которые обычно получаются динамическим проведением проекта через конечное число оценочных циклов. В общем, динамическая верификация не дает вывода о выполняющемся свойстве поведения, через которое свойство еще не было проверено.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
'''evaluation''': The process of exercising a design by iteratively applying values to its inputs, computing its&lt;br /&gt;
next state and output values, advancing time, and assigning to the state variables and outputs their next&lt;br /&gt;
values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценка (evaluation)''': Процесс проведения проекта итеративным принятием значений на его входы, рассчитывая его следующие состояния и выходные значения, время опережения, и назначение переменных состояний и выходов своих следующих значений.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''evaluation cycle''': One iteration of the evaluation process. At an evaluation cycle, the state of the design is&lt;br /&gt;
recomputed (and may change).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценочный цикл (evaluation cycle)''': Одна итерация оценочного процесса. На одном оценочном цикле, состояние проекта пересчитывается ( и может быть изменено). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''extension (of a given path)''': A path that starts with precisely the succession of states in the given path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''расширения (данного пути) (extension (of a given path))''': Путь, который начинается  с точного правопреемства состояний в данном пути.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* '''False''': An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog flavors, the single bit values 1’b0, 1 ’bx, and 1’bz are interpreted as the logical value False. In the VHDL flavor, the values STD.Standard.Boolean’(False) and STD.Standard.Bit’(‘0’), as well as the values IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’( ‘X’), and IEEE.std_logic_1164.std_logic’(‘Z’) are all interpreted as the logical value False. In the SystemC flavor, the value 'false' of type bool and any integer literal with a numeric value of 0 are interpreted as the logical value False. In the GDL flavor, the Boolean value 'false' and bit value 0B are both interpreted as the logical value False.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''False''' — Интерпритация определённых значений определённых типов в HDL языках. В SystemVerilog и Verilog стилях, битовые значения 1’b0, 1 ’bx, и 1’bz интерпретируются как логическое значение False. В VHDL стиле, значения STD.Standard.Boolean’(False) и STD.Standard.Bit’(‘0’), также как значения IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’(‘X’), и IEEE.std_logic_1164.std_logic’(‘Z’) все интерпретируются как логическое значение False. В SystemC стиле, значение 'false' типа bool и любой литерал типа integer с числовым значением 0 интерпретируется как значение False. В GDL стиле, значение типа Boolean 'false' и значение типа bit 0B оба интерпретируются как логическое значение False.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''finite range''': A range with a finite high bound.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''конечный диапазон (finite range)''': Диапазон с большой конечной границей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''formal verification''': A functional verification process in which analysis of a design and a property yields a&lt;br /&gt;
logical inference about whether the property holds for all behaviors of the design. If a property is declared&lt;br /&gt;
true by a formal verification tool, no simulation can show it to be false. If the property does not hold for all&lt;br /&gt;
behaviors, then the formal verification process should provide a specific counterexample to the property, if&lt;br /&gt;
possible.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''формальная верификация (formal verification)''': Процесс функциональной верификации, в котором анализ дизайна и выхода свойства логически разъясняет о выполняемое свойство для все поведений проекта. Если свойство продекларировано значение &amp;quot;правда&amp;quot; программой формальной верификации, моделирование не может сделать его значение &amp;quot;ложным&amp;quot;. Если свойство не выполняется для каждого поведения, то процесс формальной верификации должен предоставить специфический контрпример свойства, если это возможно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''functional verification''': The process of confirming that, for a given design and a given set of constraints, a&lt;br /&gt;
property that is required to hold in that design actually does hold under those constraints.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''функциональная верификация (functional verification)''': Процесс подтверждения того, что для данного проекта и данного набора ограничений, свойство, которое требует выполнение в этом проекте, действительно выполняется в соответствие с данными ограничениями.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds''': A term used to talk about the meaning of a Boolean expression, sequential expression, or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''исполнение (holds)''': Термин используемый для разъяснения значения Булевых выражений, последовательных выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds tightly''': A term used to talk about the meaning of a sequential expression. Sequential expressions are&lt;br /&gt;
evaluated over finite paths (behavior).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''обязательное исполнение(holds tightly)''': Термин используемый для разъяснения значения последовательных выражений. Последовательные выражения оцениваются на конечной стадии (поведение). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''liveness property''': A property that specifies an eventuality that is unbounded in time. Loosely speaking, a&lt;br /&gt;
liveness property claims that “something good” eventually happens. More formally, a liveness property is a&lt;br /&gt;
property for which any finite path can be extended to a path satisfying the property. For example, the prop-&lt;br /&gt;
erty “whenever signal req is asserted, signal ack is asserted some time in the future” is a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''живучие свойства (liveness property)''': Свойства, которые указывают на случайность, которая не ограничена во времени. Грубо говоря, живучие свойства утверждает, что что-то “хорошее” в конечном счете произошло. Более формально, живучие свойство - это свойство, для которого любая конечная стадия может быть продолжена до стадии удовлетворения свойства. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через некоторое время” это живучие свойство. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logic type''': An HDL data type that includes values that are interpreted as logical values. A logic type may&lt;br /&gt;
also include values that are not interpreted as logical values. Such a logic type usually represents a multi-val-&lt;br /&gt;
ued logic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логический тип (logic type)''': Тип данных HDL, который включает значения, которые интерпретируются, как логические значения. Логический тип, также, включает значения, которые не интерпретируются, как логические значения. Как логический тип, обычно, представляет многозначную логику.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logical value''': A value in the set {True, False}.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логическое значение (logical value)''': Значение из набора {True, False}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''model checking''': A type of formal verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка на модели (model checking)''': Тип формальной верификации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''number''': A non-negative integer value, and a statically computable expression yielding such a value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''число (number)''': Неотрицательное целочисленное значение, и статично подсчитанное выражение полученное, как выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurs''': A term used to indicate that a Boolean expression holds in a given cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
''' (occurs)''': Термин используемый для индикации того, что Булево выражение выполняется в данном цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurrence (of a Boolean expression)''': A cycle in which the Boolean expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''occurrence (of a Boolean expression)''': Цикл, в котором выполняется Булево выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''path''': A succession of states of the design, whether or not the design can actually transition from one state&lt;br /&gt;
on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''стадия (путь) (path)''': Правопреемственность состояний проекта, ??? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive count''': A positive number or a positive range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный счетчик (positive count)''': Положительное число или положительный диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive number''': A number that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительное число (positive number)''': Число, которое больше нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive range''': A range with a low bound that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный диапазон (positive range)''': Диапазон с нижней границей большей нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''prefix (of a given path)''': A path of which the given path is an extension.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''префикс (данной стадии) (prefix (of a given path))''': Стадия в которую расширяется данная стадия.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''property''': A collection of logical and temporal relationships between and among subordinate Boolean&lt;br /&gt;
expressions, sequential expressions, and other properties that in aggregate represent a set of behaviors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство (property)''': Набор логических и временных взаимоотношений между и среди подчиненных Булевых выражений, последовательных выражений и других свойств, которые в совокупности представляют набор поведений.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''range''': A series of consecutive numbers, from a low bound to a high bound, inclusive, such that the low&lt;br /&gt;
bound is less than or equal to the high bound. In particular, this includes the case in which the low bound is&lt;br /&gt;
equal to the high bound. Also, a pair of statically computable integer expressions specifying such a series of&lt;br /&gt;
consecutive numbers, where the left expression specifies the low bound of the series, and the right expression specifies the high bound of the series. A range may describe a set of values or a variable number of&lt;br /&gt;
cycles or event repetitions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''диапазон (range)''': Набор последовательных чисел, от нижней до верней границы, включительно, такой, что нижняя граница меньше или равна верхней. В частности, это предполагает случай, в котором нижняя граница эквивалентна верхней. Также, пара статически подсчитанных целочисленных выражений представляются, как наборы последовательных чисел, где левая выражения является нижней границей, а правое выражение верхней границей набора. Диапазон может описывать набор значении и переменное число циклов или повторяющихся событий.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''restriction''': A statement that the design is constrained by the given sequential expression and a directive to&lt;br /&gt;
functional verification tools to consider only paths on which the given sequential expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (restriction)''': Утверждение, что проект ограничивается данным последовательным выражением, и директива программе функциональной верификации рассматривать только стадию, на которой выполняется данное последовательное выражение.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''safety property''': A property that specifies an invariant over the states in a design. The invariant is not necessarily limited to a single cycle, but it is bounded in time. Loosely speaking, a safety property claims that&lt;br /&gt;
“something bad” does not happen. More formally, a safety property is a property for which any path&lt;br /&gt;
violating the property has a finite prefix such that every extension of the prefix violates the property. For&lt;br /&gt;
example, the property, “whenever signal req is asserted, signal ack is asserted within 3 cycles” is a safety&lt;br /&gt;
property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''защищенное свойство (safety property)''': Свойство, которое указывает инвариантность по состояниям в проекте. Инвариантность - это необязательно ограниченность в один цикл, но ограниченность по времени. Грубо говоря, защищенное свойство показывает, что ничего “плохого” не произошло. Более формально, защищенное свойство - это свойство, для которого любая стадия имеющая навязывающееся свойство получает конечный префикс, такой ,что каждое расширение префикса навязывается свойству. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через три цикла”, является защищенным свойством.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequence''': A sequential expression that may be used directly within a property or directive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательность (sequence)''': Последовательное выражение, которое может напрямую использоваться в течение свойства или директивы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequential expression''': A finite series of terms that represent a set of behaviors.&lt;br /&gt;
sequential extended regular expression: A form of sequential expression, and a component of a sequence.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательное выражение (sequential expression)''': Законченный набор терминов, который представляет набор поведений.&lt;br /&gt;
&lt;br /&gt;
'''последовательные регулярно расширяемые выражения (sequential extended regular expression)''': Форма последовательных выражений и компонентов последовательностей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''starts''': A term used to identify the first cycle of a path that satisfies a sequential expression.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''начало (starts)''': Термин используемый для идентификации первого цикла пути, который удовлетворяет последовательное выражение. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strictly before''': Before, and not in the same cycle as.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''строго перед (strictly before)''': Перед, и не в этом же цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strong operator''': A temporal operator, the non-negated use of which usually creates a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''сильный оператор (strong operator)''': Временной оператор, неотрицательное использование которого, обычно, создает живучие свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal expression''': An expression that involves one or more temporal operators.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временное выражение (temporal expression)''': Выражение, которое включает один или более временных операторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal operator''': An operator that represents a temporal (i.e., time-oriented) relationship between its&lt;br /&gt;
operands.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временной оператор (temporal operator)''' Оператор, который представляет временные ( т.е. ориентированные во времени) взаимоотношения между операндами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating condition''': A Boolean expression, the occurrence of which causes a property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''условие завершения (terminating condition)''': Булево выражение, появление которого, приводит к завершению свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating property''': A property that, when it holds, causes another property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство завершения (terminating property)''': Свойство, выполнение которого, приводит к завершению другого свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
True: An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog&lt;br /&gt;
flavors, the single bit value 1'b1 is interpreted as the logical value True. In the VHDL flavor, the values&lt;br /&gt;
STD.Standard.Boolean'(True), STD.Standard.Bit'('1'),&lt;br /&gt;
IEEE.std_logic_1164.std_logic'('1'), and IEEE.std_logic_1164.std_logic'('H')&lt;br /&gt;
interpreted as the logical value True. In the SystemC flavor, the value 'true' of type bool and any integer&lt;br /&gt;
literal with a non-zero numeric value are interpreted as the logical value True. In the GDL flavor, the Boolean value 'true' and bit value 1B are both interpreted as the logical value True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* '''True''': Интерпритация определённых значений определённых типов в HDL языках. &lt;br /&gt;
** В SystemVerilog и Verilog стилях, битовые значение  1'b1 интерпретируется как логическое значение True. &lt;br /&gt;
** В VHDL стиле, значения STD.Standard.Boolean'(True), STD.Standard.Bit'('1'), IEEE.std_logic_1164.std_logic'('1'), и IEEE.std_logic_1164.std_logic'('H') интерпретируются как логическое значение True.&lt;br /&gt;
** В SystemC стиле, значение 'true' типа bool и любой литерал типа integer  с ненулевым числовым значением интерпретируется как логическое значение True.&lt;br /&gt;
** В GDL стиле, значение типа Boolean 'true' и значение типа bit 1B интерпретируются как логическое значение True.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''unknown value''': A value of a (multi-valued) logic type, other than 0 or 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''неизвестное значение (unknown value)''': Значение (многозначного) логического типа, отличное от 0 и 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''weak operator''': A temporal operator, the non-negated use of which does not create a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''слабый оператор (weak operator)''': Временной оператор, неотрицательное использование которого не создает живучего свойства.&lt;br /&gt;
&lt;br /&gt;
== 3.2 Сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
* ABV — утверждения, базирующиеся на верификации&lt;br /&gt;
* BNF — расширенная форма Бакуса-Наура&lt;br /&gt;
* cpp — C препроцессор&lt;br /&gt;
* CTL — вычисляемое логическое дерево&lt;br /&gt;
* EDA — авторматизация проектирования&lt;br /&gt;
* FL — фундаметальный язык&lt;br /&gt;
* FSM — конечный автомат&lt;br /&gt;
* GDL — общий язык описания&lt;br /&gt;
* HDL — язык описания аппаратуры&lt;br /&gt;
* iff — если, и только если&lt;br /&gt;
* LTL — линейная временная логика&lt;br /&gt;
* PSL — язык спецификации свойств&lt;br /&gt;
* OBE — дополнительное расширение ветвления&lt;br /&gt;
* RTL — уровень регистровых передач&lt;br /&gt;
* SERE — последовательное расширенное регулярное выражение&lt;br /&gt;
* VHDL — VHSIC язык описания аппаратуры&lt;br /&gt;
* VHSIC — высоко скоростная интегральная схема&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 4.1.1 Слои (Layers) ====&lt;br /&gt;
PSL состоит из четырёх слоёв: булевый (Boolean), временной (temporal), верификационный (verification), и модельный (modeling).&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.1 Булевый слой (Boolean layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The Boolean layer is used to build expressions that are, in turn, used by the other layers. Although it contains&lt;br /&gt;
expressions of many types, it is known as the Boolean layer because it is the supplier of Boolean&lt;br /&gt;
expressions to the heart of the language—the temporal layer. Boolean layer expressions are evaluated in a&lt;br /&gt;
single evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Булевый слой используется для создания выражений, которые, в свою очередь, используются другими слоями. Хотя этот слой содержит выражения над многими типами, он называется как булевый слой, потому что он является поставщиком булевых (логических) выражений для основы (сердца)  языка — временнОго слоя. Выражения булевого слоя выполняются в едином (одиночном) цикле выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.2 ВременнОй слой (Temporal layer) =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
The temporal layer is the heart of the language; it is used to describe properties of the design. It is known as&lt;br /&gt;
the temporal layer because, in addition to simple properties, such as “signals a and b are mutually&lt;br /&gt;
exclusive,” it can also describe properties involving complex temporal relations between signals, such as, “if&lt;br /&gt;
signal c is asserted, then signal d shall be asserted before signal e is asserted, but no more than eight clock&lt;br /&gt;
cycles later.” Temporal expressions are evaluated over a series of evaluation cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой является основой языка; он используется для описания свойств проекта. Он называется временным, потому что, в дополнение к простым свойствам, таким как &amp;quot;сигналы a и b являются взаимноисключающими&amp;quot;, он может также описывать свойства включающие сложные временные отношения между сигналами, например &amp;quot;если сигнал c устанавливается, тогда сигнал d должен установиться прежде, чем сигнал e установится, но не позже более восьми периодов синхросигнала&amp;quot;. ВременнЫе выражения выполняются в течении серии циклов выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.3 Верификационный слой (Verification layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The verification layer is used to tell the verification tools what to do with the properties described by the&lt;br /&gt;
temporal layer. For example, the verification layer contains directives that tell a tool to verify that a property&lt;br /&gt;
holds or to check that a specified sequence is covered by some test case.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верификационный слой используется для того чтобы сказать верификационному инструменту (САПР), что делать с свойствами описанными во временном слое. Например, верификационный слой включает директивы, которые говорят инструменту (САПР) чтобы верифицировал (verify) то, что свойство удерживает (hold) или  проверил (check) то, что заданная последовательность покрыта некоторым тестирующим случаем.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.4 Моделирующий слой (Modeling layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The modeling layer is used to model the behavior of design inputs (for tools, such as formal verification&lt;br /&gt;
tools, which do not use test cases) and to model auxiliary hardware that is not part of the design, but is&lt;br /&gt;
needed for verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Моделирующий слой (Modeling layer) используется для моделирования поведения входов проекта (для инструментов (САПР), таких как инструменты (САПР) для формальной верификации, которые не используют тестов) и для моделирования дополнительной аппаратуры, которая не является частью проекта, но необходима для верификации.&lt;br /&gt;
&lt;br /&gt;
==== 4.1.2 Стили/Варианты (Flavors) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL comes in five flavors: one for each of the hardware description languages SystemVerilog, Verilog,&lt;br /&gt;
VHDL, SystemC, and GDL. The syntax of each flavor conforms to the syntax of the corresponding HDL in&lt;br /&gt;
a number of specific areas—a given flavor of PSL is compatible with the corresponding HDL’s syntax in&lt;br /&gt;
those areas.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идёт с пятью вариантами/стилями (flavors): один для каждого HDL языка SystemVerilog, Verilog, VHDL, SystemC, и GDL. Синтаксис каждого варианта (стиля) соответствует синтаксису соответствующего HDL языка в ряде конкретных областей — данный стиль PSL совместим с соответствующим синтаксисом HDL-языка в этой области.&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Влияние стиля на слои PSL&lt;br /&gt;
!rowspan=2| Слой ||colspan=5 | HDL&lt;br /&gt;
|-&lt;br /&gt;
!  SystemVerilog || Verolog || VHDL || SystemC || GDL&lt;br /&gt;
|-&lt;br /&gt;
| Булевый || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Модельный  || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Временной || i:j || i:j || i to j || i:j ||  i..j&lt;br /&gt;
|-&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Лексическая структура ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the identifiers, keywords, operators, macros, and comments used in PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет идентификаторы, ключевые слова, операторы, макросы и комментарии, используемые в PSL.&lt;br /&gt;
 &lt;br /&gt;
==== 4.2.1 Идентификаторы (Identifiers) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Identifiers in PSL consist of an alphabetic character, followed by zero or more alphanumeric characters;&lt;br /&gt;
each subsequent alphanumeric character may optionally be preceded by a single underscore character.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Идентификаторы в PSL состоят из символа латинского алфавита, за которым следует ноль или более символов латинского алфавита; каждый последующий символ алфавита может по желанию предшествовать одному символу подчеркивания. Например:&lt;br /&gt;
&lt;br /&gt;
 mutex&lt;br /&gt;
 Read_Transaction&lt;br /&gt;
 L_123&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL identifiers are case-sensitive in the SystemVerilog, Verilog, and SystemC flavors and case-insensitive in&lt;br /&gt;
the VHDL and GDL flavors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идентификаторы являются чувстительными к регистру в SystemVerilog, Verilog, и SystemC вариантах/стилях и не чувствительными к регистру в VHDL и GDL вариантах.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.2 Ключевые слова ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;poem&amp;gt; A&lt;br /&gt;
 E&lt;br /&gt;
 next!&lt;br /&gt;
 rose&lt;br /&gt;
AF&lt;br /&gt;
 EF&lt;br /&gt;
 next_a&lt;br /&gt;
AG&lt;br /&gt;
 EG&lt;br /&gt;
 next_a!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; sequence&lt;br /&gt;
AX&lt;br /&gt;
abort&lt;br /&gt;
 EX&lt;br /&gt;
 next_e&lt;br /&gt;
 stable&lt;br /&gt;
always&lt;br /&gt;
 ended&lt;br /&gt;
 next_e!&lt;br /&gt;
string&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;anda&lt;br /&gt;
 eventually!&lt;br /&gt;
 next_event&lt;br /&gt;
 strong&lt;br /&gt;
assert&lt;br /&gt;
 next_event!&lt;br /&gt;
 sync_abort&lt;br /&gt;
assume&lt;br /&gt;
 F&lt;br /&gt;
 next_event_a&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;async_abort&lt;br /&gt;
fairness&lt;br /&gt;
 next_event_a!&lt;br /&gt;
 toe&lt;br /&gt;
before&lt;br /&gt;
 fell&lt;br /&gt;
 next_event_e&lt;br /&gt;
before!&lt;br /&gt;
 for&lt;br /&gt;
 next_event_e!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; U&lt;br /&gt;
before!_&lt;br /&gt;
 forall&lt;br /&gt;
 nondet&lt;br /&gt;
 union&lt;br /&gt;
before_&lt;br /&gt;
 nondet_vector&lt;br /&gt;
 until&lt;br /&gt;
bitvector&lt;br /&gt;
 bit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; G&lt;br /&gt;
 notc&lt;br /&gt;
 until!&lt;br /&gt;
boolean&lt;br /&gt;
 numeric&lt;br /&gt;
 until!_&lt;br /&gt;
hdltype&lt;br /&gt;
until_&lt;br /&gt;
clock&lt;br /&gt;
 onehot&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;const&lt;br /&gt;
 in&lt;br /&gt;
 onehot0&lt;br /&gt;
 vmode&lt;br /&gt;
countones&lt;br /&gt;
 inf&lt;br /&gt;
 ord&lt;br /&gt;
 vpkg&lt;br /&gt;
cover&lt;br /&gt;
 inherit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; vprop&lt;br /&gt;
isb&lt;br /&gt;
 property&lt;br /&gt;
 vunit&lt;br /&gt;
default&lt;br /&gt;
 isunknown&lt;br /&gt;
 prev&lt;br /&gt;
W&lt;br /&gt;
report&lt;br /&gt;
mutable&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; within&lt;br /&gt;
restrict&lt;br /&gt;
restrict!&lt;br /&gt;
never&lt;br /&gt;
 X&lt;br /&gt;
next&lt;br /&gt;
 X!&amp;lt;/poem&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*a and is a keyword only in the VHDL flavor; see the flavor macro AND_OP (4.3.2.6).&lt;br /&gt;
*b is is a keyword only in the VHDL flavor; see the flavor macro DEF_SYM (4.3.2.9).&lt;br /&gt;
*c not is a keyword only in the VHDL flavor; see the flavor macro NOT_OP (4.3.2.6).&lt;br /&gt;
*d or is a keyword only in the VHDL flavor; see the flavor macro OR_OP (4.3.2.6).&lt;br /&gt;
*e to is a keyword only in the VHDL flavor; see the flavor macro RANGE_SYM (4.3.2.7).&lt;br /&gt;
&lt;br /&gt;
==== 4.2.3 Операторы ====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.1 Операторы HDL языка =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
For a given flavor of PSL, the operators of the underlying HDL have the highest precedence. In particular,&lt;br /&gt;
this includes logical, relational, and arithmetic operators of the HDL. The HDL’s logical operators for&lt;br /&gt;
negation, conjunction, and disjunction of Boolean values may be used in PSL for negation, conjunction, and&lt;br /&gt;
disjunction of properties as well. In such applications, those operators have their usual precedence and&lt;br /&gt;
associativity, as if the PSL properties that are operands produced Boolean values of a type appropriate to the&lt;br /&gt;
logical operators native to the HDL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для заданного стиля PSL, операторы основного HDL языка имеют наивысший преоритет. В частности это включает логические, арифметические операторы и операторы отношения языка HDL. Логические операции HDL языка для отрицания,  конъюнкции и дизъюнкции булевых (логических) значений могут использоваться в PSL для отрицания, конъюнкции и дизъюнкции свойств. В таких приложениях, эти операторы имеют их обычный приоритет и ассоциативность, как если бы PSL свойства,....&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.2 Операторы фундаментального языка =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Various operators are available in PSL. Each operator has a precedence relative to other operators. In&lt;br /&gt;
general, operators with a higher relative precedence are associated with their operands before operators with&lt;br /&gt;
a lower relative precedence. If two operators with the same precedence appear in sequence, then the&lt;br /&gt;
operators are associated with their operands according to the associativity of the operators. Left-associative&lt;br /&gt;
operators are associated with operands in left-to-right order of appearance in the text; right-associative&lt;br /&gt;
operators are associated with operands in right-to-left order of appearance in the text.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Различные операторы доступны в PSL. Каждый оператор имеет приоритет по отношению к другим операторам. В общем операторы с большим приоритетом получают доступ к свои операндам, раньше, чем операнды с меньшим приоритетом. Если два оператора имеют одинаковый приоритет и появляются в последовательности, то они получают доступ к свои операндам в соответствие с ассоциативностью операторов. Лева-ассоциативные оператор получает доступ к своим операндам слева на право в порядке появления в тексте, право-ассоциативные операторы получают доступ к своим операндам справа на лева в порядке появления в тексте.   &lt;br /&gt;
 &lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица приоритетов и ассоциативности двух операторов фундаментального языка  &lt;br /&gt;
|-&lt;br /&gt;
! Оператор класс || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| ''(наивысший приоритет)''&lt;br /&gt;
&lt;br /&gt;
HDL операторы&lt;br /&gt;
| ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор объединения || left || union ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор времени || left || @ ||&lt;br /&gt;
|-&lt;br /&gt;
| SERE повторяющийся оператор || left || [* ] [+] [= ] [-&amp;gt; ] ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный предельный оператор || left || within ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор И || left || &amp;amp; || &amp;amp;&amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор ИЛИ || left || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор слияния || left || : ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор конкатенации || left || ; ||&lt;br /&gt;
|-&lt;br /&gt;
|  Операторы прерывания фундаментального языка || left || abort &amp;lt;br/&amp;gt; sync_abort || async_abort&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, указывающие местонахождение || right || next* || eventually!&lt;br /&gt;
|-&lt;br /&gt;
| || || X   X! || F&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, показывающие границы ||  right ||  U ||  W&lt;br /&gt;
|-&lt;br /&gt;
| || || until* || before*&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор импликации ||  right || &amp;lt;nowiki&amp;gt;|-&amp;gt;&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|=&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булевы операторы импликации || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Неизменные операторы фундаментального языка &amp;lt;br/&amp;gt; ''(низший приоритет)'' || right || always &amp;lt;br/&amp;gt; G || never&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 NOTE—The notation next* represents the next family of operators, which includes the operators next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a!, and&lt;br /&gt;
 next_event_e!. The notation until* represents the until family of operators, which includes the operators until,&lt;br /&gt;
 until!, until_, and until!_. The notation before* represents the before family of operators, which includes&lt;br /&gt;
 the operators before, before!, before_, and before!_.7&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 Примечание - Обозначение next* представляет семейство next-операторов, которое включает операторы: next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a! и&lt;br /&gt;
 next_event_e!. Обозначение until* представляет семейство until-операторов, которое включает операторы: until,&lt;br /&gt;
 until!, until_ и until!_. Обозначение before* представляет семейство before-операторов, которое включает операторы: before, before!, before_, and before!_.7&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.1 Объединительные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence after the HDL operators is that used to indicate a non-deterministic expression:&lt;br /&gt;
&lt;br /&gt;
 union   union operator&lt;br /&gt;
&lt;br /&gt;
The union operator is left-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL оператор со следующим наибольшим приоритетом после HDL операторов является тот, который используется для обозначения недетерминированного выражения:&lt;br /&gt;
&lt;br /&gt;
 union   union оператор&lt;br /&gt;
&lt;br /&gt;
Оператор union является лева-ассоциативным.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.2 Операторы времени ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the clocking operator, which is&lt;br /&gt;
used to associate a clock expression with a property or sequence:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это оператор времени, который используется для связи временного выражения со свойством или последовательностью:&lt;br /&gt;
&lt;br /&gt;
 @   clock event&lt;br /&gt;
&lt;br /&gt;
Временной оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.3 SERE операторы повторов (repetition operators) ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For any flavor of PSL, the FL operators with the next highest precedence are the repetition operators, which&lt;br /&gt;
are used to construct Sequential Extended Regular Expressions (SEREs). These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL операторы со следующим наибольшим приоритетом являются операторами повторов, которые используются для создания последовательных расширенных регулярных выражений (Sequential Extended Regular Expressions — SEREs). Эти операторы следующие:&lt;br /&gt;
&lt;br /&gt;
 [* ]   последовательное повторение (consecutive repetition)&lt;br /&gt;
 [+]    последовательное повторение (consecutive repetition)&lt;br /&gt;
 [= ]   не последовательное повторение (non-consecutive repetition)&lt;br /&gt;
 [-&amp;gt; ]  goto repetition&lt;br /&gt;
&lt;br /&gt;
SERE операторы повторения являются лева-ассоциативными.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.4 Последовательный предельный оператор ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence within operator,&lt;br /&gt;
which is used to describe behavior in which one sequence occurs during the course of another, or within a&lt;br /&gt;
time-bounded interval:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный предельный оператор, который используется для описания поведения, в котором одна последовательность появляется в ходе другой, или в пределах интервала ограниченного временем.&lt;br /&gt;
&lt;br /&gt;
 within    последовательность within оператор&lt;br /&gt;
&lt;br /&gt;
Последовательный предельный оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.5 Последовательные операторы конъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the sequence conjunction&lt;br /&gt;
operators, which are used to describe behavior consisting of parallel paths. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетов - это последовательные операторы конъюнкции, которые описывают поведение состоящие из параллельных стадий. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;    последовательная конъюнкция без сопоставления длинны&lt;br /&gt;
 &amp;amp;&amp;amp;   последовательная конъюнкция с сопоставлением длины&lt;br /&gt;
&lt;br /&gt;
Последовательные операторы конъюнкции лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.6 Последовательный оператор дизъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence disjunction operator,&lt;br /&gt;
which is used to describe behavior consisting of alternative paths:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор дизъюнкции, который используются для описания поведения состоящего из альтернативных стадий:&lt;br /&gt;
&lt;br /&gt;
 |    последовательная дизъюнкция&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор дизъюнкции лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.7 Последовательный оператор слияния ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence fusion operator,&lt;br /&gt;
which is used to describe behavior in which a later sequence starts in the same cycle in which an earlier&lt;br /&gt;
sequence completes:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор слияния, который используется для описания поведения, в котором более поздняя последовательность начинает выполняться в том же цикле, в котором заканчивает выполняться более ранняя.&lt;br /&gt;
&lt;br /&gt;
 :    последовательное слияние&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор слияния лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.8 Последовательный оператор конкатенации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence concatenation&lt;br /&gt;
operator, which is used to describe behavior in which one sequence is followed by another:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального со следующим наивысшим приоритетом - это последовательный оператор конкатенации, который используется, чтобы описывать поведение, в котором одна последовательность следует за другой:&lt;br /&gt;
&lt;br /&gt;
 ;    последовательная конкатенация&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор конкатенации лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.9 Операторы прерывания фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the FL termination operators,&lt;br /&gt;
which are used to describe behavior in which a condition causes both current and future obligations to be&lt;br /&gt;
canceled:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом - это операторы прерывания фундаментального языка, которые используются для описания поведения, в котором условие вызывает текущие и будущие процессы, которые будут прерваны:&lt;br /&gt;
&lt;br /&gt;
 sync_abort    немедленное завершение текущего и следующего процесса, синхронизовано по времени&lt;br /&gt;
 async_abort   немедленное прерывание текущего и следующего процесса, независт от времени&lt;br /&gt;
 abort         эквивалентно to async_abort&lt;br /&gt;
&lt;br /&gt;
Операторы прерывания фундаментального языка лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.10 Операторы местонахождения фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which an operand holds in the future. These operators are as follows:&lt;br /&gt;
eventually! the right operand holds at some time in the indefinite future&lt;br /&gt;
 next*     the right operand holds at some specified future time or range of future times&lt;br /&gt;
FL occurrence operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором операнды используются в будущем. Это следующие операторы: &lt;br /&gt;
eventually! правый операнд выполняется через некоторое время в неопределенном будущем&lt;br /&gt;
 next*     правый операнд выполняется в некотором специфицированном будущем времени или диапазоне будущего времени&lt;br /&gt;
операторы местонахождения фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.11 Граничные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which one property holds in some cycle or in all cycles before another property holds. These operators are&lt;br /&gt;
as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые описывают поведение, в котором одно свойство выполняется в некотором цикле или во всех циклах перед выполнением следующего слова. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
until*     левый операнд выполняется в любое время до выполнения правого операнда &lt;br /&gt;
before*    левый операнд выполняется через некоторое время после выполнения правого&lt;br /&gt;
&lt;br /&gt;
Граничные операторы фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.12 Суффиксные операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a property that holds at the end of a given sequence. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из свойства, которое выполняется в конце данной последовательности. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 |-&amp;gt;    суффиксная импликация с перекрытием&lt;br /&gt;
 |=&amp;gt;    суффиксная импликация без перекрытия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The suffix implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы суффиксной импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE—The FL Property {r} (f) is an alternative form for (and has the same semantics as) the FL Property {r} |-&amp;gt; f.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание - Свойство фундаментального языка {r} (f) - это альтернативная форма (и имеет такую же семантику) для свойства фундаментального языка {r} |-&amp;gt; f.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.13 Операторы логической импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a Boolean, a sequence, or a property that holds if another Boolean, sequence, or property holds.&lt;br /&gt;
These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторый фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из Булевых выражений, последовательности или свойства, которое выполняется, если выполняется другое Булево выражение, последовательность или свойство.  &lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;    логическая IF импикация&lt;br /&gt;
 &amp;lt;-&amp;gt;   логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The logical IF and logical IFF implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы логической импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.14 Операторы неизменности фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which a property does or does not hold, globally. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором выполняется или не выполняется глобально. &lt;br /&gt;
&lt;br /&gt;
 always   правый операнд выполняется глобально&lt;br /&gt;
 never    правый операнд не выполняется глобально&lt;br /&gt;
&lt;br /&gt;
Операторы неизменности фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.3 Операторы дополнительного расширенного ветвления (OBE) =====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица 3—OBE оператор, приоритет и ассоциативность&lt;br /&gt;
|-&lt;br /&gt;
! Класс оператора || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| (наивысший приоритет)&amp;lt;br/&amp;gt;HDL операторы || || ||&lt;br /&gt;
|-&lt;br /&gt;
| OBE операторы местонахождения ||left ||  AX AG AF&amp;lt;br/&amp;gt; A [ U ] || EX EG EF &amp;lt;br/&amp;gt;E [ U ]&lt;br /&gt;
|-&lt;br /&gt;
| Операторы Булевой импликации&amp;lt;br/&amp;gt;(низший приоритет) || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.1 OBE операторы местонахождения ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence after the HDL operators are&lt;br /&gt;
those used to specify when a subordinate property is required to hold, if the parent property is to hold. These&lt;br /&gt;
operators include the following:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы являются следующими операторами с наивысшим приоритетом, после HDL операторов, они используются для указания, когда подчиненное свойство должно выполняться, если выполняется старшее свойство. Это следующие операторы:   &lt;br /&gt;
&lt;br /&gt;
 AX    на всех путях, на следующем состоянии каждого пути&lt;br /&gt;
 AG    на всех путях, на каждом состоянии любого пути&lt;br /&gt;
 AF    на всех путях, на некотором будущем состоянии каждого пути&lt;br /&gt;
 EX    на некотором пути, на следующем состоянии пути&lt;br /&gt;
 EG    на некотором пути, на всех состояния пути&lt;br /&gt;
 EF    на некотором пути , на некотором будущем состоянии пути&lt;br /&gt;
 A[U]  на всех путях, в каждом состоянии до определенного состояния пути&lt;br /&gt;
 E[U]  на некотором пути, в каждом состоянии до определенного состояния пути&lt;br /&gt;
&lt;br /&gt;
OBE операторы местонахождения лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.2 OBE операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence are those used to describe&lt;br /&gt;
behavior consisting of a Boolean or a property that holds if another Boolean or property holds. These&lt;br /&gt;
operators are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы со следующим наивысшим приоритетом, это те которые используются для описания поведения, состоящего из Булевых выражений или свойства, которое выполняется, если Булево выражение или другое свойство выполняется. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;   логическая IF импликация&lt;br /&gt;
 &amp;lt;-&amp;gt;  логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
Операторы логической IF и логической IFF импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.4 Макросы ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL provides macro processing capabilities that facilitate the definition of properties. SystemC, VHDL, and&lt;br /&gt;
GDL flavors support cpp pre-processing directives (e.g., #define, #ifdef, #else, #include, and #undef).&lt;br /&gt;
SystemVerilog and Verilog flavors support Verilog compiler directives (e.g., `define, `ifdef, `else, `include,&lt;br /&gt;
and `undef). All flavors also support PSL macros %for and %if, which can be used to conditionally or&lt;br /&gt;
iteratively generate PSL statements. The cpp or Verilog compiler directives shall be interpreted first, and&lt;br /&gt;
PSL %if and %for macros shall be interpreted second.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предоставляет возможность обработки макросов, которые помогают в определении свойств. SystemC, VHDL и&lt;br /&gt;
GDL варианты поддерживают cpp препроцессорные директивы (т.е.  #define, #ifdef, #else, #include и #undef).&lt;br /&gt;
SystemVerilog и Verilog поддерживают директивы Verilog компилятора (т.е. `define, `ifdef, `else, `include и `undef). Все варианты, также поддерживают PSL макросы %for и %if, которые могут использоваться для условно или итеративно генерированного PSL утверждения. Компилированные директивы Verilog или cpp должны быть интерпретированы первыми, макросы PSL %if и %for должны быть интепретированы вторыми &lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.1 Конструкция %for =====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.2 Конструкция %if =====&lt;br /&gt;
&lt;br /&gt;
==== 4.2.5 Комментарии ====&lt;br /&gt;
&lt;br /&gt;
PSL обеспечивает возможность вставки комментариев в PSL спецификацию. Для каждого стиля, возможность комментариев совместима с тем, что обеспечивается соответсвующией средой PSL.&lt;br /&gt;
&lt;br /&gt;
Для SystemC, SystemVerilog, и Verilog стиля, оба варианта блочных комментариев (/* .... */) и (// .... ''&amp;lt;eol&amp;gt;'') поддерживается. (''&amp;lt;eol&amp;gt;'' — конец строки)&lt;br /&gt;
&lt;br /&gt;
Для стиля VHDL, поддерживается комментарии (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Для стиля GDL, оба блочных стилей комментариев поддерживаются: (/* .... */) и (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Syntax ===&lt;br /&gt;
&lt;br /&gt;
==== 4.3.1 Conventions ====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
! Flavor Macro || SystemVerilog || Verilog || VHDL || SystemC ||  GDL&lt;br /&gt;
|-&lt;br /&gt;
| AND_OP || &amp;amp;&amp;amp; || &amp;amp;&amp;amp; || and || &amp;amp;&amp;amp; || &amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| OR_OP || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || or || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NOT_OP || ! || ! || not || ! || !&lt;br /&gt;
|-&lt;br /&gt;
| RANGE_SYM ||  : ||  : ||  to || :|| ..&lt;br /&gt;
|-&lt;br /&gt;
| MIN_VAL || 0 || 0 || 0 || 0 || null&lt;br /&gt;
|-&lt;br /&gt;
| MAX_VAL || $ ||  inf || inf || inf || null&lt;br /&gt;
|-&lt;br /&gt;
| LEFT_SYM || [ || [ || ( || [ || (&lt;br /&gt;
|-&lt;br /&gt;
| RIGHT_SYM || ] || ] || ) || ] || )&lt;br /&gt;
|-&lt;br /&gt;
| DEF_SYM || = || = || is || = || :=&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Semantics ===&lt;br /&gt;
&lt;br /&gt;
The following subclauses introduce various general concepts related to temporal property specification and&lt;br /&gt;
explain how they apply to PSL.&lt;br /&gt;
&lt;br /&gt;
==== 4.4.1 Clocked vs. unclocked evaluation ====&lt;br /&gt;
&lt;br /&gt;
== NEW ==&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	<entry>
		<id>http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)</id>
		<title>PSL/IEEE Standard 1850-2010 for Property Specification Language (PSL)</title>
		<link rel="alternate" type="text/html" href="http://simhard.com/wiki/index.php/PSL/IEEE_Standard_1850-2010_for_Property_Specification_Language_(PSL)"/>
				<updated>2013-10-17T10:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Valentin: /* 4.2.4 Macros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PSL TOC}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. Обзор ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Возможность ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard defines the property specification language (PSL), which formally describes electronic system&lt;br /&gt;
behavior. This standard specifies the syntax and semantics for PSL and also clarifies how PSL interfaces&lt;br /&gt;
with various standard electronic system design languages.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт определяет язык свойств спецификации (PSL), который формально описывает поведение электронных систем. Этот стандарт специфицирует синтаксис и семантику для PSL, а также разъясняет, как PSL взаимодействует с различными стандартами языков описания электронных систем.&lt;br /&gt;
&lt;br /&gt;
===1.2 Назначение===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The purpose of this standard is to provide a well-defined language for formal specification of electronic&lt;br /&gt;
system behavior, one that is compatible with multiple electronic system design languages, including IEEE&lt;br /&gt;
Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), and IEEE Std&lt;br /&gt;
1666TM (SystemC®), to facilitate a common specification and verification flow for multi-language and&lt;br /&gt;
mixed-language designs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Назначение этого стандарта заключается в том, чтобы предоставить четкий язык для формальной спецификации поведения электронных систем, который будет совместим с множеством языков описания электронных систем, включая IEEE Std 1076TM (VHDL®),1 IEEE Std 1364TM (Verilog®), IEEE Std 1800TM (SystemVerilog®), и IEEE Std 1666TM (SystemC®), способствуя общему потоку верификации и спецификации для проектов описанных на разных и смешанных языках.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This standard creates an updated IEEE standard based upon IEEE Std 1850-2005. The updated standard will&lt;br /&gt;
refine IEEE standard, addressing errata, minor technical issues, and proposed extensions specifically related&lt;br /&gt;
to property reuse and improved simulation usability.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот стандарт создает обновленный IEEE стандарт базирующийся на IEEE Std 1850-2005. Обновленный стандарт усовершенствует IEEE стандарт, адресные опечатки, незначительные технические вопросы и предполагаемого расширения непосредственно связанных свойств, для дальнейшего использования и облегчения моделирования.&lt;br /&gt;
       &lt;br /&gt;
==== 1.2.1 Происхождение ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The complexity of Very Large Scale Integration (VLSI) has grown to such a degree that traditional&lt;br /&gt;
approaches have begun to reach their limitations, and verification costs have reached 60%–70% of&lt;br /&gt;
development resources. The need for advanced verification methodology, with improved observability of&lt;br /&gt;
design behavior and improved controllability of the verification process, has become critical. Over the last&lt;br /&gt;
decade, a methodology based on the notion of “properties” has been identified as a powerful verification&lt;br /&gt;
paradigm that can assure enhanced productivity, higher design quality, and, ultimately, faster time to market&lt;br /&gt;
and higher value to engineers and end-users of electronics products. Properties, as used in this context, are&lt;br /&gt;
concise, declarative, expressive, and unambiguous specifications of desired system behavior that are used to&lt;br /&gt;
guide the verification process. IEEE 1850 PSL is a standard language for specifying electronic system&lt;br /&gt;
behavior using properties. PSL facilitates property-based verification using both simulation and formal&lt;br /&gt;
verification, thereby enabling a productivity boost in functional verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Сложность проектов с очень большой степенью интеграции (VLSI) выросла до такого уровня, что традиционные подходы начали достигать своего предела, а издержки верификации достигли 60%-70% от ресурсов разработки. Потребность в более продвинутой методологии верификации, с улучшенной наблюдаемостью  поведения проекта и улучшенной контролируемостью (способностью контроля) процесса верификации, стала критической. За последние 10 лет, методология, базирующаяся на понятии &amp;quot;свойств&amp;quot;, была определена, как мощная парадигма верификации, которая способна обеспечить повышение производительности (эффективности), повышенное качество проекта, и значительно ускорить время выхода на рынок (time to market), увеличить число производителей (higher value to engineers?) и пользователей электронных продуктов. Свойства, используемые в данном контексте, являются краткие, декларативные/описательные (declarative), выразительные/ясные/точные (expressive) и однозначные спецификации желаемого поведения системы, которые используются для проведения процесса верификации. IEEE 1850 PSL стандартный язык для описания (спецификации) поведения электронной системы, используя свойства. PSL облегчает верификацию основанную на свойствах (property-based verification) с использованием как моделирования так и формальной верификации, что позволяет повысить эффективность функциональной верификации.&lt;br /&gt;
&lt;br /&gt;
====1.2.2 Мотивация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Ensuring that a design’s implementation satisfies its specification is the foundation of hardware verification.&lt;br /&gt;
Key to the design and verification process is the act of specification. Yet historically, the process of&lt;br /&gt;
specification has consisted of creating a natural language description of a set of design requirements. This&lt;br /&gt;
form of specification is both ambiguous and, in many cases, unverifiable due to the lack of a standard&lt;br /&gt;
machine-executable representation. Furthermore, ensuring that all functional aspects of the specification&lt;br /&gt;
have been adequately ''verified'' (that is, covered) is problematic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Обеспечение реализации проекта удовлетворяющей его спецификацию, является  основным для верификации аппаратуры. Ключ к проекту и процессу верификации является законом спецификации. Исторически, процесс спецификации состоял из создания языкового описания набора требований к проекту. Эта форма спецификации неоднозначная, и во многих случаях неверифицируема в связи с отсутствием стандарта машинно-выполняемого представления. Кроме того, обеспечение, того чтобы все функциональные аспекты спецификации были адекватно ''верифицированы'' (т.е. покрыты), довольно проблематично.           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The IEEE PSL was developed to address these shortcomings. It gives the design architect a standard means&lt;br /&gt;
of specifying design properties using a concise syntax with clearly-defined formal semantics. Similarly, it&lt;br /&gt;
enables the RTL implementer to capture design intent in a verifiable form, while enabling the verification&lt;br /&gt;
engineer to validate that the implementation satisfies its specification through ''dynamic'' (that is, simulation)&lt;br /&gt;
and ''static'' (that is, formal) verification means. Furthermore, it provides a means to measure the quality of the&lt;br /&gt;
verification process through the creation of functional coverage models built on formally specified&lt;br /&gt;
properties. In addition, it provides a standard means for hardware designers and verification engineers to&lt;br /&gt;
create a rigorous and machine-executable design specification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
IEEE PSL был создан, чтобы устранить эти недостатки. Это дает архитектуре проекта стандарт, означающий спецификацию свойств проекта&lt;br /&gt;
используемых краткий синтаксис с простой формальной семантикой. Аналогичным образом, позволяется RTL-исполнителю определить цели проекта в проверяемых формах, пока разрешается верификации подтвердить, что выполнение окончено и его спецификация определена через ''динамическую'' ( моделирование) и статическую (формальную) верификацию. Более того, он предоставляет средства для определения качества процесса верификации, через создание полной функциональной модели построения на формально специфицированных свойствах. В дополнение, он предоставляет стандартные средства для аппаратуры проекта и инженера верификации при создании строгой и исполняемой машиной спецификации проекта.&lt;br /&gt;
&lt;br /&gt;
====1.2.3 Цели====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL was specifically developed to fulfill the following general hardware functional specification&lt;br /&gt;
requirements:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL был специально создан для исполнения следующих общих аппаратных функциональных требований:&lt;br /&gt;
* Легко обучать, чиать и писать&lt;br /&gt;
* Краткий синтаксис&lt;br /&gt;
* Строго определенная формальная семантика&lt;br /&gt;
* Выразительная мощность, позволяющая специфицировать большие классы реальных проектов&lt;br /&gt;
* Известные эффективные алгоритмы моделирования, такие же как формальная верификация&lt;br /&gt;
&lt;br /&gt;
===1.3 Использование===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is a language for the formal specification of hardware. It is used to describe properties that are required&lt;br /&gt;
to hold in the design under verification. PSL provides a means to write specifications that are both easy to&lt;br /&gt;
read and mathematically precise. It is intended to be used for functional specification on the one hand and as&lt;br /&gt;
input to functional verification tools on the other. Thus, a PSL specification is an executable specification of&lt;br /&gt;
a hardware design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL язык для формальной спецификации аппаратуры. Он используется для описания свойств, которые требуют поддержки в проекте под верификацию. PSL предоставляет средства для написания спецификаций, которые легко читаются и математически точны. Это предназначение используется для функциональной спецификации, с одной стороны, и как вход в программы функциональной верификации, с другой. Таким образом, спецификация PSL - это исполняемая спецификация для аппаратного проекта.&lt;br /&gt;
      &lt;br /&gt;
====1.3.1 Функциональная спецификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can be used to capture requirements regarding the overall behavior of a design, as well as assumptions&lt;br /&gt;
about the environment in which the design is expected to operate. PSL can also capture internal behavioral&lt;br /&gt;
requirements and assumptions that arise during the design process. Both enable more effective functional&lt;br /&gt;
verification and reuse of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL может использоваться для выделения требований относительно общего поведения проекта, также как допущения о среде, в которой ожидается обработка проекта. PSL также может выделять внутреннее поведение требований и допущений, которые возникают в процессе обработки проекта. Доступными являются более эффективная функциональная верификация и продолжения обработки самого проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
One important use of PSL is for documentation, either in place of or along with an English specification. A&lt;br /&gt;
PSL specification can describe simple invariants (for example, signals &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; are never asserted simultaneously) as well as multi-cycle behavior (for example, correct&lt;br /&gt;
behavior of an interface with respect to a bus protocol or correct behavior of pipelined operations).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Один из важных аспектов использования PSL - это использование для документации, как вместо, так и совместно с английской спецификацией. Спецификация PSL может описать простые инварианты (например: сигналы &amp;lt;code&amp;gt;read_enable&amp;lt;/code&amp;gt; и&lt;br /&gt;
&amp;lt;code&amp;gt;write_enable&amp;lt;/code&amp;gt; никогда не используются в одно время), также как многотактовое поведение (например: правильное поведение интерфейса с поддержкой протокола шины или правильное поведение конвейерных операций).  &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification consists of ''assertions'' regarding ''properties'' of a design under a set of ''assumptions''. A&lt;br /&gt;
''property'' is built from three kinds of elements: ''Boolean expressions'', which describe behavior over one cycle;&lt;br /&gt;
''sequential expressions'', which can describe multi-cycle behavior; and ''temporal operators'', which describe&lt;br /&gt;
temporal relationships among Boolean expressions and sequences. For example, consider the following&lt;br /&gt;
Verilog Boolean expression:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL состоит из ''утверждений'' относительно ''свойства'' проекта под набором ''допущений''. ''Свойство'' строится из трех видов элементов: ''Булевы выражения'', которые описывают поведение в одно цикле; ''последовательные выражения'', которые могут описывать многотактовое поведение;  и ''временные операторы'', которые описывают временные взаимоотношения между Булевыми выражениями и последовательностями. Например, Булево выражение в Verilog:&lt;br /&gt;
&lt;br /&gt;
 ena || enb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This expression describes a cycle in which at least one of the signals &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; are asserted. The PSL&lt;br /&gt;
sequential expression&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Это выражение описывает цикл, в котором, по крайней мере, один из сигналов &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен. Последовательное выражение PSL&lt;br /&gt;
&lt;br /&gt;
 {req; ack; !cancel}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
describes a sequence of cycles, such that req is asserted in the first cycle, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; is asserted in the second&lt;br /&gt;
cycle, and &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; is deasserted in the third cycle. The following property, obtained by applying the&lt;br /&gt;
temporal operators &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; to these expressions,&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
описывает последовательность циклов, такую, что если &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; активен в первом цикле, &amp;lt;code&amp;gt;ack&amp;lt;/code&amp;gt; активен во втором цикле, а &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt;  неактивен  в третьем цикле. Следующее свойство получается, применяя временные операторы &amp;lt;code&amp;gt;always&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;|=&amp;gt;&amp;lt;/code&amp;gt; к этим выражениям,&lt;br /&gt;
&lt;br /&gt;
 always {req;ack;!cancel} |=&amp;gt; (ena || enb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
means that always (that is, in every cycle), if the sequence &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt; occurs, then either &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;&lt;br /&gt;
or &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; is asserted one cycle after the sequence ends. Adding the directive &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
это значит, что всегда (в каждом цикле), если встречается последовательность &amp;lt;code&amp;gt;{req;ack;!cancel}&amp;lt;/code&amp;gt;, то либо &amp;lt;code&amp;gt;ena&amp;lt;/code&amp;gt;, либо &amp;lt;code&amp;gt;enb&amp;lt;/code&amp;gt; активен в течение цикла после окончания последовательности. Добавляя директиву &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; следующей:   &lt;br /&gt;
&lt;br /&gt;
 assert always {req;ack;!cancel} |=&amp;gt; (ena || enb);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
completes the specification, indicating that this property is expected to hold in the design and that this&lt;br /&gt;
expectation needs to be verified.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
завершается спецификация, указывая, что это свойство ожидается в проекте и что потребности это ожидания нужно верифицировать.&lt;br /&gt;
  &lt;br /&gt;
====1.3.2 Функциональная верификация====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL can also be used as input to verification tools, for both verification by simulation, as well as formal&lt;br /&gt;
verification using a model checker or a theorem prover. Each of these is discussed in the subclauses that&lt;br /&gt;
follow.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL также может использоваться, как вход для программ верификации, как для верификации моделированием, так и для формальной верификации, используется проверка модели или теоретическое доказательство. Каждый вариант обсуждается в следующих пунктах.&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.1 Моделирование=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
A PSL specification can also be used to automatically generate checks of simulated behavior. This can be&lt;br /&gt;
done, for example, by directly integrating the checks in the simulation tool; by interpreting PSL properties in&lt;br /&gt;
a testbench automation tool that drives the simulator; by generating HDL monitors that are simulated&lt;br /&gt;
alongside the design; or by analyzing the traces produced during simulation.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Спецификация PSL также может использоваться для автоматического генерирования проверок поведения моделирования. Это может быть реализовано, например, прямой интеграцией проверок в программе моделирования; интерпретацией свойств PSL в тестовую автоматизированную программу, которая сопровождает симулятор; генерированием HDL контроллеров, которые моделируются рядом с проектом; или анализом путей пройденных во время моделирования.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  &lt;br /&gt;
For instance, the following PSL property:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Например, следующие PSL свойства:&lt;br /&gt;
&lt;br /&gt;
 Свойство 1: always (req -&amp;gt; next !req)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
states that signal &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; is a pulsed signal, i.e., if it is high in some cycle, then it is low in the following cycle.&lt;br /&gt;
Such a property can be easily checked using a simulation checker written in some HDL that has the&lt;br /&gt;
functionality of the finite state machine (FSM) shown in Figure 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
означает, что сигнал &amp;lt;code&amp;gt;req&amp;lt;/code&amp;gt; пульсирующий сигнал, т.е. если он принимает высокие значения в одном цикле,то он примет низкие значения в следующем цикле. Такое свойство может быть легко проверенно, используя проверки моделирования, написанные на каком-нибудь HDL, который имеет функциональность конечного автомат (FSM), показанный на Рисунке 1. &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig01.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
!Рисунок 1—Простой FSM, который проверяет свойство 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For properties more complicated than the property shown in Figure 1, manually writing a corresponding&lt;br /&gt;
checker is painstaking and error-prone, and maintaining a collection of such checkers for a constantly changing design under development is a time-consuming task. Instead, a PSL specification can be used as input to&lt;br /&gt;
a tool that automatically generates simulatable checkers.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для более сложных свойств, чем то что представлено на рисунке 1, писать вручную соответствующие проверки - это кропотливый труд, подверженный ошибкам, и содержание набора таких проверок для постоянно изменяющегося проекта - это очень трудоемкое задание. Вместо этого, спецификация PSL может использоваться, как вход для программы, которая автоматически генерирует проверки, поддающиеся моделированию.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--     &lt;br /&gt;
Although in principle, all PSL properties can be checked for finite paths in simulation, the implementation&lt;br /&gt;
of the checks is often significantly simpler for a subset called the ''simple subset'' of PSL. Informally, in this&lt;br /&gt;
subset, composition of temporal properties is restricted to ensure that time ''moves forward'' from left to right&lt;br /&gt;
through a property, as it does in a timing diagram. (See 4.4.4 for the formal definition of the simple subset.)&lt;br /&gt;
&lt;br /&gt;
For example, the property&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Хотя в принципе, все свойства PSL могут быть проверены при окончание моделирования, исполнение проверок, часто, значительно проще для подмножеств, называемых ''простые подмножества'' PSL. Неформально, в этих подмножествах, состав временных свойств ограничен для обеспечения того, что бы время ''двигалось вперед'' слева направо через свойство, как это делается на временной диаграмме. (Смотрите 4.4.4 для формального понимания простых подмножеств.)&lt;br /&gt;
&lt;br /&gt;
Например, свойство &lt;br /&gt;
&lt;br /&gt;
 Свойство 2: always (a -&amp;gt; next[3] b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
which states that, if &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is asserted, then &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; is asserted three cycles later, belongs to the simple subset, because&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; appears to the left of b in the property and also appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in the timing diagram of any&lt;br /&gt;
behavior that is not a violation of the property. Figure 2 shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
которое означает, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значения, то &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; примет значение через три цикла, принадлежит простому подмножеству, потому что &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве и, также, появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; на временной диаграмме любой поведенческой модели, что не нарушает свойство. Рисунок 2 показывает пример такой временной диаграммы.  &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig02.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 2—Вариант удовлетворяющий свойство 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
An example of a property that is not in this subset is the property&lt;br /&gt;
&lt;br /&gt;
 Property 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
which states that, if a is asserted and b is asserted three cycles later, then &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; is asserted (in the same cycle as&lt;br /&gt;
&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;). This property does not belong to the simple subset, because although &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; appears to the right of &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in&lt;br /&gt;
the property, it appears to the left of &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; timing diagram that is not a violation of the property. Figure 3&lt;br /&gt;
shows an example of such a timing diagram.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пример свойства не принадлежащего этому подмножеству&lt;br /&gt;
&lt;br /&gt;
 Свойство 3: always ((a &amp;amp;&amp;amp; next[3] b) -&amp;gt; c)&lt;br /&gt;
&lt;br /&gt;
которое значит, что если &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; принимает значение и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; принимает значение через три цикла, то &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; принимает значение в том же цикле, что и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Это свойство не принадлежит простому подмножеству, потому что хотя &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; появляется справа от &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; в свойстве, он появляется слева от &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; на временной диаграмме, и это не нарушает свойство. Рисунок 3 показывает пример такой временной диаграммы.    &lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
! [[Файл:Std psl fig03.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Рисунок 3 3—Вариант, удовлетворяющий свойство 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====1.3.2.2 Формальная верификация=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL is an extension of the standard temporal logics Linear-Time Temporal Logic (LTL) and Computation&lt;br /&gt;
Tree Logic (CTL). A specification in the PSL Foundation Language (respectively, the PSL Optional Branching Extension) can be ''compiled down'' to a formula of pure LTL (respectively, CTL), possibly with some&lt;br /&gt;
auxiliary HDL code, known as a ''satellite''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL это расширение стандарта временной логики Линейной временной логике (LTL) и Вычисляемого логического дерева (CTL). Спецификация  в PSL фундаментального языка (соответственно, PSL дополнительного ветвления) может быть ''скомпилирована'' в виде чистого LTL (соответственно, CTL), возможно с некоторым вспомогательным HDL- кодом, известным, как ''спутник''.&lt;br /&gt;
&lt;br /&gt;
== 3. Определения, сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;--&lt;br /&gt;
For the purposes of this document, the following terms and definitions apply. The IEEE Standards Diction-&lt;br /&gt;
ary: Glossary of Terms &amp;amp; Definitions should be referenced for terms not defined in this clause.6&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Цели этого документа - текущие термины и определения. IEEE словарь стандартов: Cловарь терминов и определений должен ссылаться на условия неопределенные в этом пункте.6 &lt;br /&gt;
&lt;br /&gt;
===3.1 Определения (Definitions) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the terms used in this standard.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет термины, используемые в этом стандарте. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- '''assertion''': A statement that a given property is required to hold and a directive to functional verification&lt;br /&gt;
tools to verify that it does hold.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''утверждение (assertion)''': значит, что данное свойство требуется выполнить и указать программе функциональной верификации, чтобы убедиться, что оно выполняется. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''assumption''': A statement that the design is constrained by the given property and a directive to functional&lt;br /&gt;
verification tools to consider only paths on which the given property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''допущение (assumption)''': значит, что проект ограничен данным свойством и программе функциональной верификации указывается учитывать только тот путь, на котором данное свойство выполняется.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''asynchronous property''': A property whose clock context is equivalent to True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''асинхронное свойство (asynchronous property)''': Свойство, временной контекст которого эквивалентен значению Правда.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
'''behavior''': A path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение (behavior)''': Путь.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''Boolean (expression)''': An expression that yields a logical value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''Булевы (выражения) (Boolean (expression))''': Выражения, которые принимают на выходе логические значения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''checker''': An auxiliary process (usually constructed as a finite state machine) that monitors simulation of a&lt;br /&gt;
design and reports errors when asserted properties do not hold. A checker may be represented in the same&lt;br /&gt;
HDL code as the design or in some other form that can be linked with a simulation of the design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка (checker)''': Вспомогательный процесс (обычно применяемый, как конечный автомат), который проверяет моделирование проекта и сообщения об ошибках, когда утвержденное свойство не выполняется. Проверка может быть представлена в том же HDL-коде, что и проект или в какой-либо другой форме, которая может ссылаться на моделирование проекта.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''completes''': A term used to identify the last cycle of a path that satisfies a sequential expression or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''завершение (completes)''': Термин используемый для определения последнего цикла пути, который удовлетворяет последовательности выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''computation path''': A succession of states of the design, such that the design can actually transition from&lt;br /&gt;
each state on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''вычисленный путь (computation path)''': Правопреемство состояний проекта, такое что проект может актуально переходить из каждого состояния на пути к его преемнику. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''constraint''': A condition (usually on the input signals) that limits the set of behaviors to be considered. A&lt;br /&gt;
constraint may represent real requirements (e.g., clocking requirements) on the environment in which the&lt;br /&gt;
design is used, or it may represent artificial limitations (e.g., mode settings) imposed in order to partition the&lt;br /&gt;
functional verification task.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (constraint)''': Состояние ( обычно для входного сигнала), которое ограничивает набор поведений, которые следует рассматривать. Ограничение может представлять реальные требования (т.е. временные требования) в среде, в которой используется проект, или может представлять искусственные ограничения (т.е. настройки режима) наложенные в порядке разделения задания функциональной верификации.       &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''count''': A number or range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''счетчик (count)''': Число или диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''coverage''': A measure of the occurrence of certain behavior during (typically dynamic) functional&lt;br /&gt;
verification and, therefore, a measure of the completeness of the (dynamic) functional verification process.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''зона покрытия (coverage)''': Мера возникновения определенного поведения в течение (обычно динамическое) функциональной верификации и поэтому расчет сложности (динамического) процесса функциональной верификации.     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''cycle''': An evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''цикл (cycle)''': Оценочный цикл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''describes''': A term used to identify the set of behaviors for which Boolean expression, sequential expression,&lt;br /&gt;
or property holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''описания (describes)''': Термин, используемый для определения набора поведений, для которого Булевы выражения, последовательные выражения или выполняемые свойства.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design''': A model of a piece of hardware, described in some hardware description language (HDL). A design&lt;br /&gt;
typically involves a collection of inputs, outputs, state elements, and combinational functions that compute&lt;br /&gt;
next state and outputs from current state and inputs.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проект (design)''': Модель кусочка аппаратуры, описанная на некотором языке описания аппаратуры (HDL). Проект типично включает в себя набор входов, выходов, элементов состояния и комбинационных функций, которые рассчитывают следующие состояние и выходы из текущего состояния и входов.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''design behavior''': A computation path for a given design.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''поведение проекта (design behavior)''': Рассчитанный путь для данного проекта.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''dynamic verification''': A verification process such as simulation, in which a property is checked over indi-&lt;br /&gt;
vidual, finite design behaviors that are typically obtained by dynamically exercising the design through a&lt;br /&gt;
finite number of evaluation cycles. Generally, dynamic verification supports no inference about whether the&lt;br /&gt;
property holds for a behavior over which the property has not yet been checked.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''динамическая верификация (dynamic verification)''': Процесс верификации, такой как моделирование, в котором свойство проверяется &lt;br /&gt;
отдельно, конечные поведения проекта, которые обычно получаются динамическим проведением проекта через конечное число оценочных циклов. В общем, динамическая верификация не дает вывода о выполняющемся свойстве поведения, через которое свойство еще не было проверено.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--    &lt;br /&gt;
'''evaluation''': The process of exercising a design by iteratively applying values to its inputs, computing its&lt;br /&gt;
next state and output values, advancing time, and assigning to the state variables and outputs their next&lt;br /&gt;
values.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценка (evaluation)''': Процесс проведения проекта итеративным принятием значений на его входы, рассчитывая его следующие состояния и выходные значения, время опережения, и назначение переменных состояний и выходов своих следующих значений.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''evaluation cycle''': One iteration of the evaluation process. At an evaluation cycle, the state of the design is&lt;br /&gt;
recomputed (and may change).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''оценочный цикл (evaluation cycle)''': Одна итерация оценочного процесса. На одном оценочном цикле, состояние проекта пересчитывается ( и может быть изменено). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''extension (of a given path)''': A path that starts with precisely the succession of states in the given path.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''расширения (данного пути) (extension (of a given path))''': Путь, который начинается  с точного правопреемства состояний в данном пути.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* '''False''': An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog flavors, the single bit values 1’b0, 1 ’bx, and 1’bz are interpreted as the logical value False. In the VHDL flavor, the values STD.Standard.Boolean’(False) and STD.Standard.Bit’(‘0’), as well as the values IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’( ‘X’), and IEEE.std_logic_1164.std_logic’(‘Z’) are all interpreted as the logical value False. In the SystemC flavor, the value 'false' of type bool and any integer literal with a numeric value of 0 are interpreted as the logical value False. In the GDL flavor, the Boolean value 'false' and bit value 0B are both interpreted as the logical value False.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''False''' — Интерпритация определённых значений определённых типов в HDL языках. В SystemVerilog и Verilog стилях, битовые значения 1’b0, 1 ’bx, и 1’bz интерпретируются как логическое значение False. В VHDL стиле, значения STD.Standard.Boolean’(False) и STD.Standard.Bit’(‘0’), также как значения IEEE.std_logic_1164.std_logic’( ‘0’), IEEE.std_logic_1164.std_logic’(‘L’), IEEE.std_logic_1164.std_logic’(‘X’), и IEEE.std_logic_1164.std_logic’(‘Z’) все интерпретируются как логическое значение False. В SystemC стиле, значение 'false' типа bool и любой литерал типа integer с числовым значением 0 интерпретируется как значение False. В GDL стиле, значение типа Boolean 'false' и значение типа bit 0B оба интерпретируются как логическое значение False.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''finite range''': A range with a finite high bound.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''конечный диапазон (finite range)''': Диапазон с большой конечной границей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''formal verification''': A functional verification process in which analysis of a design and a property yields a&lt;br /&gt;
logical inference about whether the property holds for all behaviors of the design. If a property is declared&lt;br /&gt;
true by a formal verification tool, no simulation can show it to be false. If the property does not hold for all&lt;br /&gt;
behaviors, then the formal verification process should provide a specific counterexample to the property, if&lt;br /&gt;
possible.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''формальная верификация (formal verification)''': Процесс функциональной верификации, в котором анализ дизайна и выхода свойства логически разъясняет о выполняемое свойство для все поведений проекта. Если свойство продекларировано значение &amp;quot;правда&amp;quot; программой формальной верификации, моделирование не может сделать его значение &amp;quot;ложным&amp;quot;. Если свойство не выполняется для каждого поведения, то процесс формальной верификации должен предоставить специфический контрпример свойства, если это возможно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''functional verification''': The process of confirming that, for a given design and a given set of constraints, a&lt;br /&gt;
property that is required to hold in that design actually does hold under those constraints.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''функциональная верификация (functional verification)''': Процесс подтверждения того, что для данного проекта и данного набора ограничений, свойство, которое требует выполнение в этом проекте, действительно выполняется в соответствие с данными ограничениями.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds''': A term used to talk about the meaning of a Boolean expression, sequential expression, or property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''исполнение (holds)''': Термин используемый для разъяснения значения Булевых выражений, последовательных выражений или свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''holds tightly''': A term used to talk about the meaning of a sequential expression. Sequential expressions are&lt;br /&gt;
evaluated over finite paths (behavior).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''обязательное исполнение(holds tightly)''': Термин используемый для разъяснения значения последовательных выражений. Последовательные выражения оцениваются на конечной стадии (поведение). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''liveness property''': A property that specifies an eventuality that is unbounded in time. Loosely speaking, a&lt;br /&gt;
liveness property claims that “something good” eventually happens. More formally, a liveness property is a&lt;br /&gt;
property for which any finite path can be extended to a path satisfying the property. For example, the prop-&lt;br /&gt;
erty “whenever signal req is asserted, signal ack is asserted some time in the future” is a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''живучие свойства (liveness property)''': Свойства, которые указывают на случайность, которая не ограничена во времени. Грубо говоря, живучие свойства утверждает, что что-то “хорошее” в конечном счете произошло. Более формально, живучие свойство - это свойство, для которого любая конечная стадия может быть продолжена до стадии удовлетворения свойства. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через некоторое время” это живучие свойство. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logic type''': An HDL data type that includes values that are interpreted as logical values. A logic type may&lt;br /&gt;
also include values that are not interpreted as logical values. Such a logic type usually represents a multi-val-&lt;br /&gt;
ued logic.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логический тип (logic type)''': Тип данных HDL, который включает значения, которые интерпретируются, как логические значения. Логический тип, также, включает значения, которые не интерпретируются, как логические значения. Как логический тип, обычно, представляет многозначную логику.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''logical value''': A value in the set {True, False}.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''логическое значение (logical value)''': Значение из набора {True, False}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''model checking''': A type of formal verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''проверка на модели (model checking)''': Тип формальной верификации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''number''': A non-negative integer value, and a statically computable expression yielding such a value.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''число (number)''': Неотрицательное целочисленное значение, и статично подсчитанное выражение полученное, как выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurs''': A term used to indicate that a Boolean expression holds in a given cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
''' (occurs)''': Термин используемый для индикации того, что Булево выражение выполняется в данном цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''occurrence (of a Boolean expression)''': A cycle in which the Boolean expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''occurrence (of a Boolean expression)''': Цикл, в котором выполняется Булево выражение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''path''': A succession of states of the design, whether or not the design can actually transition from one state&lt;br /&gt;
on the path to its successor.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''стадия (путь) (path)''': Правопреемственность состояний проекта, ??? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive count''': A positive number or a positive range.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный счетчик (positive count)''': Положительное число или положительный диапазон.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive number''': A number that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительное число (positive number)''': Число, которое больше нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''positive range''': A range with a low bound that is greater than zero (0).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''положительный диапазон (positive range)''': Диапазон с нижней границей большей нуля (0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''prefix (of a given path)''': A path of which the given path is an extension.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''префикс (данной стадии) (prefix (of a given path))''': Стадия в которую расширяется данная стадия.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''property''': A collection of logical and temporal relationships between and among subordinate Boolean&lt;br /&gt;
expressions, sequential expressions, and other properties that in aggregate represent a set of behaviors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство (property)''': Набор логических и временных взаимоотношений между и среди подчиненных Булевых выражений, последовательных выражений и других свойств, которые в совокупности представляют набор поведений.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''range''': A series of consecutive numbers, from a low bound to a high bound, inclusive, such that the low&lt;br /&gt;
bound is less than or equal to the high bound. In particular, this includes the case in which the low bound is&lt;br /&gt;
equal to the high bound. Also, a pair of statically computable integer expressions specifying such a series of&lt;br /&gt;
consecutive numbers, where the left expression specifies the low bound of the series, and the right expression specifies the high bound of the series. A range may describe a set of values or a variable number of&lt;br /&gt;
cycles or event repetitions.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''диапазон (range)''': Набор последовательных чисел, от нижней до верней границы, включительно, такой, что нижняя граница меньше или равна верхней. В частности, это предполагает случай, в котором нижняя граница эквивалентна верхней. Также, пара статически подсчитанных целочисленных выражений представляются, как наборы последовательных чисел, где левая выражения является нижней границей, а правое выражение верхней границей набора. Диапазон может описывать набор значении и переменное число циклов или повторяющихся событий.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''restriction''': A statement that the design is constrained by the given sequential expression and a directive to&lt;br /&gt;
functional verification tools to consider only paths on which the given sequential expression holds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''ограничение (restriction)''': Утверждение, что проект ограничивается данным последовательным выражением, и директива программе функциональной верификации рассматривать только стадию, на которой выполняется данное последовательное выражение.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''safety property''': A property that specifies an invariant over the states in a design. The invariant is not necessarily limited to a single cycle, but it is bounded in time. Loosely speaking, a safety property claims that&lt;br /&gt;
“something bad” does not happen. More formally, a safety property is a property for which any path&lt;br /&gt;
violating the property has a finite prefix such that every extension of the prefix violates the property. For&lt;br /&gt;
example, the property, “whenever signal req is asserted, signal ack is asserted within 3 cycles” is a safety&lt;br /&gt;
property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''защищенное свойство (safety property)''': Свойство, которое указывает инвариантность по состояниям в проекте. Инвариантность - это необязательно ограниченность в один цикл, но ограниченность по времени. Грубо говоря, защищенное свойство показывает, что ничего “плохого” не произошло. Более формально, защищенное свойство - это свойство, для которого любая стадия имеющая навязывающееся свойство получает конечный префикс, такой ,что каждое расширение префикса навязывается свойству. Например, свойство “когда-либо сигнал req принимает значение, сигнал ack принимает значение через три цикла”, является защищенным свойством.    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequence''': A sequential expression that may be used directly within a property or directive.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательность (sequence)''': Последовательное выражение, которое может напрямую использоваться в течение свойства или директивы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''sequential expression''': A finite series of terms that represent a set of behaviors.&lt;br /&gt;
sequential extended regular expression: A form of sequential expression, and a component of a sequence.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''последовательное выражение (sequential expression)''': Законченный набор терминов, который представляет набор поведений.&lt;br /&gt;
&lt;br /&gt;
'''последовательные регулярно расширяемые выражения (sequential extended regular expression)''': Форма последовательных выражений и компонентов последовательностей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''starts''': A term used to identify the first cycle of a path that satisfies a sequential expression.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''начало (starts)''': Термин используемый для идентификации первого цикла пути, который удовлетворяет последовательное выражение. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strictly before''': Before, and not in the same cycle as.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''строго перед (strictly before)''': Перед, и не в этом же цикле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''strong operator''': A temporal operator, the non-negated use of which usually creates a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''сильный оператор (strong operator)''': Временной оператор, неотрицательное использование которого, обычно, создает живучие свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal expression''': An expression that involves one or more temporal operators.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временное выражение (temporal expression)''': Выражение, которое включает один или более временных операторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''temporal operator''': An operator that represents a temporal (i.e., time-oriented) relationship between its&lt;br /&gt;
operands.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''временной оператор (temporal operator)''' Оператор, который представляет временные ( т.е. ориентированные во времени) взаимоотношения между операндами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating condition''': A Boolean expression, the occurrence of which causes a property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''условие завершения (terminating condition)''': Булево выражение, появление которого, приводит к завершению свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''terminating property''': A property that, when it holds, causes another property to complete.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''свойство завершения (terminating property)''': Свойство, выполнение которого, приводит к завершению другого свойства.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
True: An interpretation of certain values of certain data types in an HDL. In the SystemVerilog and Verilog&lt;br /&gt;
flavors, the single bit value 1'b1 is interpreted as the logical value True. In the VHDL flavor, the values&lt;br /&gt;
STD.Standard.Boolean'(True), STD.Standard.Bit'('1'),&lt;br /&gt;
IEEE.std_logic_1164.std_logic'('1'), and IEEE.std_logic_1164.std_logic'('H')&lt;br /&gt;
interpreted as the logical value True. In the SystemC flavor, the value 'true' of type bool and any integer&lt;br /&gt;
literal with a non-zero numeric value are interpreted as the logical value True. In the GDL flavor, the Boolean value 'true' and bit value 1B are both interpreted as the logical value True.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* '''True''': Интерпритация определённых значений определённых типов в HDL языках. &lt;br /&gt;
** В SystemVerilog и Verilog стилях, битовые значение  1'b1 интерпретируется как логическое значение True. &lt;br /&gt;
** В VHDL стиле, значения STD.Standard.Boolean'(True), STD.Standard.Bit'('1'), IEEE.std_logic_1164.std_logic'('1'), и IEEE.std_logic_1164.std_logic'('H') интерпретируются как логическое значение True.&lt;br /&gt;
** В SystemC стиле, значение 'true' типа bool и любой литерал типа integer  с ненулевым числовым значением интерпретируется как логическое значение True.&lt;br /&gt;
** В GDL стиле, значение типа Boolean 'true' и значение типа bit 1B интерпретируются как логическое значение True.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''unknown value''': A value of a (multi-valued) logic type, other than 0 or 1.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''неизвестное значение (unknown value)''': Значение (многозначного) логического типа, отличное от 0 и 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
'''weak operator''': A temporal operator, the non-negated use of which does not create a liveness property.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''слабый оператор (weak operator)''': Временной оператор, неотрицательное использование которого не создает живучего свойства.&lt;br /&gt;
&lt;br /&gt;
== 3.2 Сокращения и аббревиатуры ==&lt;br /&gt;
&lt;br /&gt;
* ABV — утверждения, базирующиеся на верификации&lt;br /&gt;
* BNF — расширенная форма Бакуса-Наура&lt;br /&gt;
* cpp — C препроцессор&lt;br /&gt;
* CTL — вычисляемое логическое дерево&lt;br /&gt;
* EDA — авторматизация проектирования&lt;br /&gt;
* FL — фундаметальный язык&lt;br /&gt;
* FSM — конечный автомат&lt;br /&gt;
* GDL — общий язык описания&lt;br /&gt;
* HDL — язык описания аппаратуры&lt;br /&gt;
* iff — если, и только если&lt;br /&gt;
* LTL — линейная временная логика&lt;br /&gt;
* PSL — язык спецификации свойств&lt;br /&gt;
* OBE — дополнительное расширение ветвления&lt;br /&gt;
* RTL — уровень регистровых передач&lt;br /&gt;
* SERE — последовательное расширенное регулярное выражение&lt;br /&gt;
* VHDL — VHSIC язык описания аппаратуры&lt;br /&gt;
* VHSIC — высоко скоростная интегральная схема&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 4.1.1 Слои (Layers) ====&lt;br /&gt;
PSL состоит из четырёх слоёв: булевый (Boolean), временной (temporal), верификационный (verification), и модельный (modeling).&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.1 Булевый слой (Boolean layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The Boolean layer is used to build expressions that are, in turn, used by the other layers. Although it contains&lt;br /&gt;
expressions of many types, it is known as the Boolean layer because it is the supplier of Boolean&lt;br /&gt;
expressions to the heart of the language—the temporal layer. Boolean layer expressions are evaluated in a&lt;br /&gt;
single evaluation cycle.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Булевый слой используется для создания выражений, которые, в свою очередь, используются другими слоями. Хотя этот слой содержит выражения над многими типами, он называется как булевый слой, потому что он является поставщиком булевых (логических) выражений для основы (сердца)  языка — временнОго слоя. Выражения булевого слоя выполняются в едином (одиночном) цикле выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.2 ВременнОй слой (Temporal layer) =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
The temporal layer is the heart of the language; it is used to describe properties of the design. It is known as&lt;br /&gt;
the temporal layer because, in addition to simple properties, such as “signals a and b are mutually&lt;br /&gt;
exclusive,” it can also describe properties involving complex temporal relations between signals, such as, “if&lt;br /&gt;
signal c is asserted, then signal d shall be asserted before signal e is asserted, but no more than eight clock&lt;br /&gt;
cycles later.” Temporal expressions are evaluated over a series of evaluation cycles.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Временной слой является основой языка; он используется для описания свойств проекта. Он называется временным, потому что, в дополнение к простым свойствам, таким как &amp;quot;сигналы a и b являются взаимноисключающими&amp;quot;, он может также описывать свойства включающие сложные временные отношения между сигналами, например &amp;quot;если сигнал c устанавливается, тогда сигнал d должен установиться прежде, чем сигнал e установится, но не позже более восьми периодов синхросигнала&amp;quot;. ВременнЫе выражения выполняются в течении серии циклов выполнения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.3 Верификационный слой (Verification layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The verification layer is used to tell the verification tools what to do with the properties described by the&lt;br /&gt;
temporal layer. For example, the verification layer contains directives that tell a tool to verify that a property&lt;br /&gt;
holds or to check that a specified sequence is covered by some test case.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Верификационный слой используется для того чтобы сказать верификационному инструменту (САПР), что делать с свойствами описанными во временном слое. Например, верификационный слой включает директивы, которые говорят инструменту (САПР) чтобы верифицировал (verify) то, что свойство удерживает (hold) или  проверил (check) то, что заданная последовательность покрыта некоторым тестирующим случаем.&lt;br /&gt;
&lt;br /&gt;
===== 4.1.1.4 Моделирующий слой (Modeling layer) =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The modeling layer is used to model the behavior of design inputs (for tools, such as formal verification&lt;br /&gt;
tools, which do not use test cases) and to model auxiliary hardware that is not part of the design, but is&lt;br /&gt;
needed for verification.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Моделирующий слой (Modeling layer) используется для моделирования поведения входов проекта (для инструментов (САПР), таких как инструменты (САПР) для формальной верификации, которые не используют тестов) и для моделирования дополнительной аппаратуры, которая не является частью проекта, но необходима для верификации.&lt;br /&gt;
&lt;br /&gt;
==== 4.1.2 Стили/Варианты (Flavors) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL comes in five flavors: one for each of the hardware description languages SystemVerilog, Verilog,&lt;br /&gt;
VHDL, SystemC, and GDL. The syntax of each flavor conforms to the syntax of the corresponding HDL in&lt;br /&gt;
a number of specific areas—a given flavor of PSL is compatible with the corresponding HDL’s syntax in&lt;br /&gt;
those areas.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идёт с пятью вариантами/стилями (flavors): один для каждого HDL языка SystemVerilog, Verilog, VHDL, SystemC, и GDL. Синтаксис каждого варианта (стиля) соответствует синтаксису соответствующего HDL языка в ряде конкретных областей — данный стиль PSL совместим с соответствующим синтаксисом HDL-языка в этой области.&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Влияние стиля на слои PSL&lt;br /&gt;
!rowspan=2| Слой ||colspan=5 | HDL&lt;br /&gt;
|-&lt;br /&gt;
!  SystemVerilog || Verolog || VHDL || SystemC || GDL&lt;br /&gt;
|-&lt;br /&gt;
| Булевый || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Модельный  || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} || {{V|16px}} &lt;br /&gt;
|-&lt;br /&gt;
| Временной || i:j || i:j || i to j || i:j ||  i..j&lt;br /&gt;
|-&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Лексическая структура ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This subclause defines the identifiers, keywords, operators, macros, and comments used in PSL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Этот подпункт определяет идентификаторы, ключевые слова, операторы, макросы и комментарии, используемые в PSL.&lt;br /&gt;
 &lt;br /&gt;
==== 4.2.1 Идентификаторы (Identifiers) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Identifiers in PSL consist of an alphabetic character, followed by zero or more alphanumeric characters;&lt;br /&gt;
each subsequent alphanumeric character may optionally be preceded by a single underscore character.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Идентификаторы в PSL состоят из символа латинского алфавита, за которым следует ноль или более символов латинского алфавита; каждый последующий символ алфавита может по желанию предшествовать одному символу подчеркивания. Например:&lt;br /&gt;
&lt;br /&gt;
 mutex&lt;br /&gt;
 Read_Transaction&lt;br /&gt;
 L_123&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PSL identifiers are case-sensitive in the SystemVerilog, Verilog, and SystemC flavors and case-insensitive in&lt;br /&gt;
the VHDL and GDL flavors.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL идентификаторы являются чувстительными к регистру в SystemVerilog, Verilog, и SystemC вариантах/стилях и не чувствительными к регистру в VHDL и GDL вариантах.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.2 Ключевые слова ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;poem&amp;gt; A&lt;br /&gt;
 E&lt;br /&gt;
 next!&lt;br /&gt;
 rose&lt;br /&gt;
AF&lt;br /&gt;
 EF&lt;br /&gt;
 next_a&lt;br /&gt;
AG&lt;br /&gt;
 EG&lt;br /&gt;
 next_a!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; sequence&lt;br /&gt;
AX&lt;br /&gt;
abort&lt;br /&gt;
 EX&lt;br /&gt;
 next_e&lt;br /&gt;
 stable&lt;br /&gt;
always&lt;br /&gt;
 ended&lt;br /&gt;
 next_e!&lt;br /&gt;
string&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;anda&lt;br /&gt;
 eventually!&lt;br /&gt;
 next_event&lt;br /&gt;
 strong&lt;br /&gt;
assert&lt;br /&gt;
 next_event!&lt;br /&gt;
 sync_abort&lt;br /&gt;
assume&lt;br /&gt;
 F&lt;br /&gt;
 next_event_a&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;async_abort&lt;br /&gt;
fairness&lt;br /&gt;
 next_event_a!&lt;br /&gt;
 toe&lt;br /&gt;
before&lt;br /&gt;
 fell&lt;br /&gt;
 next_event_e&lt;br /&gt;
before!&lt;br /&gt;
 for&lt;br /&gt;
 next_event_e!&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; U&lt;br /&gt;
before!_&lt;br /&gt;
 forall&lt;br /&gt;
 nondet&lt;br /&gt;
 union&lt;br /&gt;
before_&lt;br /&gt;
 nondet_vector&lt;br /&gt;
 until&lt;br /&gt;
bitvector&lt;br /&gt;
 bit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; G&lt;br /&gt;
 notc&lt;br /&gt;
 until!&lt;br /&gt;
boolean&lt;br /&gt;
 numeric&lt;br /&gt;
 until!_&lt;br /&gt;
hdltype&lt;br /&gt;
until_&lt;br /&gt;
clock&lt;br /&gt;
 onehot&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt;const&lt;br /&gt;
 in&lt;br /&gt;
 onehot0&lt;br /&gt;
 vmode&lt;br /&gt;
countones&lt;br /&gt;
 inf&lt;br /&gt;
 ord&lt;br /&gt;
 vpkg&lt;br /&gt;
cover&lt;br /&gt;
 inherit&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; vprop&lt;br /&gt;
isb&lt;br /&gt;
 property&lt;br /&gt;
 vunit&lt;br /&gt;
default&lt;br /&gt;
 isunknown&lt;br /&gt;
 prev&lt;br /&gt;
W&lt;br /&gt;
report&lt;br /&gt;
mutable&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
| &amp;lt;poem&amp;gt; within&lt;br /&gt;
restrict&lt;br /&gt;
restrict!&lt;br /&gt;
never&lt;br /&gt;
 X&lt;br /&gt;
next&lt;br /&gt;
 X!&amp;lt;/poem&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*a and is a keyword only in the VHDL flavor; see the flavor macro AND_OP (4.3.2.6).&lt;br /&gt;
*b is is a keyword only in the VHDL flavor; see the flavor macro DEF_SYM (4.3.2.9).&lt;br /&gt;
*c not is a keyword only in the VHDL flavor; see the flavor macro NOT_OP (4.3.2.6).&lt;br /&gt;
*d or is a keyword only in the VHDL flavor; see the flavor macro OR_OP (4.3.2.6).&lt;br /&gt;
*e to is a keyword only in the VHDL flavor; see the flavor macro RANGE_SYM (4.3.2.7).&lt;br /&gt;
&lt;br /&gt;
==== 4.2.3 Операторы ====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.1 Операторы HDL языка =====&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
For a given flavor of PSL, the operators of the underlying HDL have the highest precedence. In particular,&lt;br /&gt;
this includes logical, relational, and arithmetic operators of the HDL. The HDL’s logical operators for&lt;br /&gt;
negation, conjunction, and disjunction of Boolean values may be used in PSL for negation, conjunction, and&lt;br /&gt;
disjunction of properties as well. In such applications, those operators have their usual precedence and&lt;br /&gt;
associativity, as if the PSL properties that are operands produced Boolean values of a type appropriate to the&lt;br /&gt;
logical operators native to the HDL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для заданного стиля PSL, операторы основного HDL языка имеют наивысший преоритет. В частности это включает логические, арифметические операторы и операторы отношения языка HDL. Логические операции HDL языка для отрицания,  конъюнкции и дизъюнкции булевых (логических) значений могут использоваться в PSL для отрицания, конъюнкции и дизъюнкции свойств. В таких приложениях, эти операторы имеют их обычный приоритет и ассоциативность, как если бы PSL свойства,....&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.2 Операторы фундаментального языка =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Various operators are available in PSL. Each operator has a precedence relative to other operators. In&lt;br /&gt;
general, operators with a higher relative precedence are associated with their operands before operators with&lt;br /&gt;
a lower relative precedence. If two operators with the same precedence appear in sequence, then the&lt;br /&gt;
operators are associated with their operands according to the associativity of the operators. Left-associative&lt;br /&gt;
operators are associated with operands in left-to-right order of appearance in the text; right-associative&lt;br /&gt;
operators are associated with operands in right-to-left order of appearance in the text.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Различные операторы доступны в PSL. Каждый оператор имеет приоритет по отношению к другим операторам. В общем операторы с большим приоритетом получают доступ к свои операндам, раньше, чем операнды с меньшим приоритетом. Если два оператора имеют одинаковый приоритет и появляются в последовательности, то они получают доступ к свои операндам в соответствие с ассоциативностью операторов. Лева-ассоциативные оператор получает доступ к своим операндам слева на право в порядке появления в тексте, право-ассоциативные операторы получают доступ к своим операндам справа на лева в порядке появления в тексте.   &lt;br /&gt;
 &lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица приоритетов и ассоциативности двух операторов фундаментального языка  &lt;br /&gt;
|-&lt;br /&gt;
! Оператор класс || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| ''(наивысший приоритет)''&lt;br /&gt;
&lt;br /&gt;
HDL операторы&lt;br /&gt;
| ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор объединения || left || union ||&lt;br /&gt;
|-&lt;br /&gt;
| Оператор времени || left || @ ||&lt;br /&gt;
|-&lt;br /&gt;
| SERE повторяющийся оператор || left || [* ] [+] [= ] [-&amp;gt; ] ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный предельный оператор || left || within ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор И || left || &amp;amp; || &amp;amp;&amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор ИЛИ || left || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор слияния || left || : ||&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор конкатенации || left || ; ||&lt;br /&gt;
|-&lt;br /&gt;
|  Операторы прерывания фундаментального языка || left || abort &amp;lt;br/&amp;gt; sync_abort || async_abort&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, указывающие местонахождение || right || next* || eventually!&lt;br /&gt;
|-&lt;br /&gt;
| || || X   X! || F&lt;br /&gt;
|-&lt;br /&gt;
| Операторы фундаментального языка, показывающие границы ||  right ||  U ||  W&lt;br /&gt;
|-&lt;br /&gt;
| || || until* || before*&lt;br /&gt;
|-&lt;br /&gt;
| Последовательный оператор импликации ||  right || &amp;lt;nowiki&amp;gt;|-&amp;gt;&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|=&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булевы операторы импликации || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Неизменные операторы фундаментального языка &amp;lt;br/&amp;gt; ''(низший приоритет)'' || right || always &amp;lt;br/&amp;gt; G || never&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 NOTE—The notation next* represents the next family of operators, which includes the operators next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a!, and&lt;br /&gt;
 next_event_e!. The notation until* represents the until family of operators, which includes the operators until,&lt;br /&gt;
 until!, until_, and until!_. The notation before* represents the before family of operators, which includes&lt;br /&gt;
 the operators before, before!, before_, and before!_.7&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
 Примечание - Обозначение next* представляет семейство next-операторов, которое включает операторы: next, next!,&lt;br /&gt;
 next_a, next_a!, next_e, next_e!, next_event, next_event!, next_event_a! и&lt;br /&gt;
 next_event_e!. Обозначение until* представляет семейство until-операторов, которое включает операторы: until,&lt;br /&gt;
 until!, until_ и until!_. Обозначение before* представляет семейство before-операторов, которое включает операторы: before, before!, before_, and before!_.7&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.1 Объединительные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence after the HDL operators is that used to indicate a non-deterministic expression:&lt;br /&gt;
&lt;br /&gt;
 union   union operator&lt;br /&gt;
&lt;br /&gt;
The union operator is left-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL оператор со следующим наибольшим приоритетом после HDL операторов является тот, который используется для обозначения недетерминированного выражения:&lt;br /&gt;
&lt;br /&gt;
 union   union оператор&lt;br /&gt;
&lt;br /&gt;
Оператор union является лева-ассоциативным.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.2 Операторы времени ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the clocking operator, which is&lt;br /&gt;
used to associate a clock expression with a property or sequence:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это оператор времени, который используется для связи временного выражения со свойством или последовательностью:&lt;br /&gt;
&lt;br /&gt;
 @   clock event&lt;br /&gt;
&lt;br /&gt;
Временной оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.3 SERE операторы повторов (repetition operators) ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For any flavor of PSL, the FL operators with the next highest precedence are the repetition operators, which&lt;br /&gt;
are used to construct Sequential Extended Regular Expressions (SEREs). These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого стиля PSL, FL операторы со следующим наибольшим приоритетом являются операторами повторов, которые используются для создания последовательных расширенных регулярных выражений (Sequential Extended Regular Expressions — SEREs). Эти операторы следующие:&lt;br /&gt;
&lt;br /&gt;
 [* ]   последовательное повторение (consecutive repetition)&lt;br /&gt;
 [+]    последовательное повторение (consecutive repetition)&lt;br /&gt;
 [= ]   не последовательное повторение (non-consecutive repetition)&lt;br /&gt;
 [-&amp;gt; ]  goto repetition&lt;br /&gt;
&lt;br /&gt;
SERE операторы повторения являются лева-ассоциативными.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.4 Последовательный предельный оператор ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence within operator,&lt;br /&gt;
which is used to describe behavior in which one sequence occurs during the course of another, or within a&lt;br /&gt;
time-bounded interval:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный предельный оператор, который используется для описания поведения, в котором одна последовательность появляется в ходе другой, или в пределах интервала ограниченного временем.&lt;br /&gt;
&lt;br /&gt;
 within    последовательность within оператор&lt;br /&gt;
&lt;br /&gt;
Последовательный предельный оператор лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.5 Последовательные операторы конъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the sequence conjunction&lt;br /&gt;
operators, which are used to describe behavior consisting of parallel paths. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетов - это последовательные операторы конъюнкции, которые описывают поведение состоящие из параллельных стадий. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;    последовательная конъюнкция без сопоставления длинны&lt;br /&gt;
 &amp;amp;&amp;amp;   последовательная конъюнкция с сопоставлением длины&lt;br /&gt;
&lt;br /&gt;
Последовательные операторы конъюнкции лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.6 Последовательный оператор дизъюнкции ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence disjunction operator,&lt;br /&gt;
which is used to describe behavior consisting of alternative paths:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор дизъюнкции, который используются для описания поведения состоящего из альтернативных стадий:&lt;br /&gt;
&lt;br /&gt;
 |    последовательная дизъюнкция&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор дизъюнкции лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.7 Последовательный оператор слияния ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence fusion operator,&lt;br /&gt;
which is used to describe behavior in which a later sequence starts in the same cycle in which an earlier&lt;br /&gt;
sequence completes:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального языка со следующим наивысшим приоритетом - это последовательный оператор слияния, который используется для описания поведения, в котором более поздняя последовательность начинает выполняться в том же цикле, в котором заканчивает выполняться более ранняя.&lt;br /&gt;
&lt;br /&gt;
 :    последовательное слияние&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор слияния лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.8 Последовательный оператор конкатенации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operator with the next highest precedence is the sequence concatenation&lt;br /&gt;
operator, which is used to describe behavior in which one sequence is followed by another:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, оператор фундаментального со следующим наивысшим приоритетом - это последовательный оператор конкатенации, который используется, чтобы описывать поведение, в котором одна последовательность следует за другой:&lt;br /&gt;
&lt;br /&gt;
 ;    последовательная конкатенация&lt;br /&gt;
&lt;br /&gt;
Последовательный оператор конкатенации лева-ассоциативный.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.9 Операторы прерывания фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are the FL termination operators,&lt;br /&gt;
which are used to describe behavior in which a condition causes both current and future obligations to be&lt;br /&gt;
canceled:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом - это операторы прерывания фундаментального языка, которые используются для описания поведения, в котором условие вызывает текущие и будущие процессы, которые будут прерваны:&lt;br /&gt;
&lt;br /&gt;
 sync_abort    немедленное завершение текущего и следующего процесса, синхронизовано по времени&lt;br /&gt;
 async_abort   немедленное прерывание текущего и следующего процесса, независт от времени&lt;br /&gt;
 abort         эквивалентно to async_abort&lt;br /&gt;
&lt;br /&gt;
Операторы прерывания фундаментального языка лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.10 Операторы местонахождения фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which an operand holds in the future. These operators are as follows:&lt;br /&gt;
eventually! the right operand holds at some time in the indefinite future&lt;br /&gt;
 next*     the right operand holds at some specified future time or range of future times&lt;br /&gt;
FL occurrence operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором операнды используются в будущем. Это следующие операторы: &lt;br /&gt;
eventually! правый операнд выполняется через некоторое время в неопределенном будущем&lt;br /&gt;
 next*     правый операнд выполняется в некотором специфицированном будущем времени или диапазоне будущего времени&lt;br /&gt;
операторы местонахождения фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.11 Граничные операторы ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which one property holds in some cycle or in all cycles before another property holds. These operators are&lt;br /&gt;
as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые описывают поведение, в котором одно свойство выполняется в некотором цикле или во всех циклах перед выполнением следующего слова. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
until*     левый операнд выполняется в любое время до выполнения правого операнда &lt;br /&gt;
before*    левый операнд выполняется через некоторое время после выполнения правого&lt;br /&gt;
&lt;br /&gt;
Граничные операторы фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.12 Суффиксные операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a property that holds at the end of a given sequence. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из свойства, которое выполняется в конце данной последовательности. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 |-&amp;gt;    суффиксная импликация с перекрытием&lt;br /&gt;
 |=&amp;gt;    суффиксная импликация без перекрытия&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The suffix implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы суффиксной импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
NOTE—The FL Property {r} (f) is an alternative form for (and has the same semantics as) the FL Property {r} |-&amp;gt; f.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Примечание - Свойство фундаментального языка {r} (f) - это альтернативная форма (и имеет такую же семантику) для свойства фундаментального языка {r} |-&amp;gt; f.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.13 Операторы логической импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
consisting of a Boolean, a sequence, or a property that holds if another Boolean, sequence, or property holds.&lt;br /&gt;
These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторый фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, состоящего из Булевых выражений, последовательности или свойства, которое выполняется, если выполняется другое Булево выражение, последовательность или свойство.  &lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;    логическая IF импикация&lt;br /&gt;
 &amp;lt;-&amp;gt;   логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The logical IF and logical IFF implication operators are right-associative.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Операторы логической импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.2.14 Операторы неизменности фундаментального языка ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the FL operators with the next highest precedence are those used to describe behavior&lt;br /&gt;
in which a property does or does not hold, globally. These operators are as follows:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, операторы фундаментального языка со следующим наивысшим приоритетом те, которые используются для описания поведения, в котором выполняется или не выполняется глобально. &lt;br /&gt;
&lt;br /&gt;
 always   правый операнд выполняется глобально&lt;br /&gt;
 never    правый операнд не выполняется глобально&lt;br /&gt;
&lt;br /&gt;
Операторы неизменности фундаментального языка право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
===== 4.2.3.3 Операторы дополнительного расширенного ветвления (OBE) =====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
|+ Таблица 3—OBE оператор, приоритет и ассоциативность&lt;br /&gt;
|-&lt;br /&gt;
! Класс оператора || Ассоциативность ||colspan=2| Операторы&lt;br /&gt;
|-&lt;br /&gt;
| (наивысший приоритет)&amp;lt;br/&amp;gt;HDL операторы || || ||&lt;br /&gt;
|-&lt;br /&gt;
| OBE операторы местонахождения ||left ||  AX AG AF&amp;lt;br/&amp;gt; A [ U ] || EX EG EF &amp;lt;br/&amp;gt;E [ U ]&lt;br /&gt;
|-&lt;br /&gt;
| Операторы Булевой импликации&amp;lt;br/&amp;gt;(низший приоритет) || right || -&amp;gt; || &amp;lt;-&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.1 OBE операторы местонахождения ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence after the HDL operators are&lt;br /&gt;
those used to specify when a subordinate property is required to hold, if the parent property is to hold. These&lt;br /&gt;
operators include the following:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы являются следующими операторами с наивысшим приоритетом, после HDL операторов, они используются для указания, когда подчиненное свойство должно выполняться, если выполняется старшее свойство. Это следующие операторы:   &lt;br /&gt;
&lt;br /&gt;
 AX    на всех путях, на следующем состоянии каждого пути&lt;br /&gt;
 AG    на всех путях, на каждом состоянии любого пути&lt;br /&gt;
 AF    на всех путях, на некотором будущем состоянии каждого пути&lt;br /&gt;
 EX    на некотором пути, на следующем состоянии пути&lt;br /&gt;
 EG    на некотором пути, на всех состояния пути&lt;br /&gt;
 EF    на некотором пути , на некотором будущем состоянии пути&lt;br /&gt;
 A[U]  на всех путях, в каждом состоянии до определенного состояния пути&lt;br /&gt;
 E[U]  на некотором пути, в каждом состоянии до определенного состояния пути&lt;br /&gt;
&lt;br /&gt;
OBE операторы местонахождения лева-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
====== 4.2.3.3.2 OBE операторы импликации ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
For any flavor of PSL, the OBE operators with the next highest precedence are those used to describe&lt;br /&gt;
behavior consisting of a Boolean or a property that holds if another Boolean or property holds. These&lt;br /&gt;
operators are:&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Для любого варианта PSL, OBE операторы со следующим наивысшим приоритетом, это те которые используются для описания поведения, состоящего из Булевых выражений или свойства, которое выполняется, если Булево выражение или другое свойство выполняется. Это следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 -&amp;gt;   логическая IF импликация&lt;br /&gt;
 &amp;lt;-&amp;gt;  логическая IFF импликация&lt;br /&gt;
&lt;br /&gt;
Операторы логической IF и логической IFF импликации право-ассоциативные.&lt;br /&gt;
&lt;br /&gt;
==== 4.2.4 Макросы ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
PSL provides macro processing capabilities that facilitate the definition of properties. SystemC, VHDL, and&lt;br /&gt;
GDL flavors support cpp pre-processing directives (e.g., #define, #ifdef, #else, #include, and #undef).&lt;br /&gt;
SystemVerilog and Verilog flavors support Verilog compiler directives (e.g., `define, `ifdef, `else, `include,&lt;br /&gt;
and `undef). All flavors also support PSL macros %for and %if, which can be used to conditionally or&lt;br /&gt;
iteratively generate PSL statements. The cpp or Verilog compiler directives shall be interpreted first, and&lt;br /&gt;
PSL %if and %for macros shall be interpreted second.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
PSL предоставляет возможность обработки макросов, которые помогают в определении свойств. SystemC, VHDL и&lt;br /&gt;
GDL варианты поддерживают cpp препроцессорные директивы (т.е.  #define, #ifdef, #else, #include и #undef).&lt;br /&gt;
SystemVerilog и Verilog поддерживают директивы Verilog компилятора (т.е. `define, `ifdef, `else, `include и `undef). Все варианты, также поддерживают PSL макросы %for и %if, которые могут использоваться для условно или итеративно генерированного PSL утверждения.&lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.1 The %for construct =====&lt;br /&gt;
&lt;br /&gt;
===== 4.2.4.2 The %if construct =====&lt;br /&gt;
&lt;br /&gt;
==== 4.2.5 Комментарии ====&lt;br /&gt;
&lt;br /&gt;
PSL обеспечивает возможность вставки комментариев в PSL спецификацию. Для каждого стиля, возможность комментариев совместима с тем, что обеспечивается соответсвующией средой PSL.&lt;br /&gt;
&lt;br /&gt;
Для SystemC, SystemVerilog, и Verilog стиля, оба варианта блочных комментариев (/* .... */) и (// .... ''&amp;lt;eol&amp;gt;'') поддерживается. (''&amp;lt;eol&amp;gt;'' — конец строки)&lt;br /&gt;
&lt;br /&gt;
Для стиля VHDL, поддерживается комментарии (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
Для стиля GDL, оба блочных стилей комментариев поддерживаются: (/* .... */) и (-- .... ''&amp;lt;eol&amp;gt;'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Syntax ===&lt;br /&gt;
&lt;br /&gt;
==== 4.3.1 Conventions ====&lt;br /&gt;
&lt;br /&gt;
{| class=standard align=center&lt;br /&gt;
! Flavor Macro || SystemVerilog || Verilog || VHDL || SystemC ||  GDL&lt;br /&gt;
|-&lt;br /&gt;
| AND_OP || &amp;amp;&amp;amp; || &amp;amp;&amp;amp; || and || &amp;amp;&amp;amp; || &amp;amp;&lt;br /&gt;
|-&lt;br /&gt;
| OR_OP || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || or || &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NOT_OP || ! || ! || not || ! || !&lt;br /&gt;
|-&lt;br /&gt;
| RANGE_SYM ||  : ||  : ||  to || :|| ..&lt;br /&gt;
|-&lt;br /&gt;
| MIN_VAL || 0 || 0 || 0 || 0 || null&lt;br /&gt;
|-&lt;br /&gt;
| MAX_VAL || $ ||  inf || inf || inf || null&lt;br /&gt;
|-&lt;br /&gt;
| LEFT_SYM || [ || [ || ( || [ || (&lt;br /&gt;
|-&lt;br /&gt;
| RIGHT_SYM || ] || ] || ) || ] || )&lt;br /&gt;
|-&lt;br /&gt;
| DEF_SYM || = || = || is || = || :=&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Semantics ===&lt;br /&gt;
&lt;br /&gt;
The following subclauses introduce various general concepts related to temporal property specification and&lt;br /&gt;
explain how they apply to PSL.&lt;br /&gt;
&lt;br /&gt;
==== 4.4.1 Clocked vs. unclocked evaluation ====&lt;br /&gt;
&lt;br /&gt;
== NEW ==&lt;/div&gt;</summary>
		<author><name>Valentin</name></author>	</entry>

	</feed>