📄 00382.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>3.11 结构体与联合体</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', '00382.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00050">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00863.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, 'popup00050');"><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="00381.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="00863.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="00383.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">
3.11 结构体与联合体</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">
<div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00073');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00073"><pre class="Element12">data_type ::= <span style="color: #008000">// 引用自附录A.2.2.1</span>
...
| struct_union [<strong><span style="color: #FF0000">packed </span></strong>[signing]] <strong><span style="color: #FF0000">{</span></strong>struct_union_member {struct_union_member}<strong><span style="color: #FF0000">}</span></strong>
{packed_dimension}
struct_union_member ::=
{attribute_instance} data_type_or_void list_of_variable_identifiers<strong><span style="color: #FF0000">;</span></strong>
data_type_or_void ::= data_type | <strong><span style="color: #FF0000">void</span></strong>
struct_union ::= <strong><span style="color: #FF0000">struct</span></strong> | <strong><span style="color: #FF0000">union</span></strong> [<strong><span style="color: #FF0000">tagged</span></strong>]</pre></div></div>
<p class="Element10" style="text-align: center">
<strong>语法3-4 结构体与联合体(摘录自附录A)</strong></p><p class="Element10">
</p>
<p class="Element10">
结构体和联合体的声明遵从C语言的语法,但在“<span style="color: #800080">{</span>”之前没有可选的结构体标签。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00074');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00074"><pre class="Element12"><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">7</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> opcode<span style="color: #800080">;</span>
<span style="color: #0000FF"> bit</span><span style="color: #800080">[</span><span style="color: #FF0000">23</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> IR <span style="color: #008000">//匿名结构体,定义变量IR。</span>
IR<span style="color: #800080">.</span>opcode <span style="color: #800080">=</span> <span style="color: #FF0000">1</span><span style="color: #800080">;</span> <span style="color: #008000">// 设置IR的域</span></pre></div></div>
<p class="Element10">
其它一些声明结构体和联合体的例子如下: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00075');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00075"><pre class="Element12"><span style="color: #0000FF">typedef struct</span> <span style="color: #800080">{</span>
<span style="color: #0000FF"> bit</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> opcode<span style="color: #800080">;</span>
<span style="color: #0000FF"> bit</span><span style="color: #800080">[</span><span style="color: #FF0000">23</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> instruction<span style="color: #800080">;</span> <span style="color: #008000">// 命名的结构体类型</span>
instruction IR<span style="color: #800080">;</span> <span style="color: #008000">// 定义变量</span>
<span style="color: #0000FF">typedef union</span> <span style="color: #800080">{</span>
<span style="color: #0000FF"> int</span> i<span style="color: #800080">;</span>
<span style="color: #0000FF"> shortreal</span> f<span style="color: #800080">;</span>
<span style="color: #800080">}</span> num<span style="color: #800080">;</span> <span style="color: #008000">// 命名的联合体类型</span>
num n<span style="color: #800080">;</span>
n<span style="color: #800080">.</span>f <span style="color: #800080">=</span> <span style="color: #FF0000">0.0</span><span style="color: #800080">;</span> <span style="color: #008000">// 以浮点数格式设置n</span>
<span style="color: #0000FF">typedef struct</span> <span style="color: #800080">{</span>
<span style="color: #0000FF">bit</span> isfloat<span style="color: #800080">;</span>
<span style="color: #0000FF">union</span> <span style="color: #800080">{</span>
<span style="color: #0000FF"> int</span> i<span style="color: #800080">;</span>
<span style="color: #0000FF"> shortreal</span> f<span style="color: #800080">;</span>
<span style="color: #800080">}</span> n<span style="color: #800080">;</span> <span style="color: #008000">// 匿名类型</span>
<span style="color: #800080">}</span> tagged_st<span style="color: #800080">;</span> <span style="color: #008000">// 命名结构体</span>
tagged_st a<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> <span style="color: #008000">// 结构体数组</span></pre></div></div>
<p class="Element10">
一个结构体可以作为一个整体赋值,并且可以作为一个整体向/从一个函数或任务传递。 </p>
<p class="Element10">
</p>
<p class="Element10">
<a href="00243.html" target="topic">第2.8节</a>讨论了如何为结构体赋初始值。 </p>
<p class="Element10">
</p>
<p class="Element10">
一个压缩结构体包含了位域,它们在存储器中被无缝地压缩在一起。这也就意味着,它们可以方便地转换到位向量,或从位向量转换。一个非压缩结构体具有独立于实现的压缩形式,通常与C编译器相匹配。 </p>
<p class="Element10">
</p>
<p class="Element10">
与压缩数组类似,在使用算术和逻辑操作符时,一个压缩结构体可以当作一个整体使用。第一个指定的成员成为最高有效位,后续的成员以降序排列。结构体在声明的时候可以使用<span style="color: #0000FF">packed</span>关键字,根据期望的算术行为,<span style="color: #0000FF">packed</span>关键字之后可以跟着<span style="color: #0000FF">signed</span>或<span style="color: #0000FF">unsigned</span>关键字。缺省情况下,结构体是无符号的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00076');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00076"><pre class="Element12"><span style="color: #0000FF">struct packed signed</span> <span style="color: #800080">{</span>
<span style="color: #0000FF">int</span> a<span style="color: #800080">;</span>
<span style="color: #0000FF">shortint</span> b<span style="color: #800080">;</span>
<span style="color: #0000FF">byte</span> c<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</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> d<span style="color: #800080">;</span>
<span style="color: #800080">}</span> pack1<span style="color: #800080">;</span> <span style="color: #008000">// 有符号的两态值</span>
<span style="color: #0000FF">struct packed unsigned</span> <span style="color: #800080">{</span>
<span style="color: #0000FF">time</span> a<span style="color: #800080">;</span>
<span style="color: #0000FF">integer</span> b<span style="color: #800080">;</span>
<span style="color: #0000FF">logic</span> <span style="color: #800080">[</span><span style="color: #FF0000">31</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> c<span style="color: #800080">;</span>
<span style="color: #800080">}</span> pack2<span style="color: #800080">;</span> <span style="color: #008000">// 无符号的四态值</span></pre></div></div>
<p class="Element10">
只要压缩结构体内的数据类型存在4态数据类型,那么整个结构体就被当作是4态数据类型,并且其中的任何2态成员都会使用强制类型转换进行转换。压缩结构体的一个或更多的位可以使用<span style="color: #800080">[</span><span style="color: #FF0000">n-1</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span>的编号方法来选择,就好像它是一个压缩数组一样。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00077');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00077"><pre class="Element12">pack1<span style="color: #800080">[</span><span style="color: #FF0000">15</span><span style="color: #800080">:</span><span style="color: #FF0000">8</span><span style="color: #800080">]</span> <span style="color: #008000">// c</span></pre></div></div>
<p class="Element10">
非整数数据类型(例如<span style="color: #0000FF">real</span>和<span style="color: #0000FF">shortreal</span>)以及非压缩数组不允许在压缩结构体或压缩联合体中使用。 </p>
<p class="Element10">
</p>
<p class="Element10">
一个压缩结构体可以与<span style="color: #0000FF">typedef</span>一起使用。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00078');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00078"><pre class="Element12"><span style="color: #0000FF">typedef struct packed</span> <span style="color: #800080">{</span> <span style="color: #008000">// 缺省是无符号的</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> GFC<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</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> VPI<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">11</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> VCI<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</span> CLP<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> PT<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</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> HEC<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">47</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> Payload<span style="color: #800080">;</span>
<span style="color: #0000FF">bit</span> <span style="color: #800080">[</span><span style="color: #FF0000">2</span><span style="color: #800080">:</span><span style="color: #FF0000">0</span><span style="color: #800080">]</span> filler<span style="color: #800080">;</span>
<span style="color: #800080">}</span> s_atmcell<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
一个压缩联合体所包含的成员只能是压缩结构体、压缩数组或者是整数数据类型,并且所有的成员必须具有相同的尺寸(而对于一个非压缩联合体,其成员可以具有不同的尺寸)。这就可以保证你可以读回作为另外一个成员写入的联合体成员。在使用算术和逻辑操作符时,一个压缩联合体可以当作一个整体使用,并且它的行为由<span style="color: #0000FF">signed</span>或<span style="color: #0000FF">unsigned</span>关键字确定。如果没有显式指明<span style="color: #0000FF">signed</span>或<span style="color: #0000FF">unsigned</span>关键字,那么它缺省是<span style="color: #0000FF">unsigned</span>的。如果一个压缩联合体包含了2态成员和4态成员,那么整个联合体是4态的。此时,如果读取2态成员,那么它具有一个隐式的4态到2态的转换;如果写入2态成员,则具有一个隐式的2态到4态的转换。 </p>
<p class="Element10">
</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -