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

📄 00063.html

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

<!-- Begin Popups -->
<div class="Element801" id="popup00217">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00865.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, 'popup00217');"><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="00038.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="00865.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="00064.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">
12.2 概述</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">
本章介绍了在对象内产生随机激励的基本概念和用法。SystemVerilog使用一个面向对象的方法来为对象的成员变量赋随机值,它以用户定义的约束为准。例如: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00392');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00392"><pre class="Element12"><span style="color: #0000FF">class</span> Bus<span style="color: #800080">;</span>
    <span style="color: #0000FF">rand bit</span><span style="color: #800080">[</span><span style="color: #FF0000">15</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: #0000FF">rand bit</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> data<span style="color: #800080">;</span>
    <span style="color: #0000FF">constraint</span> word_align <span style="color: #800080">{</span>addr<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><span style="color: #FF0000">2</span><span style="color: #800080">’</span><span style="color: #0000FF">b</span><span style="color: #FF0000">0</span><span style="color: #800080">;}</span>
<span style="color: #0000FF">endclass</span></pre></div></div>
<p class="Element10">
<i>Bus</i>类建模了一个简化的总线,它具有两个随机变量:<i>addr</i>和<i>data</i>,分别代表总线上的地址和数据。<i>word_align</i>约束指出:<i>addr</i>的随机值必须能够使<i>addr</i>字对齐(低两位为0)。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
<span style="color: #0000FF">randomize</span><span style="color: #800080">()</span>方法被调用以便为一个总线对象产生新的随机值: &nbsp;</p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00393');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00393"><pre class="Element12">Bus bus <span style="color: #800080">=</span> <span style="color: #0000FF">new</span><span style="color: #800080">;</span>

<span style="color: #0000FF">repeat </span><span style="color: #800080">(</span><span style="color: #FF0000">50</span><span style="color: #800080">)</span><span style="color: #0000FF"> begin</span>
    <span style="color: #0000FF">if</span> <span style="color: #800080">(</span>bus<span style="color: #800080">.</span><span style="color: #0000FF">randomize</span><span style="color: #800080">() == </span><span style="color: #FF0000">1</span><span style="color: #800080">)</span>
        <span style="color: #0000FF">$display</span> <span style="color: #800080">(</span><span style="color: #575D94">&quot;addr = %16h data = %h\n&quot;</span><span style="color: #800080">,</span> bus<span style="color: #800080">.</span>addr, bus<span style="color: #800080">.</span>data<span style="color: #800080">);</span>
    <span style="color: #0000FF">else</span>
        <span style="color: #0000FF">$display</span> <span style="color: #800080">(</span><span style="color: #575D94">&quot;Randomization failed.\n&quot;</span><span style="color: #800080">);</span>
<span style="color: #0000FF">end</span></pre></div></div>
<p class="Element10">
调用<span style="color: #0000FF">randomize</span><span style="color: #800080">()</span>会为一个对象中的所有的随机变量选择新的值以便所有的约束都为真(满足约束)。在上面的程序<i>test</i>中产生了一个总线对象,接着将这个对象随机化50次。每一次随机化都会检查结果是否成功。如果随机化成功,那么会打印<i>addr</i>和<i>data</i>的新值;如果随机化失败,那么会打印一条错误信息。在这个例子中,仅仅约束了<i>addr</i>的值,而<i>data</i>的值未被约束。未被约束的变量被赋值为它们声明范围内的任意值。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
约束编程是一个强大的方法,它使得用户能够构建通用的、可服用的对象,这些对象在以后可以被扩展或约束以便执行特定的功能。这个方法与传统的过程化和面向对象的编程不同,例如在下面这个扩展<i>Bus</i>类的例子中: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00394');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00394"><pre class="Element12"><span style="color: #0000FF">typedef enum</span> <span style="color: #800080">{</span>low<span style="color: #800080">,</span> mid<span style="color: #800080">,</span> high<span style="color: #800080">}</span> AddrType<span style="color: #800080">;</span>

<span style="color: #0000FF">class</span> MyBus <span style="color: #0000FF">extends</span> Bus<span style="color: #800080">;</span>
    <span style="color: #0000FF">rand</span> AddrType atype<span style="color: #800080">;</span>

    <span style="color: #0000FF">constraint</span> addr_range
    <span style="color: #800080">{</span>
        <span style="color: #800080">(</span>atype <span style="color: #800080">==</span> low <span style="color: #800080">)</span> <span style="color: #800080">-&gt;</span> addr <span style="color: #0000FF">inside</span> <span style="color: #800080">{[</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">15</span><span style="color: #800080">]};</span>
        <span style="color: #800080">(</span>atype <span style="color: #800080">==</span> mid <span style="color: #800080">)</span> <span style="color: #800080">-&gt;</span> addr <span style="color: #0000FF">inside</span> <span style="color: #800080">{[</span><span style="color: #FF0000">16</span><span style="color: #800080">:</span><span style="color: #FF0000">127</span><span style="color: #800080">]};</span>
        <span style="color: #800080">(</span>atype <span style="color: #800080">==</span> high<span style="color: #800080">)</span> <span style="color: #800080">-&gt;</span> addr <span style="color: #0000FF">inside</span> <span style="color: #800080">{[</span><span style="color: #FF0000">128</span><span style="color: #800080">:</span><span style="color: #FF0000">255</span><span style="color: #800080">]};</span>
    <span style="color: #800080">}</span>
<span style="color: #0000FF">endclass</span></pre></div></div>
<p class="Element10">
<i>MyBus</i>类从<i>Bus</i>类中继承了所有的随机变量和约束,并加入了一个被称为<i>atype</i>的随机变量,这个随机变量被用来使用另外一个约束控制地址的范围。<i>addr_range</i>约束根据<i>atype</i>的随机值隐含地选择三个范围约束中的一个。当一个<i>MyBus</i>对象被随机化的时候会计算<i>addr</i>、<i>data</i>、和<i>atype</i>的值以便所有的约束都能够满足。使用继承来构建分层的约束系统能够开发通用的模型,这些模型可以被约束以便执行专用的功能。&nbsp;</p>
<p class="Element10">
&nbsp;</p>
<p class="Element10">
对象还可以使用<span style="color: #0000FF">randomize</span><span style="color: #800080">()</span> <span style="color: #0000FF">with</span>作进一步约束,这个结构调用<span style="color: #0000FF">randomize</span><span style="color: #800080">()</span>并声明了额外的内联约束: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00395');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00395"><pre class="Element12"><span style="color: #0000FF">task</span> exercise_bus <span style="color: #800080">(</span>MyBus bus<span style="color: #800080">);</span>
    <span style="color: #0000FF">int</span> res<span style="color: #800080">;</span>

    <span style="color: #008000">// 例子1:限制低地址</span>
    res <span style="color: #800080">=</span> bus<span style="color: #800080">.</span><span style="color: #0000FF">randomize</span><span style="color: #800080">()</span> <span style="color: #0000FF">with</span> <span style="color: #800080">{</span>atype <span style="color: #800080">==</span> low<span style="color: #800080">;};</span>

    <span style="color: #008000">// 例子2:将地址限制在10和20之间</span>
    res <span style="color: #800080">=</span> bus<span style="color: #800080">.</span><span style="color: #0000FF">randomize</span><span style="color: #800080">()</span> <span style="color: #0000FF">with</span> <span style="color: #800080">{</span><span style="color: #FF0000">10</span> <span style="color: #800080">&lt;=</span> addr <span style="color: #800080">&amp;&amp;</span> addr <span style="color: #800080">&lt;=</span> <span style="color: #FF0000">20</span><span style="color: #800080">;};</span>

    <span style="color: #008000">// 例子3: 将数据值限制成2的n次方</span>
    res <span style="color: #800080">=</span> bus<span style="color: #800080">.</span><span style="color: #0000FF">randomize</span><span style="color: #800080">()</span> <span style="color: #0000FF">with</span> <span style="color: #800080">{</span>data <span style="color: #800080">&amp; (</span>data<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>
<span style="color: #0000FF">endtask</span></pre></div></div>
<p class="Element10">
这个例子演示了有关约束的几个重要特性:</p>
<ul class="Element630">
<li class="Element600">约束可以是任何带有integral类型(<span style="color: #0000FF">bit</span>、<span style="color: #0000FF">reg</span>、<span style="color: #0000FF">logic</span>、i<span style="color: #0000FF">nteger</span>、<span style="color: #0000FF">enum</span>、压缩结构体等等)的变量和常量表达式。</li>
<li class="Element600">约束解决器必须能够处理多种等式,例如代数因式分解、复杂的布尔表达式、以及混合整数和位的表达式。在上面的例子中,2的n次方约束使用算术表达式。它还可以用使用移位操作的表达式来定义。例如,<span style="color: #FF0000">1</span> <span style="color: #800080">&lt;&lt;</span> n,其中n是一个5位的随机变量。</li>

⌨️ 快捷键说明

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