📄 00370.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>3.10 枚举</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', '00370.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00038">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00863.html" target="topic">第三章 数据类型</a>, <a href="00898.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, 'popup00038');"><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="00413.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="00371.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.10 枚举</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('code00049');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00049"><pre class="Element12">data_type ::= <span style="color: #008000">// 引用自附录A.2.2.1</span>
...
| <strong><span style="color: #FF0000">enum</span></strong> [enum_base_type] <strong><span style="color: #FF0000">{</span></strong>enum_name_declaration{<strong><span style="color: #FF0000">, </span></strong>enum_name_declaration}<strong><span style="color: #FF0000">}</span></strong>
enum_base_type ::=
integer_atom_type [signing]
| integer_vector_type [signing] [packed_dimension]
| type_identifier [packed_dimension]<sup>24</sup>
enum_name_declaration ::=
enum_identifier [<strong><span style="color: #FF0000">[</span></strong>integral_number[<strong><span style="color: #FF0000">:</span></strong>integral_number]<strong><span style="color: #FF0000">]</span></strong>][<strong><span style="color: #FF0000">=</span></strong>constant_expression]</pre></div></div>
<p class="Element10" style="text-align: center">
<strong>语法3-3 — 枚举类型(摘录自附录A)</strong></p><p class="Element10">
</p>
<p class="Element10">
枚举类型用来声明一组<span style="color: #0000FF">integral</span>类型的命名常量。枚举数据类型能够抽象地声明具有强烈类型含义的变量,在声明的时候不需要声明一个数据类型或数据值,我们可以在以后设计需要更详细定义的时候加入要求的数据类型和值。枚举数据类型还可以使用枚举名字而不是枚举值来方便地引用或显示。 </p>
<p class="Element10">
</p>
<p class="Element10">
当没有数据类型声明的时候,缺省的数据类型是<span style="color: #0000FF">int</span>。在枚举类型中使用的任何其它数据类型都要求一个显式的数据类型声明。 </p>
<p class="Element10">
</p>
<p class="Element10">
一个枚举类型定义了一组具有名字的值。在下面的例子中,<i>light1</i>和<i>light2</i>被定义成一个匿名(无名字的)枚举<span style="color: #0000FF">int</span>类型,它包含了三个成员:<i>read</i>、<i>yellow</i>和<i>green</i>。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00050');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00050"><pre class="Element12"><span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>red<span style="color: #800080">,</span> yellow<span style="color: #800080">,</span> green<span style="color: #800080">}</span> light1<span style="color: #800080">,</span> light2<span style="color: #800080">;</span> <span style="color: #008000">// 匿名int类型</span></pre></div></div>
<p class="Element10">
对于没有显式数据类型的枚举类型或者一个具有显式两态声明的枚举类型,如果将<span style="color: #FF0000">x</span>或<span style="color: #FF0000">z</span>赋值给枚举名字,那么它在语法上是错误的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00051');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00051"><pre class="Element12"><span style="color: #008000">// 语法错误:IDLE=2'b00, XX=2'bx <错误>, S1=2'b01, S2=2'b10</span>
<span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>IDLE<span style="color: #800080">, </span>XX<span style="color: #800080">='</span><span style="color: #FF0000">x</span><span style="color: #800080">, </span>S1<span style="color: #800080">=</span><span style="color: #FF0000">2</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">01</span><span style="color: #800080">, </span>S2<span style="color: #800080">=</span><span style="color: #FF0000">2</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">10</span><span style="color: #800080">}</span> state<span style="color: #800080">,</span> next<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
对于一个四态类型(例如<span style="color: #0000FF">integer</span>)的枚举声明,允许包含具有<span style="color: #FF0000">x</span>或<span style="color: #FF0000">z</span>赋值的一个或多个名字。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00052');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00052"><pre class="Element12"><span style="color: #008000">// 正确:IDLE=0, XX='x, S1=1, S2=2</span>
<span style="color: #0000FF">enum integer</span> <span style="color: #800080">{</span>IDLE<span style="color: #800080">, </span>XX<span style="color: #800080">='</span><span style="color: #FF0000">x</span><span style="color: #800080">, </span>S1<span style="color: #800080">=</span><span style="color: #FF0000">2</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">01</span><span style="color: #800080">, </span>S2<span style="color: #800080">=</span><span style="color: #FF0000">2</span><span style="color: #800080">'</span><span style="color: #0000FF">b</span><span style="color: #FF0000">10</span><span style="color: #800080">}</span> state<span style="color: #800080">,</span> next<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
如果在一个具有<span style="color: #FF0000">x</span>或<span style="color: #FF0000">z</span>赋值的枚举名字后跟着一个未赋值的枚举名字,那么在语法上是错误的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00053');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00053"><pre class="Element12"><span style="color: #008000">// 语法错误:IDLE=2'b00, XX=2'bx, S1=??, S2=??</span>
<span style="color: #0000FF">enum integer</span> <span style="color: #800080">{</span>IDLE<span style="color: #800080">, </span>XX<span style="color: #800080">='</span><span style="color: #FF0000">x</span><span style="color: #800080">, </span>S1<span style="color: #800080">, </span>S2<span style="color: #800080">}</span> state<span style="color: #800080">,</span> next<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
值可以被强制转换成<span style="color: #0000FF">integer</span>类型,并且从初始值<span style="color: #FF0000">0</span>开始递增。它还可以被覆盖。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00054');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00054"><pre class="Element12"><span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>bronze<span style="color: #800080">=</span><span style="color: #FF0000">3</span><span style="color: #800080">,</span> silver<span style="color: #800080">,</span> gold<span style="color: #800080">}</span> medal<span style="color: #800080">;</span> <span style="color: #008000">// silver=4, gold=5</span></pre></div></div>
<p class="Element10">
在枚举类型中可以设置某些名字的值,而其他的不设置。一个枚举命名常量的可选值是一个确立时的常量表达式(参见<a href="00542.html" target="topic">5.3节</a>),它可以包含参数、本地参数、<span style="color: #0000FF">genvar</span>、其它枚举命名常量、以及这些类型的常量函数。但不允许使用层次化的名字和<span style="color: #0000FF">const</span>变量。一个没有值的名字被自动地赋值为前一个名字的值的递增。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00055');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00055"><pre class="Element12"><span style="color: #008000">// c被自动地赋值为8的递增值</span>
<span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>a<span style="color: #800080">=</span><span style="color: #FF0000">3</span><span style="color: #800080">,</span> b<span style="color: #800080">=</span><span style="color: #FF0000">7</span><span style="color: #800080">,</span> c<span style="color: #800080">}</span> alphabet<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
如果一个自动递增的值在相同枚举声明中的其他地方被赋值,那么会产生一个语法错误。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00056');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00056"><pre class="Element12"><span style="color: #008000">// 语法错误:c和d均被赋值为8</span>
<span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>a<span style="color: #800080">=</span><span style="color: #FF0000">0</span><span style="color: #800080">,</span> b<span style="color: #800080">=</span><span style="color: #FF0000">7</span><span style="color: #800080">,</span> c<span style="color: #800080">,</span> d<span style="color: #800080">=</span><span style="color: #FF0000">8</span><span style="color: #800080">}</span> alphabet<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
如果第一个名字没有赋值,那么它具有<span style="color: #FF0000">0</span>的初始值。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00057');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00057"><pre class="Element12"><span style="color: #008000">// a=0, b=7, c=8</span>
<span style="color: #0000FF">enum</span> <span style="color: #800080">{</span>a<span style="color: #800080">,</span> b<span style="color: #800080">=</span><span style="color: #FF0000">7</span><span style="color: #800080">,</span> c<span style="color: #800080">}</span> alphabet<span style="color: #800080">;</span></pre></div></div>
<p class="Element10">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -