📄 00179.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>17.7.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', '00179.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00338">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00175.html" target="topic">17.7 序列操作</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, 'popup00338');"><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="00178.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="00175.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="00180.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.7.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">
本节描述了用来访问一个表达式采样值的有效的系统函数。这些函数能够访问当前的采样值、访问过去的采样值、或者检测一个表达式采样值的变化。一个表达式的采样在<a href="00168.html" target="topic">17.3节</a>中解释。SystemVerilog提供了下列的函数。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00614');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00614"><pre class="Element12"><strong><span style="color: #FF0000">$sampled(</span></strong>expression [<strong><span style="color: #FF0000">,</span></strong> clocking_event]<strong><span style="color: #FF0000">)</span></strong>
<strong><span style="color: #FF0000">$rose(</span></strong>expression [<strong><span style="color: #FF0000">,</span></strong> clocking_event]<strong><span style="color: #FF0000">)</span></strong>
<strong><span style="color: #FF0000">$fell(</span></strong>expression [<strong><span style="color: #FF0000">,</span></strong> clocking_event]<strong><span style="color: #FF0000">)</span></strong>
<strong><span style="color: #FF0000">$stable(</span></strong>expression [<strong><span style="color: #FF0000">,</span></strong> clocking_event]<strong><span style="color: #FF0000">)</span></strong>
<strong><span style="color: #FF0000">$past</strong>(</span>expression1 [<strong><span style="color: #FF0000">,</span></strong> number_of_ticks] [<strong><span style="color: #FF0000">,</span></strong> expression2] [<strong><span style="color: #FF0000">,</span></strong> clocking_event]<strong><span style="color: #FF0000">)</span></strong></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
这些函数的使用并没有被限制到断言功能;它们也可以被用作过程化代码中的表达式。时钟控制事件尽管作为函数的一个显式的参数是可选的,但在语义上它是需要的。 </p>
<p class="Element10">
</p>
<p class="Element10">
时钟控制事件必须被显式地指定成一个参数,或者从它使用的代码中被推断出来。下列规则被用来推断时钟控制事件:
<ul class="Element631">
<li class="Element601">如果使用在一个断言当中,那么使用来自断言的合适的时钟控制事件。</li>
<li class="Element601">如果使用在一个单一定时断言的动作块中,那么使用断言的时钟。</li>
<li class="Element601">如果使用在一个过程化块中,那么使用过程化代码的推断时钟(参见<a href="00162.html" target="topic">17.13.5节</a>)。</li>
</ul>否则,会使用缺省时钟控制(参见<a href="00121.html" target="topic">15.11节</a>)。 </p>
<p class="Element10">
</p>
<p class="Element10">
当这些函数被使用在一个断言中的时候,函数的时钟控制事件参数(如果指定了的话)应该与断言中表达式的时钟控制事件相同。在多时钟断言的情况下,其中函数被使用的表达式的合适的时钟控制事件被应用到这个函数。 </p>
<p class="Element10">
</p>
<p class="Element10">
函数<span style="color: #0000FF">$sampled</span>返回与时钟控制事件最后一次发生有关的表达式的采样值。当<span style="color: #0000FF">$sampled</span>在第一个时钟控制事件发生之前被调用的时候,函数会返回<span style="color: #FF0000">X</span>。尽管在断言中使用$sampled函数是被允许的,但它确实多余的,因为函数的结果与在断言中使用的表达式本身的采样值是相同的。 </p>
<p class="Element10">
</p>
<p class="Element10">
SystemVerilog提供了三个函数来检测采样值的变化:<span style="color: #0000FF">$rose</span>、<span style="color: #0000FF">$fell</span>和<span style="color: #0000FF">$stable</span>。 </p>
<p class="Element10">
</p>
<p class="Element10">
一个值改变函数检测一个表达式在采样值上的改变。时钟控制事件被用来在当前仿真时间单位之前的一个时钟标记上获取参数表达式的采样值。在这里,当前仿真时间单位指的是函数被计算的仿真时间单位。这个采样值与当前仿真时间单位的prepone时间上决定的表达式的值进行比较。一个值改变表达式的结果是“真”或“假”,并且可以在一个布尔表达式中使用。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果表达式的最低有效位变为1,那么<span style="color: #0000FF">$rose</span>返回“真”;否则返回“假”。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果表达式的最低有效位变为0,那么<span style="color: #0000FF">$fell</span>返回“真”;否则返回“假”。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果表达式的值没有发生变化,那么<span style="color: #0000FF">$stable</span>返回“真”;否则返回“假”。 </p>
<p class="Element10">
</p>
<p class="Element10">
当这些函数在时钟控制事件的第一个时钟标记上或之前被调用的话,那么通过将表达式当前的采样值与<span style="color: #FF0000">X</span>进行比较来计算结果。 </p>
<p class="Element10">
</p>
<p class="Element10">
图17-3演示了值改变的两个例子:
<ul class="Element631">
<li class="Element601">值改变表达式e1被定义成<span style="color: #0000FF">$rose</span><span style="color: #800080">(</span>req<span style="color: #800080">)</span></li>
<li class="Element601">值改变表达式e2被定义成<span style="color: #0000FF">$fell</span><span style="color: #800080">(</span>ack<span style="color: #800080">)</span></li>
</ul></p><p class="Element10" style="text-align: center">
<img src="Figure_17_3.png" border="0" alt="" title=""> </p>
<p class="Element10" style="text-align: center">
<strong>图17-3 — 值改变表达式</strong> </p><p class="Element10">
</p>
<p class="Element10">
用来采样变量的时钟标记由特性的时钟衍生而来,它不同于仿真标记。现在,我们假设这个时钟在其它地方定义。因为<i><span class="Element146">req</span></i>的值在时钟标记2处为低而在时钟标记3处为高,所以<i><span class="Element146">e1</span></i>在时钟标记3处出现。类似地,因为<i><span class="Element146">ack</span></i>的值在时钟标记5处采样为高而在时钟标记6处采样为低,因此<i><span class="Element146">e2</span></i>发生在时钟标记6处。 </p>
<p class="Element10">
</p>
<p class="Element10">
下面的例子演示了<span style="color: #0000FF">$rose</span>在断言之外的SystemVerilog代码中的使用。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00615');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00615"><pre class="Element12"><span style="color: #0000FF">always</span> <span style="color: #800080">@(</span><span style="color: #0000FF">posedge</span> clk<span style="color: #800080">)</span>
reg1 <span style="color: #800080"><=</span> a <span style="color: #800080">&</span> <span style="color: #0000FF">$rose</span><span style="color: #800080">(</span>b<span style="color: #800080">);</span></pre></div></div>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -