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

📄 00585.html

📁 这是一本关于verilog编程语言的教程,对学习verilog语言有帮助
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>8.4.1.1 case语句中的模式匹配</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', '00585.html');" onmousedown="onBodyMouseDown();">

<!-- Begin Popups -->
<div class="Element801" id="popup00147">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00584.html" target="topic">8.4.1 模式匹配</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, 'popup00147');"><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="00584.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="00584.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="00586.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">
8.4.1.1 case语句中的模式匹配</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">case</span>语句中,圆括号内的表达式紧跟着关键字<span style="color: #0000FF">matches</span>,并且语句包含了一系列“<i>case_pattern_items</i>”。在一个<span style="color: #0000FF">case</span>条目的左侧,“<span style="color: #800080">:</span>”之前的部分,包含了一个模式以及一个可选的<span style="color: #800080">&amp;&amp;</span>操作符,在<span style="color: #800080">&amp;&amp;</span>操作符之后紧跟一个“<i>filter</i>”布尔表达式。<span style="color: #0000FF">case</span>条目的右侧是一条语句。每一个模式都引入了一个新的作用范围,在这个范围中会隐式地声明它的模式标识符;这个作用范围扩展到可选的过滤器表达式以及同一个case条目右侧的语句。因此,不同的case条目可以复用模式标识符。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
所有的模式均执行完全静态的类型检查。在模式匹配<span style="color: #0000FF">case</span>语句中进行测试的表达式必须具有已知的类型,它与每个<span style="color: #0000FF">case</span>条目中模式的类型相同。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
模式匹配<span style="color: #0000FF">case</span>语句中圆括号内的表达式应该仅计算一次。它的值<i>V</i>应该以指定的顺序一次一个条目地与case条目的左侧进行匹配,如果有<span style="color: #0000FF">default case</span>条目的话,会将其忽略。在这个线性搜索过程中,如果一个<span style="color: #0000FF">case</span>条目被选择,那么它对应的语句会被执行,然后中止这个线性搜索。如果没有<span style="color: #0000FF">case</span>条目被选择,那么会执行<span style="color: #0000FF">default case</span>条目中的语句。如果既没有<span style="color: #0000FF">case</span>条目被选择也没有指定<span style="color: #0000FF">default case</span>条目的话,那么不执行任何语句。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
对于一个被选择的<span style="color: #0000FF">case</span>条目,值<i>V</i>必须与模式匹配(模式标识符被赋值为<i>V</i>中对应的成员),并且,布尔过滤器表达式的计算结果必须为“真”(非零的确定值)。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
例子: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00268');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00268"><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>

...
VInt v<span style="color: #800080">;</span>
...

<span style="color: #0000FF">case</span> <span style="color: #800080">(</span>v<span style="color: #800080">)</span> <span style="color: #0000FF">matches</span>
    <span style="color: #0000FF">tagged</span> Invalid <span style="color: #800080">:</span> <span style="color: #0000FF">$display</span> <span style="color: #800080">(</span><span style="color: #575D94">&quot;v is Invalid&quot;</span><span style="color: #800080">);</span>
    <span style="color: #0000FF">tagged</span> Valid n <span style="color: #800080">:</span> <span style="color: #0000FF">$display</span> <span style="color: #800080">(</span><span style="color: #575D94">&quot;v is Valid with value %d&quot;</span><span style="color: #800080">,</span> n<span style="color: #800080">);</span>
<span style="color: #0000FF">endcase</span></pre></div></div>
<p class="Element10">
在上述的case语句中,如果<i>v</i>当前具有<i>Invalid</i>标签,那么第一个模式形成匹配。否则,它必须具有<i>Valid</i>标签,并且第二个模式形成匹配。标识符<i>n</i>被绑定到<i>Valid</i>成员的值,并且这个值被显示。当标签为<i>Invalid</i>的时候,我们不可能访问整数成员值<i>n</i>。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
例子: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00269');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00269"><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>
...
Instr instr;
...
<span style="color: #0000FF">case</span> <span style="color: #800080">(</span>instr<span style="color: #800080">)</span> <span style="color: #0000FF">matches</span>
    <span style="color: #0000FF">tagged</span> Add <span style="color: #800080">{</span>r1<span style="color: #800080">,</span>r2<span style="color: #800080">,</span>rd<span style="color: #800080">}</span> <span style="color: #800080">&amp;&amp; (</span>rd <span style="color: #800080">!=</span> <span style="color: #FF0000">0</span><span style="color: #800080">):</span> rf<span style="color: #800080">[</span>rd<span style="color: #800080">] =</span> rf<span style="color: #800080">[</span>r1<span style="color: #800080">] + </span>rf<span style="color: #800080">[</span>r2<span style="color: #800080">];</span>
    <span style="color: #0000FF">tagged</span> Jmp j <span style="color: #800080">:</span> <span style="color: #0000FF">case</span> <span style="color: #800080">(</span>j<span style="color: #800080">)</span> <span style="color: #0000FF">matches</span>
                       <span style="color: #0000FF">tagged</span> JmpU a <span style="color: #800080">:</span> pc <span style="color: #800080">=</span> pc <span style="color: #800080">+</span> a<span style="color: #800080">;</span>
                       <span style="color: #0000FF">tagged</span> JmpC <span style="color: #800080">{</span>c<span style="color: #800080">,</span>a<span style="color: #800080">}:</span> <span style="color: #0000FF">if</span> <span style="color: #800080">(</span>rf<span style="color: #800080">[</span>c<span style="color: #800080">])</span> pc <span style="color: #800080">=</span> a<span style="color: #800080">;</span>
<span style="color: #0000FF">                   endcase</span>

⌨️ 快捷键说明

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