⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00186.html

📁 这是一本关于verilog编程语言的教程,对学习verilog语言有帮助
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>17.8 处理一个序列中的数据</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', '00186.html');" onmousedown="onBodyMouseDown();">

<!-- Begin Popups -->
<div class="Element801" id="popup00346">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00868.html" target="topic">第十七章 断言</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, 'popup00346');"><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="00177.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="00868.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="00187.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.8 处理一个序列中的数据</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静态变量意味着仅存在它的一份拷贝。如果需要在流水线设计中检查数据值,那么对于每一个进入流水线的数据量值,我们可以使用一个单独的变量来存储预期的流水线输出,以便在真正退出管线的时候比较结果。这个存储空间可以通过使用一个变量数组来构建,并且为了最小化通过流水线的传播这个数组可以安排在一个移位寄存器中。然而,在一些更为复杂的情况下,例如管线的潜伏期是可变的并且是乱序的,那么这种结构可能就变得非常复杂并且容易出错。因此,我们需要一些局部变量,这些变量在一个特定的、能够跨越任意时间间隔的事务检查中使用,并且能够与其它事务检查重叠。所以,这样的一个变量必须能够在需要的时候在一个序列实例中动态地产生并能在序列结束的时候移除。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
一个变量的动态产生极其赋值是通过在一个序列或特性声明中使用局部变量声明并在序列中赋值来实现的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00649');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00649"><pre class="Element12">sequence_expr ::=         <span style="color: #008000">// 引用自附录A.2.10</span>
    ...
  | <strong><span style="color: #FF0000">(</span></strong>expression_or_dist{<strong><span style="color: #FF0000">,</span></strong> sequence_match_item}<strong><span style="color: #FF0000">)</span></strong> [boolean_abbrev]
  | <strong><span style="color: #FF0000">(</span></strong>sequence_expr{<strong><span style="color: #FF0000">,</span></strong> sequence_match_item}<strong><span style="color: #FF0000">)</span></strong> [sequence_abbrev]
    ...</pre></div></div>
<p class="Element10" style="text-align: center">
<strong>语法 17-12 — 变量赋值语法(摘录自附录A)</strong></p><p class="Element10">
&nbsp;</p>
<p class="Element10">
变量的类型被显式地说明。通过将子序列、采样赋值放置在圆括号中并以逗号分割,变量可以在任意符合语法的子序列的结束点上被赋值。例如,如果在下面的序列中: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00650');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00650"><pre class="Element12">a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b<span style="color: #800080">[-&gt;</span><span style="color: #FF0000">1</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> c<span style="color: #800080">[*</span><span style="color: #FF0000">2</span><span style="color: #800080">]</span></pre></div></div>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
我们希望在<i><span class="Element146">b<span style="color: #800080">[-&gt;</span><span style="color: #FF0000">1</span><span style="color: #800080">]</span></span></i>的匹配上作这样的赋值:<i><span class="Element146">x <span style="color: #800080">=</span> e</span></i>,那么序列可以按如下方式重写: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00651');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00651"><pre class="Element12">a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>b<span style="color: #800080">[-&gt;</span><span style="color: #FF0000">1</span><span style="color: #800080">],</span> x <span style="color: #800080">=</span> e<span style="color: #800080">)</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> c<span style="color: #800080">[*</span><span style="color: #FF0000">2</span><span style="color: #800080">]</span></pre></div></div>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
以后,局部变量可以在序列中按如下的方式被重新赋值: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00652');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00652"><pre class="Element12">a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>b<span style="color: #800080">[-&gt;</span><span style="color: #FF0000">1</span><span style="color: #800080">],</span> x <span style="color: #800080">=</span> e<span style="color: #800080">)</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>c<span style="color: #800080">[*</span><span style="color: #FF0000">2</span><span style="color: #800080">],</span> x<span style="color: #800080"> =</span> x <span style="color: #800080">+</span> <span style="color: #FF0000">1</span><span style="color: #800080">)</span></pre></div></div>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
对于每一次尝试,都会为序列产生变量的一个新的拷贝。变量值可以向任何其它SystemVerilog变量一样被测试。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
不允许层次化地引用局部变量。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
考虑一个局部变量使用的例子,假设一个流水线具有固定的5个时钟周期的潜伏期。当<span class="Element146">valid_in</span>为“真”的时候,<span class="Element146">pipe_in</span>携带数据进入管线,并且流水线计算的值在5个时钟周期之后出现在信号<span class="Element146">pipe_out1</span>上。管线传输的数据通过一个函数来预测,这个函数对数据进行递增。下面的特性验证了这个行为: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00653');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00653"><pre class="Element12"><span style="color: #0000FF">property</span> e<span style="color: #800080">;</span>
    <span style="color: #0000FF">int</span> x<span style="color: #800080">;</span>
    <span style="color: #800080">(</span>valid_in<span style="color: #800080">,(</span>x<span style="color: #800080"> =</span> pipe_in<span style="color: #800080">)) |-&gt; ##</span><span style="color: #FF0000">5</span><span style="color: #800080"> (</span>pipe_out1 <span style="color: #800080">== (</span>x<span style="color: #800080">+</span><span style="color: #FF0000">1</span><span style="color: #800080">));</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
特性<span class="Element146">e</span>按如下方式计算:
<ol class="Element631">
<li value="1" class="Element601">当<span class="Element146">valid_in</span>为“真”的时候,x被赋值为<span class="Element146">pipe_in</span>的值。如果5个周期之后,<span class="Element146">pipe_out1</span>等于<span class="Element146">x<span style="color: #800080">+</span><span style="color: #FF0000">1</span></span>,那么特性<span class="Element146">e</span>为“真”。否则特性<span class="Element146">e</span>为“假”。</li>
<li value="2" class="Element601">当<span class="Element146">valid_in</span>为“假”的时候,特性<span class="Element146">e</span>计算成“真”。</li>
</ol>&nbsp;</p>
<p class="Element10">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -