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

📄 00382.html

📁 这是一本关于verilog编程语言的教程,对学习verilog语言有帮助
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<p class="Element10">
例如,一个联合体可以使用不同的访问宽度进行访问: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00079');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00079"><pre class="Element12"><span style="color: #0000FF">typedef union packed</span> <span style="color: #800080">{</span> <span style="color: #008000">// 缺省是无符号的</span>
    s_atmcell acell<span style="color: #800080">;</span>
    <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">423</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> bit_slice<span style="color: #800080">;</span>
    <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">52</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span>]<span style="color: #800080">[</span><span style="color: #FF0000">7</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> byte_slice<span style="color: #800080">;</span>
<span style="color: #800080">}</span> u_atmcell<span style="color: #800080">;</span>

u_atmcell u1<span style="color: #800080">;</span>

<span style="color: #0000FF">byte</span> b<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">3</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> nib<span style="color: #800080">;</span>
b <span style="color: #800080">=</span> u1<span style="color: #800080">.</span>bit_slice<span style="color: #800080">[</span><span style="color: #FF0000">415</span><span style="color: #800080">:</span><span style="color: #FF0000">408</span><span style="color: #800080">];</span>    <span style="color: #008000">// 与b = u1.byte_slice[51];相同</span>
nib <span style="color: #800080">=</span> u1<span style="color: #800080">.</span>bit_slice<span style="color: #800080">[</span><span style="color: #FF0000">423</span><span style="color: #800080">:</span><span style="color: #FF0000">420</span><span style="color: #800080">];</span>  <span style="color: #008000">// 与nib = u1.acell.GFC;相同</span></pre></div></div>
<p class="Element10">
注意:对一个成员的写入与对另外一个成员的读出独立于计算机的字节顺序,这与一个普通的联合体或普通的结构体不同,这些普通的联合体或普通的结构体与C语言兼容并且以降地址的顺序排列成员。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
在非压缩结构体中不允许使用符号,因此下面的声明被认为是非法的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00080');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00080"><pre class="Element12"><span style="color: #0000FF">typedef struct signed</span> <span style="color: #800080">{</span>
<span style="color: #0000FF">    int</span> f1<span style="color: #800080">;</span>
<span style="color: #0000FF">    logic</span> f2<span style="color: #800080">;</span>
<span style="color: #800080">}</span> sIllegalSignedUnpackedStructType<span style="color: #800080">;</span> <span style="color: #008000">// 非法声明</span></pre></div></div>
<p class="Element10">
联合体中声明中具有限定词<span style="color: #0000FF">tagged</span>的联合体声明为标签联合体,它是一个类型检查的联合体。一个普通的(不带有标签的)联合体可以使用一个成员类型的值进行更新,而以另外一个成员类型进行读取,这有可能成为类型漏洞。一个标签联合体既储存了成员值也储存了一个标签,也就是说,使用额外的位来表示当前的成员名字。标签和值仅仅能够通过一个静态的类型检查标签联合体表达式来(参见<a href="00561.html" target="topic">7.15节</a>)一起更新。成员值仅仅可以通过与当前标签值一致的类型来读取(也就是成员名)。这样,我们就不可能以一种类型来存储值,而以另外一种类型来错误地解释成员的各位。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
除了类型的安全性之外,相对于使用显式标签来跟踪联合体的代码而言,将成员名以标签的方式使用也可以使代码更加简单并且更小。标签联合体还可以用在模式匹配(参见<a href="00583.html" target="topic">8.4节</a>)当中,这会更进一步改进代码的可读性。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
在标签联合体中,当所有信息都存在于标签本身的时候,成员还可以使用<span style="color: #0000FF">void</span>类型来声明。就像在下面的例子中包含一个整数和一个有效位一样: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00081');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00081"><pre class="Element12"><span style="color: #0000FF">typedef union tagged</span> <span style="color: #800080">{</span>
    <span style="color: #0000FF">void</span> Invalid<span style="color: #800080">;</span>
    <span style="color: #0000FF">int</span> Valid<span style="color: #800080">;</span>
<span style="color: #800080">}</span> VInt<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
在上面的例子中,一个<i>VInt</i>类型的值或者是无效的并没有包含任何东西,或者是有效的并包含一个<span style="color: #0000FF">int</span>类型的值。<a href="00561.html" target="topic">7.15节</a>描述了如何构建这种类型的值,并且描述了怎样才能够确保不会从一个当前具有<i>Invalid</i>标签的<i>VInt</i>值中读出一个整数值。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
例子: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00082');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00082"><pre class="Element12"><span style="color: #0000FF">typedef union tagged</span> <span style="color: #800080">{</span>
    <span style="color: #0000FF">struct</span> <span style="color: #800080">{</span>
        <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">4</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> reg1<span style="color: #800080">,</span> reg2<span style="color: #800080">,</span> regd<span style="color: #800080">;</span>
    <span style="color: #800080">}</span> Add<span style="color: #800080">;</span>

    <span style="color: #0000FF">union tagged</span> <span style="color: #800080">{</span>
        <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">9</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> JmpU<span style="color: #800080">;</span>
        <span style="color: #0000FF">struct</span> <span style="color: #800080">{</span>
            <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">1</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> cc<span style="color: #800080">;</span>
            <span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">9</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> addr<span style="color: #800080">;</span>
        <span style="color: #800080">}</span> JmpC<span style="color: #800080">;</span>
    <span style="color: #800080">}</span> Jmp<span style="color: #800080">;</span>
<span style="color: #800080">}</span> Instr<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
一个<i>Instr</i>类型的值或者是一个<i>Add</i>指令或者是一个<i>Jmp</i>指令。如果是<i>Add</i>指令,它包含了三个5位寄存器域;如果是<i>Jmp</i>指令,它或者是一个无条件跳转或者是一个有条件跳转。如果是无条件跳转,它包含了一个10位的目的地址。如果是有条件跳转,它包含了一个2位的条件码寄存器域和一个10位的目的地址。<a href="00561.html" target="topic">7.15节</a>描述了如何构建<i>Instr</i>类型的值 ,并且描述了如何才能使指令必须具有<i>Jmp</i>操作码和<i>JmpC</i>子操作码(例如为了读取<i>cc</i>域)。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
当<span style="color: #0000FF">packed</span>限定词使用在标签联合体的时候,所有的成员必须是压缩数据类型,但它们不必具有相同的尺寸。一个压缩标签联合体的标准表示方法如下:</p>
<ul class="Element630">
<li class="Element600">尺寸总是等于所需的位的数目以便表示标签加上最大的成员尺寸;</li>
<li class="Element600">标签的尺寸是编码所有成员名字所需的最小的位数目(例如5到8个成员需要3个标签位);</li>
<li class="Element600">标签位总是向左调整(也就是向最高有效位的方向调整);</li>
<li class="Element600">对于每一个成员,成员位总是向右调整(也就是向最低有效位的方向调整);</li>
<li class="Element600">在标签位与成员位之间的位是未定义的。在具有<span style="color: #0000FF">void</span>成员的极端情况下,只有标签位是有意义的,所有其它的位都是未定义的。</li>
</ul><p class="Element10">
&nbsp;</p>
<p class="Element10">
这种表示机制递归地适用于任何嵌套的标签联合体。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
例子:如果<i>VInt</i>类型定义具有<span style="color: #0000FF">packed</span>限定词,那么<i>InValid</i>和<i>Valid</i>值分别具有如下的布局。 </p><p class="Element10" style="text-align: center">
<img src="3_11_1.png" border="0" alt="" title="">&nbsp;</p>
<p class="Element10" style="text-align: center">
&nbsp;</p><p class="Element10">
标签为<span style="color: #FF0000">0</span>表示无效,标签为<span style="color: #FF0000">1</span>表示有效。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
例子:如果<i>Instr</i>类型具有<span style="color: #0000FF">packed</span>限定词,那么它的值具有如下的布局: </p><p class="Element10" style="text-align: center">
<img src="3_11_2.png" border="0" alt="" title="">&nbsp;</p>
<p class="Element10" style="text-align: center">
&nbsp;</p><p class="Element10">
对外层标签来讲,0表示<i>Add</i>,1表示<i>Jmp</i>;&nbsp;</p>
<p class="Element10">
对内层标签来讲,0表示<i>JmpU</i>,1表示<i>JmpC</i>。</p></div>
</div>
<a name="Group"></a><div class="Element14">
<a onclick="toggleVisibilityStored('Group');" class="a_Element14"><img src="sectionminus.png" border="0" alt="" title="" id="imgGroup">Group</a></div>
<div id="divGroup">
<div class="Element11">
<div class="Element10">
<p class="Element10">
<a href="00863.html" target="topic">第三章 数据类型</a></p></div>
</div>
</div>
<a name="Links"></a><div class="Element14">
<a onclick="toggleVisibilityStored('链接');" class="a_Element14"><img src="sectionminus.png" border="0" alt="" title="" id="img链接">链接</a></div>
<div id="div链接">
<div class="Element11">
<div class="Element10">
<a href="00863.html" target="topic">第三章 数据类型</a></div>
</div>
</div>
</div>
<!-- End Page Content -->

<!-- Begin Page Footer -->
<hr width="98%" align="center" size="1" color="#CCCCCC" />
<table align="center" cellpadding="0" cellspacing="0" border="0">
	<tbody>
		<tr height="10">
			<td></td>
		</tr>
		<tr align="center">
			<td>
<script type="text/javascript"><!--
google_ad_client = "pub-5266859600380184";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_page_url = document.location;
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
			</td>
		</tr>
		<tr height="15">
			<td></td>
		</tr>
		<tr align="center">
			<td>
				<font size=2>除非特别声明,原文版权归作者所有,如有转摘请注明原作者以及译者(<a href="http://www.fpgatech.net/"  target="_blank">FPGA技术网</a>)信息。<br />
如果您对本主题有何建议或意见,请登陆<a href="http://www.fpgatech.net/forum/forumdisplay.php?fid=18" target="_blank">FPGA开发者家园</a>提交,您的参与是我们前进的动力。</font>
<script language="javascript" type="text/javascript" src="http://js.users.51.la/195685.js"></script>
<noscript><a href="http://www.51.la/?195685" target="_blank"><img alt="&#x6211;&#x8981;&#x5566;&#x514D;&#x8D39;&#x7EDF;&#x8BA1;" src="http://img.users.51.la/195685.asp" style="border:none" /></a></noscript>
			</td>
		</tr>
	</tbody>
</table>

<!-- End Page Footer -->
</div>
</div>

<!-- End Client Area -->
</body></html>

⌨️ 快捷键说明

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