?? 00564.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>7.18 流操作符(壓縮/非壓縮)</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', '00564.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00137">
<div class="Element800">
<div class="Element14">
鏈接</div>
<div class="Element11">
<div class="Element10">
<a href="00860.html" target="topic">第七章 操作符與表達式</a>, <a href="00912.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, 'popup00137');"><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="00563.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="00860.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="00565.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 流操作符(壓縮/非壓縮)</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="00387.html" target="topic">3.16節</a>描述了位流強制類型轉換,當轉換操作可以僅僅使用一個強制類型轉換方便地表達,并且位流的特定順序并不重要的時候,這種方法最為有用。然而,有時位流需要匹配于一個特定的組織形式。流操作符將位流類型(參見<a href="00387.html" target="topic">3.16節</a>)以用戶指定的順序壓縮到一個位序列當中。當流操作符使用在表達式左側的時候,它執行相反的操作:將位流解壓縮成一個或多個變量。如果正在被壓縮的數據包含任何四態類型,那么壓縮操作的結果是四態類型,否則,結果為兩態類型。將四態類型的位流解壓縮成兩態類型變量是通過一個向兩態變量的強制類型轉換實現的,反之亦然。 </p>
<p class="Element10">
</p>
<p class="Element10">
位流串聯的語法如下: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00245');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00245"><pre class="Element12">streaming_expression ::= <strong><span style="color: #FF0000">{</span></strong>stream_operator [slice_size] stream_concatenation<strong><span style="color: #FF0000">}</span></strong>
<span style="color: #008000"> // 引用自附錄A.8.1</span>
stream_operator ::= <strong><span style="color: #FF0000">>></span></strong> | <strong><span style="color: #FF0000"><<</span></strong>
slice_size ::= ps_type_identifier | constant_expression
stream_concatenation ::= <strong><span style="color: #FF0000">{</span></strong>stream_expression{<span style="color: #FF0000">,</span> stream_expression}<strong><span style="color: #FF0000">}</span></strong>
stream_expression ::= expression [<strong><span style="color: #FF0000">with</span></strong> <strong><span style="color: #FF0000">[</span></strong>array_range_expression<strong><span style="color: #FF0000">]</span></strong>]
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
primary ::=
...
| streaming_expression</pre></div></div>
<p class="Element10" style="text-align: center">
<strong>語法 7-4—位流串聯語法(摘錄自附錄A)</strong></p><p class="Element10">
</p>
<p class="Element10">
流操作符決定了數據位流化的順序:<span style="color: #800080">>></span>使得數據以從左到右的順序位流化,而<span style="color: #800080"><<</span>使得數據以從右到左的順序位流化。如果指定了<i>slice-size</i>(分片尺寸),那么數據首先被分割成具有特定位數目的分片,然后這些分片以特定的順序位流化。如果沒有指定<i>slice-size</i>,那么缺省尺寸為<span style="color: #FF0000">1</span>(或<span style="color: #0000FF">bit</span>)。如果分片的時候最后一個分片小于設定的分片寬度,那么不會添加填充位。 </p>
<p class="Element10">
</p>
<p class="Element10">
例如: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00246');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00246"><pre class="Element12"><span style="color: #0000FF">int</span> j <span style="color: #800080">=</span> <span style="color: #800080">{</span><span style="color: #575D94">"A"</span><span style="color: #800080">,</span> <span style="color: #575D94">"B"</span><span style="color: #800080">,</span> <span style="color: #575D94">"C"</span><span style="color: #800080">,</span> <span style="color: #575D94">"D"</span><span style="color: #800080">};</span>
<span style="color: #800080">{>></span> <span style="color: #800080">{</span>j<span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 "A" "B" "C" "D"</span>
<span style="color: #800080">{<<</span> <span style="color: #0000FF">byte</span><span style="color: #800080">{</span>j<span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 "D" "C" "B" "A" (小字節順序)</span>
<span style="color: #800080">{<<</span> <span style="color: #FF0000">16</span><span style="color: #800080">{</span>j<span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 "C" "D" "A" "B"</span>
<span style="color: #800080">{<< {</span><span style="color: #FF0000">8</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">0011</span><span style="color: #800080">_</span><span style="color: #FF0000">0101</span><span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 'b1010_1100 (位反轉)</span>
<span style="color: #800080">{<<</span> <span style="color: #FF0000">4</span><span style="color: #800080">{</span><span style="color: #FF0000">6</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">11</span><span style="color: #800080">_</span><span style="color: #FF0000">0101</span><span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 'b0101_11</span>
<span style="color: #800080">{>></span> <span style="color: #FF0000">4</span><span style="color: #800080">{</span><span style="color: #FF0000">6</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">11</span><span style="color: #800080">_</span><span style="color: #FF0000">0101</span><span style="color: #800080">}}</span> <span style="color: #008000">// 產生流 'b1101_01 (相同)</span>
<span style="color: #800080">{<<</span> <span style="color: #FF0000">2</span><span style="color: #800080">{{<< {</span><span style="color: #FF0000">4</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">1101</span><span style="color: #800080">}}}}</span> <span style="color: #008000">// 產生流 'b1110</span></pre></div></div>
<p class="Element10">
流操作符直接操作于integral類型和流。當應用于非壓縮集合類型(例如非壓縮數組、非壓縮結構體、或類)的時候,它們會以深度最先的順序遞歸地遍歷數據直到得到單個integral類型。一個多維壓縮數組會被當作單個integral類型,然而壓縮條目的非壓縮數組會使得每一個壓縮條目被單獨位流化。流操作符只能處理位流類型,處理任何其它類型都會產生一個錯誤。 </p>
<p class="Element10">
</p>
<p class="Element10">
壓縮操作的結果可以直接賦值到任何位流類型的變量。如果賦值左側代表一個固定尺寸的變量并且流尺寸大于變量的尺寸,那么會產生一個錯誤。如果變量的尺寸大于流尺寸,那么流會向左調整并在右側填充0。如果左側代表一個動態尺寸的變量(例如隊列或動態數組),那么變量會重新調整尺寸以便容納整個流。如果調整后的變量尺寸大于流的尺寸,那么流會向左調整并在右側填充0。流不是一個integral類型的值;為了在表達式中使用,需要一個強制類型轉換。 </p>
<p class="Element10">
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -