<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Verification Martial Arts &#187; Coding Style</title>
	<atom:link href="http://www.vmmcentral.org/vmartialarts/category/tutorial/coding-style/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vmmcentral.org/vmartialarts</link>
	<description>A Blog on Verification Methodology</description>
	<lastBuildDate>Fri, 03 Feb 2012 03:34:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Using VMM template Generator to ramp up your testbench development</title>
		<link>http://www.vmmcentral.org/vmartialarts/2010/10/using-vmm-template-generator-to-ramp-up-your-testbench-development/</link>
		<comments>http://www.vmmcentral.org/vmartialarts/2010/10/using-vmm-template-generator-to-ramp-up-your-testbench-development/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 08:40:10 +0000</pubDate>
		<dc:creator>Amit Sharma</dc:creator>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Modeling Transactions]]></category>
		<category><![CDATA[Organization]]></category>
		<category><![CDATA[Performance Analyzer]]></category>
		<category><![CDATA[Scoreboarding]]></category>
		<category><![CDATA[Tools & 3rd Party interfaces]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[VMM infrastructure]]></category>

		<guid isPermaLink="false">http://www.vmmcentral.org/vmartialarts/?p=1987</guid>
		<description><![CDATA[Amit Sharma, Synopsys ‘vmmgen’, the template generator for creating robust, extensible VMM compliant environments, has been available for a long time with VMM and it was upgraded significantly with VMM1.2. Though the primary functionality of ‘vmmgen’ is to help minimize VIP and environment development cycle by providing detailed templates for developing VMM Compliant verification environments, [...]]]></description>
			<content:encoded><![CDATA[<p>
<strong>Amit Sharma, Synopsys</strong><br />
‘vmmgen’, the template generator for creating robust, extensible VMM compliant environments, has been available for a long time with VMM and it was upgraded significantly with VMM1.2. Though the primary functionality of ‘vmmgen’ is to help minimize VIP and environment development cycle by providing detailed templates for developing VMM Compliant verification environments, a lot of folks also use it to quickly understand how different VMM base classes can be used in different contexts. This is done as the templates uses a rich set of the latest VMM features to ensure the appropriate base classes and their features are picked up optimally. </p>
<p>Given that it has a wide user interaction mechanism which provides available features and options to the user, the user can pick up the modes which are most relevant to his or her requirement. It also provides them the option to provide their own templates thus providing a rich layer of customization. Based on the need, one can generate individual templates of different verification components or they can generate a complete verification environment which comes with a ’Makefile’ and an intuitive directory structure, thus propelling them on their way to catch the first set of bugs in their DUTs. I am sure all of you know where to pick up ‘vmmgen’ form. It available in the &lt;VMM_HOME&gt;/Shared/bin area or in $VCS_HOME/bin</p>
<p>Some of the rich set of features available now includes:</p>
<p>• Template Options: </p>
<p>– Complete environment generation </p>
<p>– Individual templates generation</p>
<p>• Options to create Explicitly phased environments or Implicitly phased environment or to mix Implicitly phased components and Explicitly phased components</p>
<p>• Usage of VMM Shorthand macros </p>
<p>• Creating RAL based environment, and providing Multiplexed domain support if required</p>
<p>• Hooking up VMM Performance Analyzer at the appropriate interfaces</p>
<p>• Hooking up the DS Scoreboard at the relevant interfaces (with options to chose from a range of integration options, e.g. : through callbacks, through TLM2.0 analysis ports, connect directly through to transactors, channels or notifications)</p>
<p>• Ability to hook up different generators (atomic, scenario, Multistream generators) at different interfaces</p>
<p>• Creating a scenario library and Multistream scenario creation</p>
<p>• Multi-driver generator support for different kinds of transactions in the same environment</p>
<p>• Factory support for transactions, scenarios and multi stream scenarios. Sample factory testcase which can explain the usage of transaction override from a testcase.</p>
<p>• ‘RTL config’ support for drivers and receivers.</p>
<p>• Various types of unidirectional and bi-directional TLM connections between generator and driver.</p>
<p>• Analysis ports/exports OR parameterized notify observers to broadcast the information from monitor to scoreboard and coverage collectors.</p>
<p>• Multi test concatenation support and management to run the tests</p>
<p>• Creating portable Interface wrapper object, and setting up interface connections to the testbench components using vmm_opts::set_object/get_object_obj </p>
<p>• Creating a Generic slave component</p>
<p>• Option to use default names or user provided names for different components</p>
<p>As you can see the above list itself is quite comprehensive and let me tell you that that it is not exhaustive as there are many more features in vmmgen.</p>
<p>With respect to the usage as well, there are multiple flavors. In the default mode, the user is taken through multiple detailed choices/options as he is creating/connecting different components in his verification environment. However, some folks might want to use ‘vmmgen’ within their own wrapper script/environment and for them there are options to generate the environments by providing all required options in the command line or through a configuration file&#8230; Some of these switches include</p>
<p><b><i></i></b></p>
<p><i>-SE [y/n]</i><b> : </b>Generates a complete environment with sub-environments <b></b></p>
<p><i>-RAL [y/n]</i><b> : </b>Create RAL based verification environments<b>     <br /></b></p>
<p><i>-RTL [y/n]</i><b> :</b> Generates RTL configuration for the environment</p>
<p><i>-ENV &lt;name&gt;, -TR &lt;name&gt;</i><b> :</b> Provide the name for the environment class and transaction classes. names for multiple transaction class names can be provide as well:</p>
<p><b></b><i>vmmgen –l sv –TR tr1+tr2</i></p>
<p><b></b></p>
<p><i>-cfg_file &lt;file_name&gt;</i><b> :</b> Option to provide a configuration file for the options</p>
<p>There is an option to generate an environment quickly by taking the user through the minimum number of questions (-q).</p>
<p>Additionally, the user can provide his or her own templates through the –L &lt;template directory&gt; option.</p>
<p>As far as individual template generation goes, you have the complete list. Here, I am outlining this down for reference:</p>
<p>&#160;</p>
<p>&#160;</p>
<p><a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMTAvaW1hZ2UucG5n"><img style="border-bottom: 0px;border-left: 0px;float: none;margin-left: auto;border-top: 0px;margin-right: auto;border-right: 0px" border="0" alt="image" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2010/10/image_thumb.png" width="704" height="411" /></a></p>
<p>I am sure a lot of you have already been using ‘vmmgen’. For those, who haven’t, I encourage you to try out the different options with it. I am sure you will find this immensely useful and it will not only help you create verification components and environments quickly but will also make sure they are optimal and appropriate based on your requirements.</p>
 <img src="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?view=1&post_id=1987" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.vmmcentral.org/vmartialarts/2010/10/using-vmm-template-generator-to-ramp-up-your-testbench-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using VMM Consensus to end your test</title>
		<link>http://www.vmmcentral.org/vmartialarts/2010/08/using-vmm-consensus-to-end-your-test/</link>
		<comments>http://www.vmmcentral.org/vmartialarts/2010/08/using-vmm-consensus-to-end-your-test/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 21:59:07 +0000</pubDate>
		<dc:creator>JL Gray</dc:creator>
				<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[VMM]]></category>

		<guid isPermaLink="false">http://www.vmmcentral.org/vmartialarts/2010/08/using-vmm-consensus-to-end-your-test/</guid>
		<description><![CDATA[Asif Jafri, Verification Consultant, Verilab One topic that is often overlooked is how does one end a test. One common approach has been to use pound delays or count the number of transactions generated. While this worked well for directed test environments this approach is not well suited for use with constrained random testbenches. Usually [...]]]></description>
			<content:encoded><![CDATA[<h3>Asif Jafri, Verification Consultant, <a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52ZXJpbGFiLmNvbQ==">Verilab</a></h3>
<div><span style="font-family: Verdana;">One topic that is often overlooked is how does one end a test. One common approach has been to use pound delays or count the number of transactions generated. While this worked well for directed test environments this approach is not well suited for use with constrained random testbenches. Usually there are several threads running in parallel and to be able to intelligently tell whether all test criterions are met, we need a more centralized approach to manage and decide test completion. vmm_group now has a mechanism to centrally manage test completion with the use of VMM Consensus.To better explain the usage let’s try to build an example:</span></div>
<div><span style="font-family: Verdana;"></span></div>
<p><span style="font-family: Verdana;"></p>
<div><span style="font-family: Verdana;"><span style="font-family: Verdana;">1.    Instantiate a vmm_voter class to indicate consensus or oppose end of test.<br />
vmm_voter     end_voter;<br />
2.    Identify the participants that will need to consent before the test ends. These participants can be in the form of transactors which will consent when idle, channels consent when empty, notifications and vmm_consensus.  Add the voters in the vmm_group::build_ph()<br />
vmm_consensus::register_*<br />
3.    Add vmm_consensus::wait_for _consensus() to vmm_group::wait_for_end() method. Once all participants consent, the test will complete.</span></span></div>
<div><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </span></span></div>
<p><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </p>
<p></span></span> </p>
<p></span></p>
<div><span style="font-family: Verdana;"><br />
class tb_top extends vmm_group;<br />
`vmm_typename(tb_top)vmm_voter    end_voter;</span></div>
<div><span style="font-family: Verdana;">function void build_ph();<br />
    transaction_channel     master_chan;<br />
    slave_transactor          slave_xactor;<br />
    end_voter =  end_vote.register_channel(master_chan);<br />
    end_voter = end_vote.register_xactor(slave_xactor);<br />
endfunction</span></div>
<p><span style="font-family: Verdana;">task wait_for_end();<br />
     super.wait_for_end();<br />
     end_vote.wait_for_consensus();<br />
endtask</p>
<p>endclass: tb_top </p>
<p>The code above shows how we can instantiate various voters that will participate in the test completion.</p>
<div><span style="font-family: Verdana;"><span style="font-family: Verdana;">The figure below shows how a participant opposes test completion, while all other participants have given consent.</span></span></div>
<div><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </span></span></div>
<p><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </p>
<p></span></span> </p>
<p></span></p>
<p><a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDgvaW1hZ2UzLnBuZw=="><span style="color: #333333; font-family: Verdana;"><img style="border-width: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2010/08/image_thumb3.png" border="0" alt="image" width="612" height="328" /></span></a><span style="font-family: Verdana;"> </span></p>
<div><span style="font-family: Verdana;">One of the simplest forms of usage is to oppose completion using the command above before a completing some given task like programming registers or pulling reset and then giving consent by using the command:  this.consent(“Programming Completed”); <span style="font-family: Verdana;"><span style="font-family: Verdana;">There is often a need to force consensus to end a test if one of the opposing blocks is not releasing. This can be achieved by using the forced command.</span></span></span></div>
<div><span style="font-family: Verdana;"><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </span></span></span></div>
<p><span style="font-family: Verdana;"><span style="font-family: Verdana;"><span style="font-family: Verdana;"> </p>
<p></span></span> </p>
<p></span></p>
<p><a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDgvaW1hZ2U0LnBuZw=="><span style="color: #333333; font-family: Verdana;"><img style="border-width: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2010/08/image_thumb4.png" border="0" alt="image" width="620" height="327" /></span></a><span style="font-family: Verdana;"> </span></p>
<p><span style="font-family: Verdana;">You can choose to use the consensus_force_thru command to pass to propagate the force up.</span></p>
<p><a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDgvaW1hZ2U1LnBuZw=="><span style="color: #333333; font-family: Verdana;"><img style="border-width: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2010/08/image_thumb5.png" border="0" alt="image" width="601" height="390" /></span></a><span style="font-family: Verdana;"> </span></p>
<p><span style="font-family: Verdana;">Using these techniques to end your test will make your testbench scalable and reusable over various projects.</span></p>
<p><span style="font-family: Verdana;"> </span></p>
<p><span style="font-family: Verdana;"> </span></p>
 <img src="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?view=1&post_id=1814" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.vmmcentral.org/vmartialarts/2010/08/using-vmm-consensus-to-end-your-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using vmm_opts to create a configurable environment</title>
		<link>http://www.vmmcentral.org/vmartialarts/2010/07/using-vmm_opts-to-create-a-configurable-environment/</link>
		<comments>http://www.vmmcentral.org/vmartialarts/2010/07/using-vmm_opts-to-create-a-configurable-environment/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 17:13:56 +0000</pubDate>
		<dc:creator>S. Prashanth</dc:creator>
				<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.vmmcentral.org/vmartialarts/2010/07/using-vmm_opts-to-create-a-configurable-environment/</guid>
		<description><![CDATA[S. Prashanth, Verification &#38; Design Engineer, LSI Logic To accommodate changing specifications and to support different clusters/subsystems which would have multiple processors/memory connected through a bridge), I am building a reusable environment which can support any number of masters and slaves of any standard bus protocols.  The environment requires high level of configurability since it [...]]]></description>
			<content:encoded><![CDATA[<h3><span style="font-family: Verdana;">S. Prashanth, Verification &amp; Design Engineer, LSI Logic</span></h3>
<p><span style="font-family: Verdana;">To accommodate changing specifications and to support different clusters/subsystems which would have multiple processors/memory connected through a bridge), I am building a reusable environment which can support any number of masters and slaves of any standard bus protocols.  The environment requires high level of configurability since it should work for different DUTs. So, I decided to use vmm_opts not just to set the switches globally/hierarchically, but also to specify the ranges (like setting address ranges in scenarios) from the test cases/command line. </span></p>
<p><span style="font-family: Verdana;">I created a list of controls/switches that need to be provided as global options (like simulation timeout, scoreboard/coverage enable, etc)  and hierarchical options  to control instance specific behaviors (like number of transactions to be generated ,  burst enables, transaction speed, address ranges to be generated by a specific instance, set of instances, etc).  Let’s see how these options can be used and what all things are required for it through examples. </span></p>
<p><span style="font-family: Verdana;"><strong>Global Options<br />
</strong></span><span style="font-family: Verdana;"><br />
Step 1:<br />
Declare an integer, say simulation_timeout in the environment class or wherever it is required and use vmm_opts::get_int(..) method as shown below. Specify a default value as well just in case, if the variable is not set anywhere. </span></p>
<p><span style="font-family: Verdana;">simulation_timeout = vmm_opts::get_int(“TIMEOUT”, 10000); </span></p>
<p><span style="font-family: Verdana;">Step 2:<br />
Then either at the test case or/and at the command line, I can override the default value using vmm_opts::set_int  or +vmm_opts+ runtime option. </span></p>
<p><span style="font-family: Verdana;">Override from the test case. </span></p>
<p><span style="font-family: Verdana;">vmm_opts::set_int(“%*:TIMEOUT”, 50000); </span></p>
<p><span style="font-family: Verdana;">Override from the command line. </span></p>
<p><span style="font-family: Verdana;">./simv +vmm_opts+TIMEOUT=80000 </span></p>
<p><span style="font-family: Verdana;">Options can also be overridden from a command file, if it is difficult to specify all options in the command line. Also, options can be a string or Boolean as well. </span></p>
<p><span style="font-family: Verdana;"> </span></p>
<p><span style="font-family: Verdana;"><strong>Hierarchical Options<br />
</strong><br />
In order to use hierarchical options, I am building the environment with parent/child hierarchy which is a very useful feature of vmm_object. This is required since the hierarchy specified externally (from test case/command line) will be used to map the hierarchy in the environment. </span></p>
<p><span style="font-family: Verdana;">Step 1:<br />
Declare options, say burst_enable and num_of_trans in a subenv class and use vmm_opts::get_object_bit(..) and vmm_opts::get_object_int(..) to retrieve appropriate values passing current hierarchy and default values as arguments. Also, for setting ranges, declare min_addr and max_addr, and use get_object_range(). </span></p>
<p><span style="font-family: Verdana;">class master_subenv extends vmm_subenv;<br />
bit burst_enable;<br />
int num_of_trans;<br />
int min_addr;<br />
int max_addr; </span></p>
<p><span style="font-family: Verdana;"> function void configure();<br />
bit is_set; //to determine if the default value is overridden<br />
burst_enable = vmm_opts::get_object_bit(is_set, this, “BURST_ENABLE”);<br />
num_of_trans = vmm_opts::get_object_int(is_set, this, “NUM_TRANS”, 100);<br />
vmm_opts::get_object_range(is_set, this, “ADDR_RANGE”, min_addr, max_addr, 0, 32’hFFFF_FFFF);<br />
….<br />
endfunction </span></p>
<p><span style="font-family: Verdana;">endclass<br />
</span></p>
<p><span style="font-family: Verdana;">Step 2:<br />
Build the environment with parent/child hierarchy either by passing the parent handle through the constructor to every child, or using vmm_object::set_parent_object() method. This is easy as almost all base classes are extended from vmm_object by default. </span></p>
<p><span style="font-family: Verdana;">class  dut_env extends vmm_env;<br />
virtual function build();<br />
…..<br />
mst0 = new(“MST0”, ….);<br />
mst0.set_parent_object(this);<br />
mst1 = new(“MST1”, …);<br />
mst1.set_parent_object(this);<br />
….<br />
endfunction<br />
endclass </span></p>
<p><span style="font-family: Verdana;">Step 3:<br />
From the test case, I can override the default value using vmm_opts::set_bit or vmm_opts::set_int(..) specifying the hierarchy. I can use pattern matching as well to avoid specifying to every instance </span></p>
<p><span style="font-family: Verdana;">vmm_opts::set_int(“%*:MST0:NUM_TRANS”, 50);<br />
vmm_opts::set_int(“%*:MST1:NUM_TRANS”, 100);<br />
vmm_opts::set_bit(“%*:burst_enable);<br />
vmm_opts::set_range(“%*:MST1:ADDR_RANGE”, 32’h1000_0000, 32’h1000_FFFF); </span></p>
<p><span style="font-family: Verdana;">I can also override the default value from the command line as well.<br />
./simv +vmm_opts+NUM_TRANS=50@%*:MST0+NUM_TRANS=100@%*:MST1+burst_enable@%* </span></p>
<p><span style="font-family: Verdana;"><br />
In summary, vmm_opts provides a powerful and user friendly way of configuring the environment from the command line or the test case. User can provide explanation of each of the options while calling get_object_*() and get_*() methods which will be displayed when vmm_opts::get_help() is called. </span></p>
 <img src="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?view=1&post_id=1573" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.vmmcentral.org/vmartialarts/2010/07/using-vmm_opts-to-create-a-configurable-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VMM data macros are cool, but how do I customize the constructor?</title>
		<link>http://www.vmmcentral.org/vmartialarts/2009/08/vmm-data-macros-are-cool-but-how-do-i-customize-the-constructor/</link>
		<comments>http://www.vmmcentral.org/vmartialarts/2009/08/vmm-data-macros-are-cool-but-how-do-i-customize-the-constructor/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 00:41:15 +0000</pubDate>
		<dc:creator>Shankar Hemmady</dc:creator>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Modeling]]></category>

		<guid isPermaLink="false">http://www.vmmcentral.org/vmartialarts/?p=288</guid>
		<description><![CDATA[Srinivasan Venkataramanan, CVC Pawan Bellamkonda, Brocade During our recent VMM training at CVC, we learned about VMM data member macros, and our engineers liked it. Some of our teams at Brocade have started adopting it in their projects right away! We see that we can avoid much of the lengthy code and increase readability with [...]]]></description>
			<content:encoded><![CDATA[<p><img style="display: inline; border-width: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2009/08/srinivasan_venkataraman.jpg" border="0" alt="Srinivasan Venkataraman" /><img style="display: inline; border: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2009/09/pawan1.jpg" border="0" alt="Pawan Bellamkonda" /><strong>Srinivasan Venkataramanan, CVC</strong></p>
<p><strong>Pawan Bellamkonda, Brocade</strong></p>
<p>During our recent VMM training at CVC, we learned about VMM data member macros, and our engineers liked it. Some of our teams at Brocade have started adopting it in their projects right away! We see that we can avoid much of the lengthy code and increase readability with these new macros. We will surely avoid making silly mistakes which might be hard to debug later.</p>
<p>However as with any built-in automation, there are always scenarios where-in user level customization of some or all of the methods is required. VMM provides this flexibility for overriding the default behavior of virtual methods of <em>vmm_data</em> class. In one of our blocks we needed to tweak the constructor of the transaction. One question that perplexed us was:</p>
<p>“I have built a transaction class extending from <em>vmm_data</em>. We have used the short hand macro <em>`vmm_data_member</em>…..  to get all the functions automatically. But while creating an object of this transaction, we want to pass a configuration class object as argument in the new function. How should we override the <strong><em>new</em>()</strong> function alone when we use the short hand macros? When we tried using do_new() (like overriding other functions), it did not work.”</p>
<p>As we explored a bit, we found another macro specifically meant for this:</p>
<blockquote><p>`vmm_data_new(&lt;class_name&gt;)</p></blockquote>
<p>This macro should be used <span style="text-decoration: underline;">before</span> the beginning of data-member macros. This lets the succeeding macros do all the work except the “<em>new</em>” function implementation.</p>
<blockquote><p>class s2p_xactn extend vmm_data;<br />
rand bit [7:0] pkt_len, pkt_pld;</p>
<p><strong>`vmm_data_new(s2p_xactn)</strong><br />
function new(int my_own_arg = 2);<br />
`vmm_note (log, $psprintf (“my val is %0d”, my_own_arg));<br />
endfunction : new</p>
<p>`vmm_data_member_begin(s2p_xactn)<br />
`vmm_data_member_scalar(pkt_len, DO_ALL)<br />
`vmm_data_member_scalar(pkt_pld, DO_ALL)<br />
`vmm_data_member_end(s2p_xactn)<br />
endclass : s2p_xactn</p></blockquote>
<p>As with traditional martial arts, functional verification too has some slightly different styles/requirements that makes each project interesting and unique. To its credit, we feel that VMM is as proven as traditional martial arts: it can be tailored to different requirements while providing a standardized means of combat.</p>
 <img src="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?view=1&post_id=288" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.vmmcentral.org/vmartialarts/2009/08/vmm-data-macros-are-cool-but-how-do-i-customize-the-constructor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VMM VIP’s on multiple buses</title>
		<link>http://www.vmmcentral.org/vmartialarts/2009/05/vmm-vip%e2%80%99s-on-multiple-buses/</link>
		<comments>http://www.vmmcentral.org/vmartialarts/2009/05/vmm-vip%e2%80%99s-on-multiple-buses/#comments</comments>
		<pubDate>Wed, 27 May 2009 14:09:00 +0000</pubDate>
		<dc:creator>Adiel Khan</dc:creator>
				<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[MODs]]></category>
		<category><![CDATA[Register Abstraction Model with RAL]]></category>
		<category><![CDATA[Reuse]]></category>
		<category><![CDATA[Structural Components]]></category>
		<category><![CDATA[VMM]]></category>

		<guid isPermaLink="false">http://www.vmmcentral.org/vmartialarts/?p=119</guid>
		<description><![CDATA[Favouritism for constructs can influence coding styles that can influence reuse methodology ease of use. ]]></description>
			<content:encoded><![CDATA[<h1><a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvd3AtY29udGVudC91cGxvYWRzLzIwMDkvMDUvaW1hZ2UucG5n"><img style="display: inline; border-width: 0px;" src="http://www.vmmcentral.org/vmartialarts/wp-content/uploads/2009/05/image-thumb.png" border="0" alt="image" width="154" height="104" /></a></h1>
<h3>Adiel Khan, Synopsys CAE</h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">Increasingly, more design-oriented engineers are writing VMM code. Some are trying to map typically good design architecture practices to verification development. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">A dangerous mapping is parameterization, from modules to classes. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">In my old Verilog testbenches I would develop reusable modules and use #parameters extensively to control the settings of the modules I was instantiating. (It was a sad day when I heard IEEE was deprecating my friend the defparam). </span></p>
<blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">module </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vip #(</span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">parameter int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">data_width = </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">,</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; text-align: left;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">2.</span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> parameter int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">addr_width = </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">)</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">3</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> (addr, data);</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">4.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> output </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[addr_width-</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] addr;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">5</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> inout<span style="mso-spacerun: yes;"> </span></span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[data_width-</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] data;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">6</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> &#8230;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">7</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">endmodule</span></strong></p>
</blockquote>
<p class="Code-numbered" style="text-indent: 0in; mso-list: none;">
<p class="Code-numbered" style="text-indent: 0in; mso-list: none;"><span lang="EN-GB">This would allow me to instantiate this VIP for many bus variants.</span><span style="font-size: 10pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">8.<span style="mso-spacerun: yes;"> </span> </span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vip</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> #(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">)<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vip_inst1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(&#8230;); </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">9</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span>vip #(</span><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">128</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">) </span><span style="font-size: 10pt; color: #ff6600; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vip_inst2</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(&#8230;); </span></p>
</blockquote>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">Mapping the approach from modules to classes, I could end up with: </span></p>
<blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_c #( </span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">parameter int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">data_size=</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">2</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span><span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> parameter int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">addr_size=</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">)</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">3</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span><span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> extends </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_data;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">4</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> rand bit </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[addr_size-</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] addr;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">5</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span><span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> rand bit </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[data_size-</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] data;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">6</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span> &#8230;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">7</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">endclass</span></strong><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">8</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//specialized</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">with</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">&amp;</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">sizes</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">9</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span>pkt_c #(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">) pkt1=</span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">new</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">();</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">10</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//specialized</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">with</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">&amp;</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">128</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">sizes</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">11</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-tab-count: 1;"> </span>pkt_c #(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">128</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">) pkt2=</span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">new</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(); </span></p>
</blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><br />
</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;"><span style="mso-ansi-language: en-us; mso-bidi-font-family: 'Courier New';">Be warned, in the SystemVeril<span style="mso-bidi-font-style: italic;">og testbench </span>c<span style="mso-bidi-font-style: italic;">entri</span>c<span style="mso-bidi-font-style: italic;"> vie</span>w<span style="mso-bidi-font-style: italic;"> o</span>f<span style="mso-bidi-font-style: italic;"> </span>V<span style="mso-bidi-font-style: italic;">IP </span>r<span style="mso-bidi-font-style: italic;">eusability</span></span><span lang="EN-GB">, parameterization of classes leads to a dead-end path. Moving one layer of abstraction up, I really don’t care if it is a 32/64/128 bits wide interfaces. What I want to do is use pkt_c around the verification environment. </span><span lang="EN-GB">The simplest case is creating a reusable driver using pkt_c to drive any bus-width interface. </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;"><span lang="EN-GB">However, if I try to use a generic class instantiation, I will get a specialization with parameters = 16&amp;16. I cannot perform the $cast() to put the right pkt_c type onto the bus. </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;"><span lang="EN-GB"><br />
</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;">
<blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_driver_c </span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">extends </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_xactor;</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">2</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> virtual protected task </span></strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">main</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">();</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">3</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span><span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> forever begin </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">: GET_OBJ_TO_SEND</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">4</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> pkt_c pkt_to_send; </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//default</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">instance</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">5</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> pkt_c #(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">) pkt_created; </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">6</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> randomize</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(pkt_created);</span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">generator</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">code</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">7</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> $cast</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(pkt_to_send, pkt_created); </span><strong><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//FAILS</span></em></strong><strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></strong><strong><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">!!!!!</span></em></strong><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></em></p>
</blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><em> </em></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">If you are using VMM channels, they must similarly be specialized and cannot carry generic parameterized classes: </span></p>
<blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">8</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: #a014f0; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">`vmm_channel</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(pkt_c)</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">9</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_driver_c </span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">extends </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_xactor;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">10</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> pkt_c_channel in_chan;<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//Can</span></em><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">only</span></em><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">carry</span></em><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_c#(16,16)!!! </span></em></p>
</blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><em> </em></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">Or you must upfront select which specialization you want for use with a parameterized channel. </span></p>
<blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">8</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_driver_c </span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">extends </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_xactor;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">9</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> vmm_channel_typed #(</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_c#(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">)) </span><span style="color: black; mso-bidi-font-family: 'Courier New';"> </span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">in_chan</span><span style="color: black; mso-bidi-font-family: 'Courier New';">; </span></p>
</blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="color: black; mso-bidi-font-family: 'Courier New';"><br />
</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;"><span lang="EN-GB">Hence, for the driver to operate on the correct object type, I need to instantiate the exact specialization throughout my entire environment and make the driver itself parameterized. Now you can clearly see instantiating a specific specialization in the driver (or monitor, scoreboard etc) stops the code from being really reusable for other bus_widths. </span></p>
<blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;"><span lang="EN-GB"><br />
</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;">
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span>pkt_c<span style="mso-spacerun: yes;"> </span>#(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">)<span style="mso-spacerun: yes;"> </span>pkt_to_send;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">2</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span>pkt_driver_c #(</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">64</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">32</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">) driver; </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; text-indent: 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><br />
</span></p>
</blockquote>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; text-align: justify; mso-layout-grid-align: none;">
<p><span lang="EN-GB">A better approach is one that was described by Janick in the <a href="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52bW1jZW50cmFsLm9yZy92bWFydGlhbGFydHMvP3A9MTM=">“Size Does Matter”</a> blog of using `define. Let’s expand on this and see how it works for reusable VIPs. Well, the first thing that comes to my mind is that a `define is a global namespace macro with a single value, whereas I am using my VIP with 2 different bus architectures. Therefore, the `define alone is not enough: you also need a local constant to be able to exclude unwanted bits when you have a VIP instantiated for various bus widths. </span></p>
<blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">1</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">//default</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">define</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">values</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">2</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span><strong>`define</strong> MAX_DATA_SIZE </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">3</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span><strong>`define</strong> MAX_ADDR_SIZE </span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">4</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">class </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkt_c </span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">extends </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_data;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">5</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> static </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">vmm_log log = </span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">new</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(</span><span style="font-size: 10pt; color: #cc00cc; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">&#8220;Pkt&#8221;</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, </span><span style="font-size: 10pt; color: #cc00cc; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">&#8220;class&#8221;</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">);</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">6</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> //instance</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">constant</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">to</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">control</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">actual</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">bus</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">sizes</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">7</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> const int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">addr_size;</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">8</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> logic </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[<strong>`MAX_ADDR_SIZE</strong>:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] addr;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">9</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> logic </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">[<strong>`MAX_DATA_SIZE</strong>:</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">] data;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">10</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> //</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pass</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">a_size</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">as</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">arg</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">to</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">coverage</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">11</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> //</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">ensuring</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">valid</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">coverage</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">ranges.</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">12</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> covergroup </span></strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">cg </span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(</span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">a_size);</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">13</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> coverpoint </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">addr</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">14</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> {</span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">bins </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">ad_bin[] = {[</span><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">0</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">:a_size]};}</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">15</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> endgroup</span></strong><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">16</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> //</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">sizes</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">specialized</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">at</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">construction</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">for</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">pkts</span></em></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">17</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> //</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">on</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">buses</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">less</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">than</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">MAX</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">bus</span></em><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span><em><span style="font-size: 10pt; color: gray; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">widths</span></em><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">18</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> function </span></strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">new</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(</span><strong><span style="font-size: 10pt; color: darkred; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">int </span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">a_s=<strong>`MAX_ADDR_SIZE</strong>);</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">19</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> addr_size = a_s;</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">20</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span> cg = </span><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">new</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(addr_size);</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">21</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: #a014f0; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> `vmm_note</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(log, </span><strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">$psprintf</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(</span><span style="font-size: 10pt; color: #cc00cc; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">&#8220;\nADDR_TYPE: &#8220;</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">,</span><strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">$typename</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(addr), </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">22</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: #cc00cc; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> &#8220;\nDATA_TYPE: &#8220;</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">,</span><strong><span style="font-size: 10pt; color: #ff6600; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">$typename</span></strong><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">(data),</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">23</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"> </span></span><span style="font-size: 10pt; color: #cc00cc; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> &#8220;\nMAX_BUS_SIZE: &#8220;</span><span style="font-size: 10pt; color: black; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">, addr_size));</span><span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">24</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;">.<span style="mso-spacerun: yes;"> </span></span><strong><span style="font-size: 10pt; color: darkred; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us;"> endfunction<span style="mso-spacerun: yes;"> </span></span></strong></p>
</blockquote>
<p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; line-height: normal; mso-layout-grid-align: none;"><strong> </strong></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><span style="mso-ansi-language: en-us; mso-bidi-font-family: 'Courier New';">The<span style="mso-bidi-font-weight: bold;"> code above </span><span style="mso-bidi-font-style: italic;">al</span>l<span style="mso-bidi-font-style: italic;">ows</span> for</span><span lang="EN-GB"> a default implementation and all the user needs to do is set the `MAX_ADDR_SIZE and `MAX_DATA_SIZE symbols and all the code will be fully reusable across drivers, monitors, subenv, SoC etc. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">For situations where two VIP’s of differing bus architectures are used, the compiler symbols need to be set to the biggest bus architecture in the system; smaller bus-widths are set using addr_size. It is not necessary for addr_size variable to be an instance constant or set during construction. By using instance constants, this ensures the bus-widths are not changed at runtime by users. Having the value of addr_size set during construction gives the users the flexibility to setup the object as they want. For pseudo-static objects such as drivers, monitors, subenvs, masters, slaves, scoreboards etc you should check the construction of verification modules for your particular design architecture during the vmm_env::start phase. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">N.B not shown above, but assumed, is that the addr_size variable would be used to ensure correct masking occurs when performing do_pack(), do_unpack() compare() etc. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">Just to wrap up some loose ends&#8230; </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">I’m not totally discounting the merits of parameterized classes just insuring people look at all the options. For instance you could parameterize everything and then set the SIZE at the vmm_subenv level and map the SIZE parameters to all other objects. At some point you will want to monitor or scoreboard across different bus-widths and then the parameterized class casting will bite you, reducing you to manually mapping the members within the comparison objects. There is a time and place for everything, so probably need another blog showing merits and where to use parameterized classes. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">The vmm_data class is not the only place you might need to know the size of the bus, the same `define &amp; instance constant technique can be used throughout your VIP classes. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">This blog does not discuss the pros and cons of putting coverage groups in your data object class. I merely used the covergroup in the data-object as a vehicle to demonstrate how you can make your classes more reusable. I think a separate blog about where best to put coverage will clarify the usage models. </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-GB">All the code snippets can be run with VCS-2009.06 &amp; VMM1.1. Contact me for more complete code examples and bugs or issues you find. </span></p>
<p class="MsoNormal" style="text-align: justify;">
 <img src="http://www.vmmcentral.org/vmartialarts/wp-content/plugins/feed-statistics.php?view=1&post_id=119" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.vmmcentral.org/vmartialarts/2009/05/vmm-vip%e2%80%99s-on-multiple-buses/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

