📄 00565.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>7.18.1 将动态尺寸的数据位流化</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', '00565.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00138">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00564.html" target="topic">7.18 流操作符(压缩/非压缩)</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, 'popup00138');"><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="00564.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="00564.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="00566.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">
7.18.1 将动态尺寸的数据位流化</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">
如果解压缩操作包含了庞大的动态尺寸类型,那么解压缩过程是很复杂的(就像强制类型转换中一样):第一个动态尺寸条目被重新调整尺寸以便容纳流中所有的有效数据(排除了后续的固定尺寸条目)。对于仅仅包含了一个动态尺寸数据条目的流来说,采用这种机制来实现解压缩操作是足够的。然而,当流中包含了多个可变尺寸的数据包,或者每一个数据包包含了多个可变尺寸的数据条目、或者解压缩的数据的尺寸存储与一个流的中间部分,那么这种机制是很麻烦的并且容易引入错误。为了解决这些问题,解压缩操作允许使用一个<span style="color: #0000FF">with</span>表达式来显式地指明解压缩操作中可变尺寸域的范围。 </p>
<p class="Element10">
</p>
<p class="Element10">
<span style="color: #0000FF">with</span>表达式的语法如下: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00248');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00248"><pre class="Element12">stream_expression ::= expression [<strong><span style="color: #FF0000">with[</span></strong>array_range_expression<strong><span style="color: #FF0000">]</span></strong>]
<span style="color: #008000">// 引用自附录A.8.1</span>
array_range_expression ::=
expression
| expression <strong><span style="color: #FF0000">:</span></strong> expression
| expression <strong><span style="color: #FF0000">+:</span></strong> expression
| expression <strong><span style="color: #FF0000">-:</span></strong> expression</pre></div></div>
<p class="Element10" style="text-align: center">
<strong>语法7-5 — with表达式语法(摘录自附录A)</strong></p><p class="Element10">
</p>
<p class="Element10">
<span style="color: #0000FF">with</span>结构内的数组范围表达式必须具有integral类型,并且能够计算成位于固定尺寸数组边界内的值,或者,对于动态数组或队列,计算成正的值。<span style="color: #0000FF">with</span>之前的表达式可以是任何一维的非压缩数组(包括队列)。<span style="color: #0000FF">with</span>结构之内的表达式在它对应的数组被流化(也就是压缩或解压缩)之前被立即计算。因此,这个表达式可以指向被相同的操作符解压缩但位于数组之前的数据。如果这个表达式指向在对应数组之后(数组的右侧)被解压缩的变量,那么表达式使用变量的前一个值进行计算。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果使用在一个解压缩操作的关联文中,并且数组是一个可变尺寸的数组,那么应该调整尺寸以便容纳这个范围表达式。如果数组是一个固定尺寸的数组并且范围表达式被计算成一个位于数组边界之外的范围,那么只有位于数组范围之内的数据被解压缩,并会产生一个错误。如果范围表达式被计算成一个小于数组(固定尺寸或可变尺寸)边界的范围,那么仅仅那些指定的条目被解压缩到指定的数组位置;数组中余下的部分不会被修改。 </p>
<p class="Element10">
</p>
<p class="Element10">
当使用在一个压缩操作关联文(位于语句的右侧)中的时候,它与数组分片的行为相同:指定数目的数组条目被压缩到流中。如果范围表达式的值小于数组的边界,那么只有指定的数组条目被流化。如果范围表达式大于数组边界,那么整个数组被流化,剩余的条目由指定数组的缺省值(在<a href="00543.html" target="topic">表5-1</a>中描述)产生。 </p>
<p class="Element10">
</p>
<p class="Element10">
例如,下面的代码使用流操作符来建模一个在字节流上传输的包,它使用小字节编码顺序: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00249');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00249"><pre class="Element12"><span style="color: #0000FF">byte</span> stream<span style="color: #800080">[</span><span style="color: #FF0000">$</span><span style="color: #800080">];</span> <span style="color: #008000">// 字节流</span>
<span style="color: #0000FF">class</span> Packet
<span style="color: #0000FF">rand int</span> header<span style="color: #800080">;</span>
<span style="color: #0000FF">rand int</span> len<span style="color: #800080">;</span>
<span style="color: #0000FF">rand byte</span> payload<span style="color: #800080">[];</span>
<span style="color: #0000FF">int</span> crc<span style="color: #800080">;</span>
<span style="color: #0000FF">constraint</span> G <span style="color: #800080">{</span>len <span style="color: #800080">></span> <span style="color: #FF0000">1</span><span style="color: #800080">;</span> payload<span style="color: #800080">.</span><span style="color: #0000FF">size</span> <span style="color: #800080">==</span> len<span style="color: #800080">;}</span>
<span style="color: #0000FF">function void</span> post_randomize<span style="color: #800080">;</span>
crc <span style="color: #800080">=</span> payload<span style="color: #800080">.</span>sum<span style="color: #800080">;</span>
<span style="color: #0000FF">endfunction</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -