📄 00148.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>17.11.3 递归特性</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<meta name="generator" content="Doc-O-Matic" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="STYLESHEET" href="default.css" type="text/css" />
<script type="text/javascript" src="scripts.js"></script>
</head>
<body class="Element700" onload="onBodyLoadEx('systemverilog31a.html', 'topic', '00148.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00352">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00145.html" target="topic">17.11 声明特性</a></div>
</div>
</div>
</div>
<!-- End Popups -->
<!-- Begin Page Header -->
<div class="Element710" id="areafixed">
<div class="Element92">
<table width="100%" cellspacing="0" cellpadding="0">
<tr><td width="33%">
<div class="Element1">
<a href="#" onmousedown="showPopup(this, 'popup00352');"><img src="seealsolink.png" border="0" alt="" title=""></a> SystemVerilog 3.1a语言参考手册</div>
</td><td width="34%">
<div class="Element2">
</div>
</td><td width="33%">
<div class="Element90">
<a href="00147.html" target="topic"><img src="btn_prev_lightblue.gif" border="0" alt="Previous" title="Previous" onmouseover="switchImage(this, 'btn_prev_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_prev_lightblue.gif');"></a><a href="00145.html" target="topic"><img src="btn_up_lightblue.gif" border="0" alt="Up" title="Up" onmouseover="switchImage(this, 'btn_up_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_up_lightblue.gif');"></a><a href="00149.html" target="topic"><img src="btn_next_lightblue.gif" border="0" alt="Next" title="Next" onmouseover="switchImage(this, 'btn_next_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_next_lightblue.gif');"></a></div>
</td></tr></table><div class="Element5">
17.11.3 递归特性</div>
</div>
</div>
<!-- End Page Header -->
<!-- Begin Client Area -->
<div class="Element720" id="areascroll">
<div class="Element721">
<!-- Begin Page Content -->
<div class="Element58">
<a name="描述"></a><div class="Element11">
<div class="Element10">
<p class="Element10">
SystemVerilog允许使用递归的特性。如果一个命名特性的声明调用了其本身的一个实例,那么这个命名特性是递归的。递归提供了一种灵活的框架来对特性进行编码以便作为正在进行的假设、检查器或覆盖率监视器使用。 </p>
<p class="Element10">
</p>
<p class="Element10">
例如: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00691');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00691"><pre class="Element12"><span style="color: #0000FF">property</span> prop_always<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
p <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> prop_always<span style="color: #800080">(</span>p<span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
上述例子是一个递归特性,它表示作为形式参数的特性<i><span class="Element146">p</span></i>必须在每一个周期保持。如果特性<i><span class="Element146">p</span></i>保持的正在进行的需求在一个在序列<i><span class="Element146">s</span></i>中编码的复杂的触发条件之后施加的话,这个例子非常有用。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00692');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00692"><pre class="Element12"><span style="color: #0000FF">property</span> p1<span style="color: #800080">(</span>s<span style="color: #800080">,</span>p<span style="color: #800080">);</span>
s <span style="color: #800080">|=></span> prop_always<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
另外一个例子: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00693');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00693"><pre class="Element12"><span style="color: #0000FF">property</span> prop_weak_until<span style="color: #800080">(</span>p<span style="color: #800080">,</span>q<span style="color: #800080">);</span>
q <span style="color: #0000FF">or</span> <span style="color: #800080">(</span>p <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> prop_weak_until<span style="color: #800080">(</span>p<span style="color: #800080">,</span>q<span style="color: #800080">)));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
上述的递归特性表示作为形式参数的特性<i><span class="Element146">p</span></i>必须在每一个周期保持直到(但不包括)作为形式参数的特性<i><span class="Element146">q</span></i>保持的第一个周期。尽管作为形式参数的特性<i><span class="Element146">q</span></i>并不要求永远保持。This example is useful if p must hold at every cycle after a complicated triggering condition encoded in sequence s, but the requirement on p is lifted by q: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00694');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00694"><pre class="Element12"><span style="color: #0000FF">property</span> p2<span style="color: #800080">(</span>s<span style="color: #800080">,</span>p<span style="color: #800080">,</span>q<span style="color: #800080">);</span>
s <span style="color: #800080">|=></span> prop_weak_until<span style="color: #800080">(</span>p<span style="color: #800080">,</span>q<span style="color: #800080">);</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
More generally, several properties can be mutually recursive. For example </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00695');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00695"><pre class="Element12"><span style="color: #0000FF">property</span> check_phase1<span style="color: #800080">;</span>
s1 <span style="color: #800080">|-></span> <span style="color: #800080">(</span>phase1_prop <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> check_phase2<span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span>
<span style="color: #0000FF">property</span> check_phase2<span style="color: #800080">;</span>
s2 <span style="color: #800080">|-> (</span>phase2_prop <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> check_phase1<span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
递归的特性声明具有三个限制。 </p>
<p class="Element10">
</p>
<p class="Element10">
<strong>限制1</strong>:The negation operator <span style="color: #0000FF">not</span> cannot be applied to any property expression that instantiates a recursive property. In particular, the negation of a recursive property cannot be asserted or used in defining another property. </p>
<p class="Element10">
</p>
<p class="Element10">
Here are examples of illegal property declarations that violate Restriction 1: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00696');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00696"><pre class="Element12"><span style="color: #0000FF">property</span> illegal_recursion_1<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
<span style="color: #0000FF">not</span> prop_always<span style="color: #800080">(</span><span style="color: #0000FF">not</span> p<span style="color: #800080">);</span>
<span style="color: #0000FF">endproperty</span>
<span style="color: #0000FF">property</span> illegal_recursion_2<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
p <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> <span style="color: #0000FF">not</span> illegal_recursion_2<span style="color: #800080">(</span>p<span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
<strong>限制2</strong>:The operator <span style="color: #0000FF">disable iff</span> cannot be used in the declaration of a recursive property. This restriction is consistent with the restriction that disable iff cannot be nested. </p>
<p class="Element10">
</p>
<p class="Element10">
Here is an example of an illegal property declaration that violates Restriction 2: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00697');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00697"><pre class="Element12"><span style="color: #0000FF">property</span> illegal_recursion_3<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
<span style="color: #0000FF">disable iff</span> <span style="color: #800080">(</span>b<span style="color: #800080">)</span>
p <span style="color: #0000FF">and</span> <span style="color: #800080">(</span><span style="color: #FF0000">1'b1</span> <span style="color: #800080">|=></span> illegal_recursion_3<span style="color: #800080">(</span>p<span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
The intent of <i><span class="Element146">illegal_recursion_3</span></i> can be written legally as </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00698');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00698"><pre class="Element12"><span style="color: #0000FF">property</span> legal_3<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
<span style="color: #0000FF">disable iff</span> <span style="color: #800080">(</span>b<span style="color: #800080">)</span> prop_always<span style="color: #800080">(</span>p<span style="color: #800080">);</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
since <i><span class="Element146">legal_3</span></i> is not a recursive property. </p>
<p class="Element10">
</p>
<p class="Element10">
<strong>限制3</strong>:If p is a recursive property, then, in the declaration of p, every instance of p must occur after a positive advance in time. In the case of mutually recursive properties, all recursive instances must occur after positive advances in time. </p>
<p class="Element10">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -