<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9056833869813916856</id><updated>2024-08-28T12:17:50.262-07:00</updated><category term="Verilog"/><category term="VLSI"/><category term="Module Instantiation"/><category term="Bit-Select"/><category term="Block Statement"/><category term="Built-in Primitives"/><category term="Case Statement"/><category term="Comments"/><category term="Compiler Directives"/><category term="Conditional Operator"/><category term="Continuous Assignments"/><category term="Conversion Functions"/><category term="Delays"/><category term="Disable Statement"/><category term="Display Tasks"/><category term="Edge Sensitive Path"/><category term="Expression Bit Length"/><category term="File I/O Functions"/><category term="Functions"/><category term="Identifiers"/><category term="If Statement"/><category term="Integer Constants"/><category term="Intra-assignment Timing Controls"/><category term="Loop Statements"/><category term="Memories"/><category term="Module Declaration"/><category term="Module Path Declaration"/><category term="Module Path Polarity"/><category term="Net Data Types"/><category term="Operators"/><category term="PLA Modeling Tasks"/><category term="Parameters"/><category term="Part-select"/><category term="Perl Script"/><category term="Probabilistic Distribution Functions"/><category term="Procedural Assignments"/><category term="Procedural Continuous Assignments"/><category term="Procedural Timing Control"/><category term="Range Specification"/><category term="Real Constants"/><category term="Register Data Types"/><category term="Simulation Control Tasks"/><category term="Simulation Time Functions"/><category term="Specify Block"/><category term="State Dependent Path"/><category term="Stochastic Analysis Tasks"/><category term="Strengths"/><category term="Strings"/><category term="Structured Procedures"/><category term="Tasks"/><category term="Timing Check Tasks"/><category term="Tricks n Tips"/><category term="UDP Declaration"/><category term="UDP Instantiation"/><category term="UDP State Table"/><category term="Value Change Dump (VCD) File"/><category term="Vectors"/><category term="Verilog Keywords"/><category term="Verilog LRM"/><category term="Verilog Tips and Tricks"/><category term="min typ max Delays"/><category term="verilog bit shifting"/><title type='text'>Verilog Tutorial</title><subtitle type='html'>A Verilog-HDL OnLine tutorial. This is an interactive, self-directed introduction to the Verilog language complete with examples. It covers the full language, including UDPs and PLI.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-7003854595948729867</id><published>2013-01-08T18:41:00.001-08:00</published><updated>2013-01-12T23:58:55.637-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Perl Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Tricks n Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><title type='text'>Creating .lib file from Verilog netlist</title><content type='html'>&lt;p&gt;Creating a dummy .lib file is something every physical design engineer has done now and then. If you have a verilog model of the block available, your task gets easier. The following script automates .lib generation from your verilog netlist. Use this as a dummy .lib to get your design flow going or use it as a template for your analog blocks for modifying the values.  &lt;p&gt;Customize, edit and use. The script creates a simple Data Structure. So any modification can be done pretty easily. The script parses the verilog for the module name specified, and collects the ports &amp;amp; directions. In the .lib file written out, a default capacitance and transition value is specified. This is a good starting point for your blocks.  &lt;p&gt;&lt;code&gt;Usage: create_lib &amp;lt;verilog_netlist&amp;gt; &amp;lt;module_name&amp;gt; [transition_value] [capacitance_value]&lt;/code&gt;  &lt;p&gt;#!/usr/bin/perl  &lt;p&gt;use strict;  &lt;p&gt;if ($#ARGV &amp;lt; 1 ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;usage: create_lib &amp;lt;verilog_netlist&amp;gt; &amp;lt;module_name&amp;gt; \n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit;&lt;br&gt;}  &lt;p&gt;my $netlist = $ARGV[0] ;&lt;br&gt;my $module&amp;nbsp; = $ARGV[1] ;&lt;br&gt;my $tran = 2.5 ;&lt;br&gt;my $cap = 0.001;&lt;br&gt;my $signal_level = &quot;VDD&quot; ;  &lt;p&gt;if(defined $ARGV[2]) {$tran = $ARGV[2];}&lt;br&gt;if(defined $ARGV[3]) {$cap = $ARGV[3];}&lt;br&gt;if(defined $ARGV[4]) {$signal_level = $ARGV[4];}  &lt;p&gt;my $FF;&lt;br&gt;my $FO;&lt;br&gt;open $FF, &quot;&amp;lt; $ARGV[0]&quot; or die &quot;Can&#39;t open $ARGV[0] : $!&quot;;&lt;br&gt;open $FO, &quot;&amp;gt;$module.lib&quot; or die &quot;Can&#39;t open $module.lib for write : $!&quot;;  &lt;p&gt;my $db = createTopLevelDB(); &lt;br&gt;createDotLib($db,$FO);  &lt;p&gt;sub createDotLib&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $topLevelDBRef = shift;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $FO = shift ;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ### Header &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;library\($topLevelDBRef-&amp;gt;{&#39;design&#39;}-&amp;gt;{&#39;cell&#39;}\) {\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;\n /* unit attributes */\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; time_unit : \&quot;1ns\&quot;\;\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; voltage_unit : \&quot;1V\&quot;\;\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; current_unit : \&quot;1uA\&quot;\;\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; pulling_resistance_unit : \&quot;1kohm\&quot;\;\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; leakage_power_unit : \&quot;1nW\&quot;\;\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp; capacitive_load_unit\(1,pf\)\;\n\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $direction (keys(%{$topLevelDBRef-&amp;gt;{&#39;bus&#39;}})) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $bus_type (keys %{$topLevelDBRef-&amp;gt;{&#39;bus&#39;}-&amp;gt;{$direction}}) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @bus_width =&amp;nbsp; split(/_/, $bus_type); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_hi = $bus_width[1] ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_lo = $bus_width[2] ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_width = $bus_hi+1-$bus_lo;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot; type \($bus_type\) { \n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; base_type : array ; \n&quot; ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; data_type : bit&amp;nbsp; \n&quot; ;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; bit_width : $bus_width&amp;nbsp;&amp;nbsp; \n&quot; ;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; bit_from : $bus_hi&amp;nbsp; \n&quot; ;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; bit_to : $bus_lo ; \n&quot; ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;&amp;nbsp;&amp;nbsp; downto : true ; \n&quot; ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot; } \n&quot; ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO &quot;\n&amp;nbsp; cell\($topLevelDBRef-&amp;gt;{&#39;design&#39;}-&amp;gt;{&#39;cell&#39;}\) {\n&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $direction (keys(%{$topLevelDBRef-&amp;gt;{&#39;pins&#39;}})) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin_name (@{$topLevelDBRef-&amp;gt;{&#39;pins&#39;}-&amp;gt;{$direction}}) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; pin\($pin_name\) { \n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tdirection : $direction ;\n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($direction eq &quot;input&quot;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tmax_transition : $tran;\n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tcapacitance : $cap; \n&quot;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; } \n&quot;) ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $direction (keys(%{$topLevelDBRef-&amp;gt;{&#39;bus&#39;}})) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $bus_type (keys %{$topLevelDBRef-&amp;gt;{&#39;bus&#39;}-&amp;gt;{$direction}}) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @bus_width =&amp;nbsp; split(/_/, $bus_type); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_hi = $bus_width[1] ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_lo = $bus_width[2] ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $bus_name (@{$topLevelDBRef-&amp;gt;{&#39;bus&#39;}-&amp;gt;{$direction}{$bus_type}}) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chomp($bus_name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;BUS $bus_name : $bus_type : $direction \n&quot; ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; bus\($bus_name\) { \n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tbus_type : $bus_type ;\n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tdirection : $direction ;\n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($direction eq &quot;input&quot;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tmax_transition : $tran;\n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(my $i=$bus_lo; $i&amp;lt;=$bus_hi; $i++) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\tpin\($bus_name\[$i\]\) { \n&quot;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\t\tcapacitance : $cap; \n&quot;);&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;\t} \n&quot;) ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; } \n&quot;) ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;&amp;nbsp; } \n&quot;) ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $FO (&quot;} \n&quot;) ;&lt;br&gt;}  &lt;p&gt;sub createTopLevelDB &lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $find_top_module = 0; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %topLevelDB = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %pins = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %bus = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @input_pins ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @output_pins ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @inout_pins ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @bus_types ; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %input_bus = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %output_bus = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %inout_bus = () ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my %design = ();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $design{&#39;cell&#39;} = $module; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $design{&#39;tran&#39;} = $tran; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $design{&#39;cap&#39;} = $cap; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $design{&#39;signal_level&#39;} = $signal_level; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(my $line = &amp;lt;$FF&amp;gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if($find_top_module == 1);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($line=~/module\s+$module/) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $find_top_module = 1 ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(my $line = &amp;lt;$FF&amp;gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next if($line =~ &quot;\s*//&quot; );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chomp($line);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($line =~/input\s+/ ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\s*input\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/;//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($line =~/\[(\d+):(\d+)\]/) { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_type = &quot;bus_$1_$2&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\[(\d+):(\d+)\]//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unless(grep {$_ eq $bus_type} @bus_types) {&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@bus_types,$bus_type);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@{$input_bus{$bus_type}}, $pin );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@input_pins, $pin); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($line =~/output\s+/ ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\s*output\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/;//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($line =~/\[(\d+):(\d+)\]/) { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_type = &quot;bus_$1_$2&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\[(\d+):(\d+)\]//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unless(grep {$_ eq $bus_type} @bus_types) {&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@bus_types,$bus_type);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@{$output_bus{$bus_type}}, $pin );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@output_pins, $pin); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($line =~/inout\s+/ ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\s*inout\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/;//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($line =~/\[(\d+):(\d+)\]/) { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $bus_type = &quot;bus_$1_$2&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $line=~s/\[(\d+):(\d+)\]//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unless(grep {$_ eq $bus_type} @bus_types) {&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@bus_types,$bus_type);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@{$inout_bus{$bus_type}}, $pin );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @line =&amp;nbsp; split(/,/, $line); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach my $pin (@line) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pin=~s/\s+//;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@inout_pins, $pin); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if($line=~/endmodule/);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pins{&#39;input&#39;} = \@input_pins;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pins{&#39;output&#39;} = \@output_pins;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pins{&#39;inout&#39;} = \@inout_pins;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bus{&#39;input&#39;} = \%input_bus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bus{&#39;output&#39;} = \%output_bus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bus{&#39;inout&#39;} = \%inout_bus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $topLevelDB{&#39;pins&#39;} = \%pins;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $topLevelDB{&#39;bus&#39;} = \%bus;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $topLevelDB{&#39;design&#39;} = \%design;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return \%topLevelDB;&lt;br&gt;}&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/7003854595948729867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2013/01/creating-lib-file-from-verilog-netlist.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7003854595948729867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7003854595948729867'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2013/01/creating-lib-file-from-verilog-netlist.html' title='Creating .lib file from Verilog netlist'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6685838676514820867</id><published>2012-11-17T22:50:00.001-08:00</published><updated>2012-11-17T22:50:38.871-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="verilog bit shifting"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog Tips and Tricks"/><title type='text'>Verilog and bit shifting (‘&amp;lt;&amp;lt;&amp;#39; and &amp;#39;&amp;gt;&amp;gt;’): Don’t push your luck</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;In Verilog there’s a bit shifter operator, which isn’t used a lot, since FPGA designers prefer to state exact bit vectors. But sometimes bit shifting makes the code significantly more readable. Too bad that Xilinx’ XST synthesizer doesn’t get it right in a specific case.  &lt;p align=&quot;justify&quot;&gt;Namely, the following statement is perfectly legal:  &lt;div align=&quot;justify&quot;&gt;&lt;pre&gt;always @(posedge clk)&lt;br /&gt;  reduce &amp;lt;= 1 + (end_offset &amp;gt;&amp;gt; (6 + rcb_is_128_bytes - format_shift) );&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;But it turns out that Xilinx ISE 13.2 XST synthesizer gets confused by the calculation of the shift rate, and creates something wrong. I can’t even tell what it did, but it was wrong. &lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;So the rule is simple: It’s fine to have the shift number being a register (even combinatoric) or a wire, but no inline calculations. So this is fine: &lt;br /&gt;&lt;div align=&quot;justify&quot;&gt;&lt;pre&gt;always @(format_shift or rcb_is_128_bytes)&lt;br /&gt;  if (rcb_is_128_bytes)&lt;br /&gt;    case (format_shift)&lt;br /&gt;      0: shifter &amp;lt;= 7;&lt;br /&gt;      1: shifter &amp;lt;= 6;&lt;br /&gt;      default: shifter &amp;lt;= 5;&lt;br /&gt;    endcase&lt;br /&gt;  else&lt;br /&gt;    case (format_shift)&lt;br /&gt;      0: shifter &amp;lt;= 6;&lt;br /&gt;      1: shifter &amp;lt;= 5;&lt;br /&gt;      default: shifter &amp;lt;= 4;&lt;br /&gt;    endcase&lt;br /&gt;&lt;br /&gt;always @(posedge clk)&lt;br /&gt;  reduce &amp;lt;= 1 + (end_offset &amp;gt;&amp;gt; shifter );&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;(assuming that format_shift goes from zero to 2). &lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;Actually, I would bet that it’s equally fine to calculate the number of shifts and put the result in a wire. I went for the case statement hoping that the synthesizer will take the hint that not all values that fit into the registers are possible, and will hence avoid implementing impossible shift values. &lt;br /&gt;&lt;p align=&quot;justify&quot;&gt;Needless to say, I know about this because something went horribly wrong all of the sudden. I believe XST version 12.2 handled the shift calculation OK. And then people ask me why I don’t like upgrades.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6685838676514820867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/11/verilog-and-bit-shifting-and-dont-push.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6685838676514820867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6685838676514820867'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/11/verilog-and-bit-shifting-and-dont-push.html' title='Verilog and bit shifting (‘&amp;lt;&amp;lt;&amp;#39; and &amp;#39;&amp;gt;&amp;gt;’): Don’t push your luck'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-2607051355633967380</id><published>2012-09-10T20:00:00.001-07:00</published><updated>2012-09-11T19:02:47.099-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog LRM"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Verilog language reference manual LRM</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Verilog was started initially as a proprietary hardware modeling language by Gateway Design Automation Inc. around 1984. It is rumored that the original language was designed by taking features from the most popular HDL language of the time, called HiLo, as well as from traditional computer languages such as C. At that time, Verilog was not standardized and the language modified itself in almost all the revisions that came out within 1984 to 1990.  &lt;p align=&quot;justify&quot;&gt;Verilog simulator was first used beginning in 1985 and was extended substantially through 1987. The implementation was the Verilog simulator sold by Gateway. The first major extension was Verilog-XL, which added a few features and implemented the infamous &quot;XL algorithm&quot; which was a very efficient method for doing gate-level simulation.  &lt;p align=&quot;justify&quot;&gt;The time was late 1990. Cadence Design System, whose primary product at that time included Thin film process simulator, decided to acquire Gateway Automation System. Along with other Gateway products, Cadence now became the owner of the Verilog language, and continued to market Verilog as both a language and a simulator. At the same time, Synopsys was marketing the top-down design methodology, using Verilog. This was a powerful combination.  &lt;p align=&quot;justify&quot;&gt;In 1990, Cadence recognized that if Verilog remained a closed language, the pressures of standardization would eventually cause the industry to shift to VHDL. Consequently, Cadence organized the Open Verilog International (OVI), and in 1991 gave it the documentation for the Verilog Hardware Description Language. This was the event which &quot;opened&quot; the language.  &lt;p align=&quot;justify&quot;&gt;OVI did a considerable amount of work to improve the Language Reference Manual (LRM), clarifying things and making the language specification as vendor-independent as possible.  &lt;p align=&quot;justify&quot;&gt;Soon it was realized that if there were too many companies in the market for Verilog, potentially everybody would like to do what Gateway had done so far - changing the language for their own benefit. This would defeat the main purpose of releasing the language to public domain. As a result in 1994, the IEEE 1364 working group was formed to turn the OVI LRM into an IEEE standard. This effort was concluded with a successful ballot in 1995, and Verilog became an IEEE standard in December 1995.  &lt;p align=&quot;justify&quot;&gt;When Cadence gave OVI the LRM, several companies began working on Verilog simulators. In 1992, the first of these were announced, and by 1993 there were several Verilog simulators available from companies other than Cadence. The most successful of these was VCS, the Verilog Compiled Simulator, from Chronologic Simulation. This was a true compiler as opposed to an interpreter, which is what Verilog-XL was. As a result, compile time was substantial, but simulation execution speed was much faster.  &lt;p align=&quot;justify&quot;&gt;In the meantime, the popularity of Verilog and PLI was rising exponentially. Verilog as a HDL found more admirers than well-formed and federally funded VHDL. It was only a matter of time before people in OVI realized the need of a more universally accepted standard. Accordingly, the board of directors of OVI requested IEEE to form a working committee for establishing Verilog as an IEEE standard. The working committee 1364 was formed in mid 1993 and on October 14, 1993, it had its first meeting.  &lt;p align=&quot;justify&quot;&gt;The standard, which combined both the Verilog language syntax and the PLI in a single volume, was passed in May 1995 and now known as IEEE Std. 1364-1995.  &lt;p align=&quot;justify&quot;&gt;After many years, new features have been added to Verilog, and the new version is called Verilog 2001. This version seems to have fixed a lot of problems that Verilog 1995 had. This version is called 1364-2001.  &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Timeline:&lt;/strong&gt;  &lt;p align=&quot;justify&quot;&gt;1984 Verilog-XL simulator and language developed by Gateway Design Automation&lt;br&gt;1987 Synopsys introduced a Verilog based synthesis tool.&lt;br&gt;1989 Cadence Design Systems acquired Gateway, and Verilog.&lt;br&gt;1990 Cadence placed the Verilog language in the public domain.&lt;br&gt;1995 Verilog HDL became (IEEE Std 1364-1995).&lt;br&gt;1997 Verilog VCS bought by Viewlogic&lt;br&gt;1997 Viewlogic bought by Synopsys&lt;br&gt;1998 Synopsys issues Verilog VCS&lt;br&gt;2001 A significantly revised version was published in 2001. &lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.verilog.org/verilog-ams/htmlpages/public-docs/lrm/VerilogA/verilog-a-lrm-1-0.pdf&quot;&gt;DOWNLOAD VERIOG LRM&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/2607051355633967380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-language-reference-manual-lrm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/2607051355633967380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/2607051355633967380'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-language-reference-manual-lrm.html' title='Verilog language reference manual LRM'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-7683708032314993753</id><published>2012-09-09T01:54:00.002-07:00</published><updated>2012-09-10T19:29:44.965-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Vectors"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Vectors</title><content type='html'>&lt;p&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p&gt;Vectors are multiple bit widths &lt;b&gt;net&lt;/b&gt; or &lt;b&gt;reg&lt;/b&gt; data type variables that can be declared by specifying their range. &lt;p&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p&gt;net_type&lt;b&gt; &lt;/b&gt;&lt;b&gt;[msb:lsb]&lt;/b&gt; list_of_net_identifiers; &lt;p&gt;&lt;b&gt;reg&lt;/b&gt; &lt;b&gt;[msb:lsb]&lt;/b&gt; list_of_register_identifiers; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p&gt;Vector range specification contains two constant expressions: the msb (most significant bit) constant expression, which is the left-hand value of the range and the lsb (least significant bit) constant expression, which is the right-hand value of the range. The msb and lsb constant expressions should be separated by a colon. &lt;p&gt;Both the msb constant expression and the lsb constant expression can be any value - positive, negative, or zero. The lsb constant expression can be greater, equal or less than the msb constant expression. &lt;p&gt;Vectors can be declared for all types of &lt;b&gt;net&lt;/b&gt; data types and for &lt;b&gt;reg&lt;/b&gt; data types. Specifying vectors for &lt;b&gt;integer&lt;/b&gt;, &lt;b&gt;real&lt;/b&gt;, &lt;b&gt;realtime&lt;/b&gt;, and &lt;b&gt;time&lt;/b&gt; data types is illegal. &lt;p&gt;Vector nets and registers are treated as unsigned values (see: Arithmetic expressions with registers and integers for more explanations). &lt;p&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p&gt;Example 1 &lt;p&gt;&lt;b&gt;reg&lt;/b&gt; [3:0] addr; &lt;p&gt;The &#39;addr&#39; variable is a 4-bit vector register made up of addr[3] (the most significant bit), addr[2], addr[1], and addr[0] (the least significant bit). &lt;p&gt;Example 2 &lt;p&gt;&lt;b&gt;wire&lt;/b&gt; [-3:4] d; &lt;p&gt;The d variable is 8-bit vector net made up of d[-3] (msb), d[-2], d[-1], d[0], d[1], d[2], d[3], d[4] (lsb). &lt;p&gt;Example 3 &lt;p&gt;&lt;b&gt;tri&lt;/b&gt; [5:0] x, y, z; &lt;p&gt;The above line declares three 6-bit vectors. &lt;p&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt;Both the msb and the lsb expressions should be constant expressions. &lt;li&gt;The msb and the lsb constant expressions may be positive, negative, or zero. &lt;li&gt;The lsb constant expression may be greater, equal or less than the msb constant expression. &lt;li&gt;Vectors can be declared only for &lt;b&gt;nets&lt;/b&gt; and &lt;b&gt;reg&lt;/b&gt; data types. &lt;li&gt;Vector declaration for &lt;b&gt;integer&lt;/b&gt;, &lt;b&gt;real&lt;/b&gt;, &lt;b&gt;realtime,&lt;/b&gt; and &lt;b&gt;time&lt;/b&gt; data types are illegal.&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/7683708032314993753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-vectors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7683708032314993753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7683708032314993753'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-vectors.html' title='Vectors'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-514803105602293775</id><published>2012-09-09T01:53:00.000-07:00</published><updated>2012-09-11T19:08:09.121-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Value Change Dump (VCD) File"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Value Change Dump (VCD) File</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The Value change dump (VCD) file contains information about any value changes on the selected variables.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;$dumpfile(name) &lt;p align=&quot;justify&quot;&gt;$dumpvars &lt;p align=&quot;justify&quot;&gt;$dumpvars(level, list_of_variables_or_modules) &lt;p align=&quot;justify&quot;&gt;$dumpoff &lt;p align=&quot;justify&quot;&gt;$dumpon &lt;p align=&quot;justify&quot;&gt;$dumpall &lt;p align=&quot;justify&quot;&gt;$dumplimit &lt;p align=&quot;justify&quot;&gt;$dumpflush &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;$dumpfile(filename) &lt;p align=&quot;justify&quot;&gt;This task is used to specify the VCD file name. The filename parameter is optional. If it is not given, then the file will be named &quot;Verilog.dump”. &lt;p align=&quot;justify&quot;&gt;$dumpvars(level, list_of_variables_or_modules) &lt;p align=&quot;justify&quot;&gt;This task is used to specify which variables should be dumped. Both parameters are optional and if none are used, then all variables will be dumped. &lt;p align=&quot;justify&quot;&gt;If level = 0, then all variables within the modules from the list will be dumped. If any module from the list contains module instances, then all variables from these modules will also be dumped. &lt;p align=&quot;justify&quot;&gt;If level = 1, then only listed variables and variables of listed modules will be dumped. &lt;p align=&quot;justify&quot;&gt;$dumpoff &lt;p align=&quot;justify&quot;&gt;This task stops the dumping of variables. All variables are dumped with x value and all next changes of variables will not be dumped. &lt;p align=&quot;justify&quot;&gt;$dumpon &lt;p align=&quot;justify&quot;&gt;This task starts previously stopped dumping of variables. &lt;p align=&quot;justify&quot;&gt;$dumpall &lt;p align=&quot;justify&quot;&gt;When this task is used, then the current value of all dumped variables will be written to file. &lt;p align=&quot;justify&quot;&gt;$dumplimit(filesize) &lt;p align=&quot;justify&quot;&gt;This task can set the maximum size of the VCD file. &lt;p align=&quot;justify&quot;&gt;$dumpflush &lt;p align=&quot;justify&quot;&gt;This task can be used to make sure that all changes of dumped variables are written to file.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;module top;&lt;br&gt;reg a, b;&lt;br&gt;wire y;&lt;br&gt;assign y = a &amp;amp; b;&lt;br&gt;always begin&lt;br&gt;&amp;nbsp; a = 1&#39;b0;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; a = 1&#39;b1;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; a = 1&#39;bx;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;end&lt;br&gt;always begin&lt;br&gt;&amp;nbsp; b = 1&#39;b0;&lt;br&gt;&amp;nbsp; #30;&lt;br&gt;&amp;nbsp; b = 1&#39;b1;&lt;br&gt;&amp;nbsp; #30;&lt;br&gt;&amp;nbsp; b = 1&#39;bx;&lt;br&gt;&amp;nbsp; #30;&lt;br&gt;end&lt;br&gt;initial begin&lt;br&gt;&amp;nbsp; $dumpfile(&quot;test.txt&quot;);&lt;br&gt;&amp;nbsp; $dumpvars(1,a,y);&lt;br&gt;&amp;nbsp; #200;&lt;br&gt;&amp;nbsp; $dumpoff;&lt;br&gt;&amp;nbsp; #200;&lt;br&gt;&amp;nbsp; $dumpon;&lt;br&gt;&amp;nbsp; #20;&lt;br&gt;&amp;nbsp; $dumpall;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; $dumpflush;&lt;br&gt;end&lt;br&gt;endmodule&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;The dumpfile will contain only changes of &#39;a&#39; and &#39;y&#39; variables. After 200 time units, dumping will be suspended for 200 time units. Next, dumping will start again and after 20 time units, all variables will be dumped.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;p align=&quot;justify&quot;&gt;Value change dump file can be used for hierarchical monitoring of all signal changes within design modules.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/514803105602293775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-value-change-dump-VCD-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/514803105602293775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/514803105602293775'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-value-change-dump-VCD-file.html' title='Value Change Dump (VCD) File'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-3168804190084167612</id><published>2012-09-09T01:52:00.000-07:00</published><updated>2012-09-12T19:25:59.688-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UDP State Table"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>UDP State Table</title><content type='html'>&lt;p&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p&gt;A UDP state table defines the behavior of UDP. &lt;p&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p&gt;&lt;b&gt;table&lt;/b&gt; &lt;p&gt;&amp;nbsp; comb_input comb_input ... comb_input : output; &lt;p&gt;&amp;nbsp; seq_input seq_input ... seq_input : current_state : next_state; &lt;p&gt;&lt;b&gt;endtable&lt;/b&gt; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p&gt;Each row of the state table defines the behavior of the UDP for a specific input combination. Each combination of inputs can be given only one time. It is illegal to define the same combination of inputs for different outputs. &lt;p&gt;The number of input values must match the number of UDP inputs in a port declaration. &lt;p&gt;The UDP state table for combinational and sequential UDPs is different. The combinational UDPs (&lt;i&gt;Example 1&lt;/i&gt;) contain two fields: an input field and an output field. The sequential UDPs (&lt;i&gt;Example 2&lt;/i&gt;) contain three fields: an input, a current state, and the next state (output) field. &lt;p&gt;The input field should contain a list of values (separated by white spaces), which should match the number of UDP input ports. The order of these ports is highly important. The first input port on the UDP port list matches the first input value in each row. &lt;p&gt;The rows of the state table can contain only 0, 1, unknown (x) value, and special characters. The high-impedance (z) value cannot be specified. The special characters are provided to increase readability of a description and to make it easier (&lt;i&gt;Example 3&lt;/i&gt;). &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;&lt;b&gt;Symbol&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;&lt;b&gt;Interpretation&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Logic 0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Logic 1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;x&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Unknown value&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Not permitted in output field.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;b&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Substitute for 0 and 1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Not permitted in output field.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;?&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Substitute for 0, 1, and x&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Not permitted in output field.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;-&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;No change&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Permitted only in output field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;(vw)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Transition from v to w value&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Permitted only in input field of sequential UDPs. v and w can be 0, 1, x, b, and ?&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;*&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Same as (??)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Any value change on input. Permitted only in input field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;r&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Same as (01)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Rising edge on input. Permitted only in input field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;f&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Same as (10)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Falling edge on input. Permitted only in input field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;p&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Same as (01), (0x), (x1)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Positive edge on input. Permitted only in input field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt; &lt;p&gt;n&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Same as (10), (1x), (x0)&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;60%&quot;&gt; &lt;p&gt;Negative edge on input. Permitted only in input field of sequential UDPs.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;b&gt;Table 25: Summary of symbols&lt;/b&gt; &lt;p&gt;If some combinations of input signal values are not specified in a UDP state tables then the output value will be unknown (x). &lt;p&gt;Only one transition can appear in each row of sequential UDPs. &lt;p&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p&gt;Example 1 &lt;p&gt;&lt;b&gt;primitive mux (o, i3, i2, i1, i0, a1, a0);&lt;/b&gt; &lt;p&gt;&lt;b&gt;output&lt;/b&gt; o;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; i3, i2, i1, i0, a1, a0;&lt;br&gt;&lt;b&gt;table&lt;/b&gt;&lt;br&gt;// i3 i2 i1 i0 a1 a0 : o;&lt;br&gt;0 ? ? ? 1 1 : 0;&lt;br&gt;1 ? ? ? 1 1 : 1;&lt;br&gt;? 0 ? ? 1 0 : 0;&lt;br&gt;? 1 ? ? 1 0 : 1;&lt;br&gt;? ? 0 ? 0 1 : 0;&lt;br&gt;? ? 1 ? 0 1 : 1;&lt;br&gt;? ? ? 0 0 0 : 0;&lt;br&gt;? ? ? 1 0 0 : 1;&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt; &lt;p&gt;If any address bit (a1, a0) is unknown, then the output value will be unknown (because there is no row which describes the output value for this combination of address signals). &lt;p&gt;If a1 = 0 and a0 = 0 then the signal from input i0 is driven to output (value of others inputs does not matter). &lt;p&gt;If a1 = 0 and a0 = 1 then signal from input i1 is driven to the output. &lt;p&gt;If a1 = 1 and a0 = 0 then signal from input i2 is driven to the output. &lt;p&gt;If a1 = 1 and a0 = 1 then signal from input i3 is driven to the output. &lt;p&gt;Example 2 &lt;p&gt;&lt;b&gt;primitive&lt;/b&gt; special_d_ff (q, clk, m, d, rst, set);&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; clk, m, d, rst, set;&lt;br&gt;table&lt;br&gt;// clk m d rst set : current : next;&lt;br&gt;// positive edge on clk and normal mode (m = 0)&lt;br&gt;(01) 0 0 0 0 : ? : 0 ; // line 1&lt;br&gt;(0x) 0 0 0 0 : ? : 0 ; // line 2&lt;br&gt;(x1) 0 0 0 0 : ? : 0 ; // line 3&lt;br&gt;(01) 0 1 0 0 : ? : 1 ; // line 4&lt;br&gt;(0x) 0 1 0 0 : ? : 1 ; // line 5&lt;br&gt;(x1) 0 1 0 0 : ? : 1 ; // line 6&lt;br&gt;// positive edge on clk and negation mode (m = 1)&lt;br&gt;p 1 ? 0 0 : 0 : 1 ; // line 7&lt;br&gt;p 1 ? 0 0 : 1 : 0 ; // line 8&lt;br&gt;// negative edge on clk and any mode (m = 0 or m = 1)&lt;br&gt;n ? ? 0 0 : ? : - ; // line 9&lt;br&gt;// reset&lt;br&gt;? ? ? 1 ? : ? : 0 ; // line 10&lt;br&gt;// preset&lt;br&gt;? ? ? 0 1 : ? : 1 ; // line 11&lt;br&gt;// any changes on inputs with no changes on clk&lt;br&gt;? * ? ? ? : ? : - ; // line 12&lt;br&gt;? ? * ? ? : ? : - ; // line 13&lt;br&gt;? ? ? * ? : ? : - ; // line 14&lt;br&gt;? ? ? ? * : ? : - ; // line 15&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt; &lt;p&gt;This is &#39;d&#39; flip-flop with an additional input, which can convert it into a modulo 2 counter. &lt;p&gt;If m = 0 then this UDP works as a normal &#39;d&#39; flip-flop (lines 1-6), but if m = 1 then it negates its current value (lines 7 and 8). If any falling edge occurs on the clk input, then it will not change the output (line 9). If rst is 1, then the output will go to 0 (line 10). If the rst is 0 and set is 1, then the output will go to 1 (line 11 - it means that rst has higher priority than set). &lt;p&gt;Any changes on the data input will not cause any changes on output (lines 12-15). &lt;p&gt;Example 3 &lt;p&gt;&lt;b&gt;primitive&lt;/b&gt; circuit_1 (o, i1, i2, i3);&lt;br&gt;&lt;b&gt;output&lt;/b&gt; o;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; i1, i2, i3;&lt;br&gt;&lt;b&gt;table&lt;/b&gt;&lt;br&gt;0 0 0 : 1 ;&lt;br&gt;0 0 1 : 1 ;&lt;br&gt;0 0 x : 1 ;&lt;br&gt;0 1 0 : 1 ;&lt;br&gt;0 1 1 : 1 ;&lt;br&gt;0 1 x : 1 ;&lt;br&gt;1 0 0 : 0 ;&lt;br&gt;1 0 1 : 0 ;&lt;br&gt;1 0 x : 0 ;&lt;br&gt;1 1 0 : 1 ;&lt;br&gt;1 1 1 : 1 ;&lt;br&gt;1 1 x : 1 ;&lt;br&gt;x 0 0 : 0 ;&lt;br&gt;x 0 1 : 0 ;&lt;br&gt;x 0 x : 0 ;&lt;br&gt;x 1 0 : 0 ;&lt;br&gt;x 1 1 : 0 ;&lt;br&gt;x 1 x : 0 ;&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt;&lt;br&gt;&lt;b&gt;primitive&lt;/b&gt; circuit_2 (o, i1, i2, i3);&lt;br&gt;&lt;b&gt;output&lt;/b&gt; o;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; i1, i2, i3;&lt;br&gt;&lt;b&gt;table&lt;/b&gt;&lt;br&gt;0 ? ? : 1 ;&lt;br&gt;1 0 ? : 0 ;&lt;br&gt;1 1 ? : 1 ;&lt;br&gt;x b ? : 0 ;&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt; &lt;p&gt;&#39;Circuit_1&#39; and &#39;circit_2&#39; are the same circuit, but the behavior of the &#39;circuit_1&#39; was specified without special characters. &lt;p&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt;Each row of sequential UDPs can contain only one transition. &lt;li&gt;Special characters can make the UDP state table easier to read and write. &lt;li&gt;Any undefined combination of inputs will set the output to x value.&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/3168804190084167612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-State-Table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3168804190084167612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3168804190084167612'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-State-Table.html' title='UDP State Table'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6834600893327880186</id><published>2012-09-09T01:50:00.002-07:00</published><updated>2012-09-12T19:27:16.418-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UDP Instantiation"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>UDP Instantiation</title><content type='html'>&lt;h4&gt;Formal Definition&lt;/h4&gt; &lt;p&gt;The UDP instantiation provides a means of using UDP in modules.&lt;br&gt; &lt;h4&gt;Simplified Syntax&lt;/h4&gt; &lt;p&gt;udp_name (strengths) #(delays) instance_name[range] (list of ports);&lt;br&gt; &lt;h4&gt;Description&lt;/h4&gt; &lt;p&gt;UDPs can be instantiated only within modules. &lt;p&gt;The name of an instance is optional (&lt;i&gt;Example 1&lt;/i&gt;). A UDP instantiation can contain strength and delays declarations (&lt;i&gt;Example 2&lt;/i&gt;). UDPs do not support high-impedance (z) values, therefore only two delays are permitted. Signals connected to input ports can be any net or reg data type. Only net data type variables can be connected to the output port. The strength declaration can contain only drive strength. &lt;p&gt;It is possible to specify an array of UDP instances by using a range (&lt;i&gt;Example 3&lt;/i&gt;).&lt;br&gt; &lt;h4&gt;Examples&lt;/h4&gt; &lt;p&gt;Example 1 &lt;p&gt;&lt;b&gt;primitive&lt;/b&gt; d_ff (q, clk, d);&lt;br&gt;...&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt;&lt;br&gt;d_ff (q, clk, d); &lt;p&gt;The name of an instance is optional. &lt;p&gt;Example 2 &lt;p&gt;d_ff (&lt;b&gt;weak1&lt;/b&gt;, &lt;b&gt;strong0&lt;/b&gt;) #5 d1 (q, clk, d); &lt;p&gt;UDP instance with strength and delay declaration. &lt;p&gt;Example 3 &lt;p&gt;&lt;b&gt;wire&lt;/b&gt; [3:0] q;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; [3:0] d;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; clk;&lt;br&gt;d_ff flips[3:0] (q, clk, d);&lt;br&gt; &lt;h4&gt;Important Notes&lt;/h4&gt; &lt;p&gt;· UDP instantiation can contain up to two delay values. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6834600893327880186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-instantiation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6834600893327880186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6834600893327880186'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-instantiation.html' title='UDP Instantiation'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-8111447721634184116</id><published>2012-09-09T01:48:00.002-07:00</published><updated>2012-09-12T19:29:09.382-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="UDP Declaration"/><title type='text'>UDP Declaration</title><content type='html'>&lt;h4&gt;Formal Definition&lt;/h4&gt; &lt;p&gt;User Defined Primitives (UDP) provide a means of expanding a set of built-in primitives.&lt;br&gt; &lt;h4&gt;Simplified Syntax&lt;/h4&gt; &lt;p&gt;&lt;b&gt;primitive&lt;/b&gt; udp_name ( port_list ); &lt;p&gt;&lt;b&gt;output&lt;/b&gt; output_port; &lt;p&gt;&lt;b&gt;input&lt;/b&gt; list_of_imputs; &lt;p&gt;&lt;b&gt;initial&lt;/b&gt; output_port = value; &lt;p&gt;&lt;b&gt;table&lt;/b&gt; &lt;p&gt;&amp;nbsp; combinational_input_list : output_value; &lt;p&gt;&amp;nbsp; sequential_input_list : current_state : next_state; &lt;p&gt;&lt;b&gt;endtable&lt;/b&gt; &lt;p&gt;&lt;b&gt;endprimitive&lt;br&gt;&lt;/b&gt; &lt;h4&gt;Description&lt;/h4&gt; &lt;p&gt;User Defined Primitives can describe both combinational (&lt;i&gt;Example 1&lt;/i&gt;) and sequential (&lt;i&gt;Example 2&lt;/i&gt;) circuits. The behavioral description is provided as a truth table. &lt;p&gt;The UDP declaration starts with the keyword &lt;b&gt;primitive&lt;/b&gt; and ends with the keyword &lt;b&gt;endprimitive&lt;/b&gt;. A port list, an output port declaration and input ports declaration are similar to their equivalents in a module declaration.&lt;br&gt; &lt;h4&gt;Port list&lt;/h4&gt; &lt;p&gt;The port list contains a comma-separated list of primitive ports. There can be only one output port and several input ports. The inout ports are illegal. The first port on the list should be the output port. There are some restrictions concerning the number of input ports. The combinational UDPs list of ports should not contain more than 10 inputs, and the sequential UDPs port list should not contain more than 9 inputs. If the port list contains more inputs, then a warning will be issued. These restrictions are caused by illegibility of written UDPs.&lt;br&gt; &lt;h4&gt;Port declaration&lt;/h4&gt; &lt;p&gt;Input and output port declarations should match the port list of the UDP they are enclosed in. If the described UDP is sequential, then reg declaration for output port should be provided. All ports of the UDP should be of scalar type (1-bit wide). Vectors are illegal.&lt;br&gt; &lt;h4&gt;Initial statement&lt;/h4&gt; &lt;p&gt;Sequential UDPs can contain an initial statement for an output port. This statement begins with the keyword &lt;b&gt;initial,&lt;/b&gt; followed by an assignment to the output port. Assigned values should be 1-bit wide and there must not be any delays.&lt;br&gt; &lt;h4&gt;State table&lt;/h4&gt; &lt;p&gt;The state table starts with the keyword &lt;b&gt;table&lt;/b&gt; and ends with the keyword &lt;b&gt;endtable&lt;/b&gt;. The state tables for combinational and sequential UDPs are different. The state table is comprised of rows each of which ended with a the semicolon. Table row describes the behavior of UDP for a particular combination of inputs. The combinational UDPs have two fields separated by a colon. One field is for the inputs and one for the outputs. The sequential UDPs have three fields: one for the inputs, one for the current output state, and one for the next output state. If any combination of input signals, is not explicitly specified in the UDP declaration, the output value will be unknown (x). A particular combination of inputs can be specified only one time.&lt;br&gt; &lt;h4&gt;Examples&lt;/h4&gt; &lt;p&gt;Example 1 &lt;p&gt;primitive and_gate (o, in1, in2);&lt;br&gt;&lt;b&gt;output&lt;/b&gt; o;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; in1, in2;&lt;br&gt;&lt;b&gt;table&lt;/b&gt;&lt;br&gt;&amp;nbsp; // in1 in2 : o&lt;br&gt;&amp;nbsp; 0 0 : 0;&lt;br&gt;&amp;nbsp; 0 1 : 0;&lt;br&gt;&amp;nbsp; 1 0 : 0;&lt;br&gt;&amp;nbsp; 1 1 : 1;&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt; &lt;p&gt;Example of simple combinational UDP based on the &lt;b&gt;and&lt;/b&gt; gate truth table. &lt;p&gt;Example 2 &lt;p&gt;&lt;b&gt;primitive&lt;/b&gt; d_ff (q, d, clk);&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;input&lt;/b&gt; d, clk;&lt;br&gt;&lt;b&gt;table&lt;/b&gt;&lt;br&gt;&amp;nbsp; // d clk : q : q+&lt;br&gt;&amp;nbsp; 0 p : ? : 0;&lt;br&gt;&amp;nbsp; 1 p : ? : 1;&lt;br&gt;&amp;nbsp; ? n : ? : -;&lt;br&gt;&lt;b&gt;endtable&lt;/b&gt;&lt;br&gt;&lt;b&gt;endprimitive&lt;/b&gt; &lt;p&gt;Example of sequential UDP based on a D flip-flop.&lt;br&gt; &lt;h4&gt;Important Notes&lt;/h4&gt; &lt;p&gt;· UDP can have only one output. &lt;p&gt;· Inout ports are illegal. &lt;p&gt;· Combinational UDP should not have more than 10 inputs. &lt;p&gt;· Sequential UDP should not have more than 9 inputs. &lt;p&gt;· Vector declaration for UDP ports is illegal. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/8111447721634184116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-declaration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8111447721634184116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8111447721634184116'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-UDP-declaration.html' title='UDP Declaration'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-169588422839707824</id><published>2012-09-09T01:46:00.000-07:00</published><updated>2012-09-12T19:30:18.972-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Timing Check Tasks"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Timing Check Tasks</title><content type='html'>&lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt; &lt;p&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p&gt;Timing Check Tasks are for verification of timing properties of designs and for reporting timing violations. &lt;p&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p&gt;&lt;b&gt;$setup&lt;/b&gt; (data_event, reference_event, limit[, notifier]) ; &lt;p&gt;&lt;b&gt;$skew (&lt;/b&gt;reference_event, data_event, limit[,notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$hold (&lt;/b&gt;reference_event, data_event, limit[,notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$recovery (&lt;/b&gt;reference_event, data_event, limit, [notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$setuphold (&lt;/b&gt;reference_event, data_event, setup_limit, hold_limit, [notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$width (&lt;/b&gt;reference_event, limit, threshold [,notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$period (&lt;/b&gt;reference_event, limit[,notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;$nochange (&lt;/b&gt;reference_event, data_event, start_edge_offset, end_edge_offset [,notifier]&lt;b&gt;) ;&lt;/b&gt; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p&gt;Timing check tasks are invoked every time critical events occur within given time limits. See the table below with descriptions of all arguments: &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;&lt;b&gt;Argument&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;&lt;b&gt;Type&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Reference_event&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;The transition at a control signal that establishes the reference time for tracking timing violations on the data_event&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Module input or inout that is scalar or vector net&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Data_event&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;The signal change that initiates the timing check and is monitored for violations.&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Module input or inout that is scalar or vector net&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Limit&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;A time limit used to detect timing violations on the data_event&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Constant expression or specparam&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Threshold&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;The largest pulse width that is ignored by the timing check $width&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Constant expression or specparam&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Setup_limit&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;A time limit used to detect timing violations on the data_event for $setup.&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Constant expression or specparam&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Hold_limit&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;A time limit used to detect timing violations on the data_event for $hold.&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Constant expression or specparam&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;20%&quot;&gt; &lt;p&gt;Notifier&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt; &lt;p&gt;An optional argument that &quot;notifies&quot; the simulator when a timing violation occurs&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;30%&quot;&gt; &lt;p&gt;Register&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;b&gt;$setup&lt;/b&gt; checks setup time. When modeling synchronous circuits, flip-flops need time to force a correct value. Data cannot change within the setup time because flip-flops cannot detect the new value. If data changes within a given time limit, &lt;b&gt;$setup&lt;/b&gt; reports a timing violation. If a data event and reference event occur at the same time there is no violation. The&lt;b&gt;$setup&lt;/b&gt; first checks timing data then records a new data value. The formula to report a timing violation is as shown below: &lt;p&gt;(time of reference event) - (time of data event) &amp;lt; limit &lt;p&gt;Notice that the limit argument has to be a positive number. &lt;p&gt;&lt;b&gt;$skew&lt;/b&gt; checks the following: &lt;p&gt;(time of data event) - (time of reference event) &amp;gt; limit &lt;p&gt;&lt;b&gt;$skew&lt;/b&gt; can be used to check synchronicity of clocks inside a circuit. If different clocks are used in a design and are synchronized, &lt;b&gt;$skew&lt;/b&gt; will report a timing violation when the active edge of one of them occurs outside the time limit allowed for the other clock to occur. &lt;p&gt;When the data event and the reference event occur at the same time, &lt;b&gt;$skew&lt;/b&gt; will not report a timing violation. &lt;p&gt;&lt;b&gt;$hold&lt;/b&gt; will report a timing violation if the following formula is true: &lt;p&gt;(time of data event) - (time of reference event) &amp;lt; limit &lt;p&gt;&lt;b&gt;$hold&lt;/b&gt; simply checks that data is stable in the specified interval of time after the edge of the clock. In flip-flops, data should remain stable for a given time after the active edge of the clock to allow for propagation of data. &lt;p&gt;Also, a violation will be reported if the data event and the reference event occur at the same time. &lt;p&gt;&lt;b&gt;$recovery&lt;/b&gt; responds when the following formula is true: &lt;p&gt;(time of data event) - (time of reference event) &amp;lt; limit &lt;p&gt;The &#39;reference_event&#39; must be an edge-triggered event: posedge or negedge. A timing violation occurs if the time interval between an edge-triggered reference event and a data event exceeds the &#39;limit&#39;. If a reference event and data event occur at the same time, a timing violation is reported. If a &#39;reference_event&#39; argument is specified without edge specification, an error is reported. &lt;p&gt;&lt;b&gt;$setuphold&lt;/b&gt; checks setup and hold timing violations. This task combines the functionality of &lt;b&gt;$setup&lt;/b&gt; and &lt;b&gt;$hold&lt;/b&gt; in one task. The following formula has to be applied: &lt;p&gt;setup_limit + hold_limit &amp;gt; 0 &lt;p&gt;&#39;reference_event&#39; have to be one of the following: &lt;ol&gt; &lt;li&gt;&lt;b&gt;$hold&lt;/b&gt;&lt;b&gt; &lt;/b&gt;lower bound event &lt;li&gt;&lt;b&gt;$setup&lt;/b&gt; upper bound event&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&#39;data_event&#39; have to be one of the following: &lt;ol&gt; &lt;li&gt;&lt;b&gt;$hold&lt;/b&gt; upper bound event &lt;li&gt;&lt;b&gt;$setup&lt;/b&gt; lower bound event&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In &lt;b&gt;$width&lt;/b&gt; both limit and threshold have to be positive numbers. The &#39;reference_event&#39; must be the edge specification, otherwise an error will be reported. The &#39;data_event&#39; is not specified directly, but by default means &#39;reference_event&#39; with opposite edge. A timing violation occurs with the following formula: &lt;p&gt;threshold &amp;lt; (time of data event) - (time of reference event) &amp;lt; limit &lt;p&gt;&lt;b&gt;$width&lt;/b&gt; reports when width of the active-edge is too small. In FF case it is very important to ensure that the width of an active-edge is sufficient and FF will work properly. &lt;p&gt;The &lt;b&gt;$period&lt;/b&gt; checks that a period of signal is sufficiently long. The reference_event has to be an edge specification. The data_event is not specified directly and by default, is the same as a reference_event. The &lt;b&gt;$period&lt;/b&gt; reports a timing violation when the following formula comes true: &lt;p&gt;(time of data event) - (time of reference event) &amp;lt; limit &lt;p&gt;The &lt;b&gt;$nochange&lt;/b&gt; checks if the data signal is stable in an interval of start_edge_offset and end_edge_offset. If the signal has changed, a timing violation is reported. The reference_event argument can be posedge or negedge but the edge control specifiers are disallowed. &lt;p&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p&gt;Example 1 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; setup (data1, data2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; data1, data2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (q, data1, data2);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;specparam&lt;/b&gt; tsetup = 7, delay = 10 ;&lt;br&gt;(data1 =&amp;gt; q) = 10 ;&lt;br&gt;&lt;b&gt;$setup&lt;/b&gt;(data1, &lt;b&gt;posedge&lt;/b&gt; data2, tsetup);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 2 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; two_clocks (clk1, clk2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt;&lt;b&gt; &lt;/b&gt;clk1, clk2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam&lt;/b&gt;&lt;b&gt; &lt;/b&gt;tskew = 7;&lt;br&gt;&lt;b&gt;&amp;nbsp; $skew&lt;/b&gt;(&lt;b&gt;posedge&lt;/b&gt; clk1, &lt;b&gt;posedge&lt;/b&gt; clk2, tskew);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 3 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; hold (data1, data2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; data1, data2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (q, data1, data2);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;specparam&lt;/b&gt; thold = 7, delay = 10 ;&lt;br&gt;(data1 =&amp;gt; q) = 10 ;&lt;br&gt;&lt;b&gt;$hold&lt;/b&gt;(posedge data2, data1, thold);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 4 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; recovery (in1, out1);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; in1 ;&lt;br&gt;&lt;b&gt;output&lt;/b&gt;&lt;b&gt; &lt;/b&gt;out1 ;&lt;br&gt;&lt;b&gt;assign&lt;/b&gt;&lt;b&gt; &lt;/b&gt;out1 = in1 &lt;b&gt;?&lt;/b&gt; 1&#39;b1 &lt;b&gt;:&lt;/b&gt;&lt;b&gt; &lt;/b&gt;1&#39;bz ;&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam&lt;/b&gt; trecovery = 10;&lt;br&gt;&lt;b&gt;&amp;nbsp; $recovery&lt;/b&gt;(&lt;b&gt;posedge&lt;/b&gt; in1, out1, trecovery);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 5 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; setuphold (data1, data2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; data1, data2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (q, data1, data2);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;specparam&lt;/b&gt; tsetup = 7,&lt;br&gt;thold = 7,&lt;br&gt;delay = 10 ;&lt;br&gt;(data1 =&amp;gt; q) = 10 ;&lt;br&gt;&lt;b&gt;$setuphold&lt;/b&gt;(posedge data2, data1, tsetup, thold);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 6 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; width (data1, data2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; data1, data2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (q, data1, data2);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;specparam&lt;/b&gt; twidth = 10,&lt;br&gt;delay = 10 ;&lt;br&gt;(data2 =&amp;gt; q) = 10 ;&lt;br&gt;&lt;b&gt;$width&lt;/b&gt;(posedge data2, twidth);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 7 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; dff (clk, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; clk;&lt;br&gt;&lt;b&gt;output&lt;/b&gt;&lt;b&gt; &lt;/b&gt;q;&lt;br&gt;&lt;b&gt;buf&lt;/b&gt; (q, clk);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam&lt;/b&gt; tperiod = 100 ;&lt;br&gt;&lt;b&gt;&amp;nbsp; $period&lt;/b&gt;(&lt;b&gt;posedge&lt;/b&gt; clk, tperiod);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;Example 8 &lt;p&gt;&lt;b&gt;module&lt;/b&gt; nochange (data1, data2, q);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; data1, data2;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (q, data1, data2);&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;specparam&lt;/b&gt; tstart = -5,&lt;br&gt;tend = 5 ;&lt;br&gt;&lt;b&gt;$nochange&lt;/b&gt;(posedge data2, data1, tstart, tend);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt;All timing check system tasks should be invoked within specify blocks.&lt;/li&gt;&lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/169588422839707824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-timing-check-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/169588422839707824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/169588422839707824'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-timing-check-tasks.html' title='Timing Check Tasks'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6882922246211044808</id><published>2012-09-09T01:44:00.002-07:00</published><updated>2012-09-12T19:31:23.311-07:00</updated><title type='text'>Timescale System Tasks</title><content type='html'>&lt;p&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p&gt;Timescale system tasks provide a means of setting and printing timescale information. &lt;p&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p&gt;$&lt;b&gt;printtimescale&lt;/b&gt; [(hierarchical_path)] ; &lt;p&gt;&lt;b&gt;$timeformat&lt;/b&gt; [(unit_number, precision, suffix, min_width )] ; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p&gt;The $printtimeformat system task is used when information about time units and precision is needed. An argument is optional. When the $printtimescale system task is invoked without an argument, the time unit and precision of the current modules are displayed. If an argument is specified, then the time unit and precision of the module specified is displayed in a hierarchical path. The following format is used to display this information: &lt;p&gt;&lt;i&gt;Time scale of (module) is unit / precision&lt;/i&gt; &lt;p&gt;The $timeformat system task has double functionality. &lt;p&gt;First, when any delays are entered interactively, it specifies the time unit. Second, it specifies the %t format specification. These format specifications are used in $display, $fdisplay, $write, $fwrite, $strobe, $fstrobe and $monitor, $fmonitor system tasks. &lt;p&gt;The first argument of $timeformat system task should be an integer. &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;&lt;b&gt;Unit&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;&lt;b&gt;Time&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;&lt;b&gt;Unit&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;&lt;b&gt;Time&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 s&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-8&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;10 ns&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;100 ms&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-9&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 ns&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;10 ms&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-10&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;100 ps&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-3&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 ms&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-11&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;10 ps&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-4&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;100 us&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-12&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 ps&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-5&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;10 us&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-13&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;100 fs&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-6&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 us&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-14&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;10 fs&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-7&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;100 ns&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;-15&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;1 fs&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Default argument values are given in the following table: &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;&lt;b&gt;Argument&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;75%&quot;&gt; &lt;p&gt;&lt;b&gt;Value&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;Unit&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;75%&quot;&gt; &lt;p&gt;The smallest time precision argument of all the `timescale compiler directives in the source description&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;Precision&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;75%&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;Suffix&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;75%&quot;&gt; &lt;p&gt;Null&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;25%&quot;&gt; &lt;p&gt;Minimum width&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;75%&quot;&gt; &lt;p&gt;20&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p&gt;Example 1 &lt;p&gt;`&lt;b&gt;timescale&lt;/b&gt; 1 ns / 100 ps&lt;br&gt;&lt;b&gt;module&lt;/b&gt; a (y, a, b);&lt;br&gt;&lt;b&gt;&amp;nbsp; output&lt;/b&gt;&lt;b&gt; &lt;/b&gt;y;&lt;br&gt;&lt;b&gt;&amp;nbsp; input&lt;/b&gt; a, b;&lt;br&gt;&lt;b&gt;&amp;nbsp; assign&lt;/b&gt; y = a &amp;amp; b;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;br&gt;`&lt;b&gt;timescale&lt;/b&gt; 1 s / 10 fs&lt;br&gt;&lt;b&gt;module&lt;/b&gt; top;&lt;br&gt;&lt;b&gt;&amp;nbsp; wire&lt;/b&gt; y, a, b;&lt;br&gt;&amp;nbsp; a u(y, a, b);&lt;br&gt;&lt;b&gt;&amp;nbsp; initial&lt;/b&gt; &lt;b&gt;$printtimescale&lt;/b&gt;(top.u);&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt; &lt;p&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt;The &lt;b&gt;$timeformat&lt;/b&gt; system task specifies the &lt;b&gt;&lt;i&gt;%t&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt; &lt;/i&gt;&lt;/b&gt;format specification until the next &lt;b&gt;`timescale&lt;/b&gt; compiler directive occurs.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;initial &lt;b&gt;$timeformat&lt;/b&gt;(-9, 5, &quot; ns&quot;, 10);&lt;br&gt;/* $timeformat [ ( n, p, suffix , min_field_width ) ] ;&lt;br&gt;units = 1 second ** (-n), n = 0-&amp;gt;15, e.g. for n = 9, units = ns&lt;br&gt;p = digits after decimal point for %t e.g. p = 5 gives 0.00000&lt;br&gt;suffix for %t (despite timescale directive)&lt;br&gt;min_field_width is number of character positions for %t */ &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6882922246211044808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-timescale-system-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6882922246211044808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6882922246211044808'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-timescale-system-tasks.html' title='Timescale System Tasks'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-4809621949534905703</id><published>2012-09-09T01:43:00.000-07:00</published><updated>2012-09-13T19:38:30.340-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tasks"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Tasks</title><content type='html'>&lt;p&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p&gt;Tasks provide a means of splitting code into small parts. Often tasks consist of frequently used functionalities. &lt;p&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p&gt;&lt;b&gt;task&lt;/b&gt; identifier; &lt;p&gt;&amp;nbsp; parameter_declaration; &lt;p&gt;&amp;nbsp; input_declaration; &lt;p&gt;&amp;nbsp; output_declaration; &lt;p&gt;&amp;nbsp; inout_declaration; &lt;p&gt;&amp;nbsp; register_declaration; &lt;p&gt;&amp;nbsp; event_declaration; &lt;p&gt;&amp;nbsp; statement; &lt;p&gt;&lt;b&gt;endtask&lt;/b&gt; &lt;p&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p&gt;Task definition begins with the keyword &lt;b&gt;task&lt;/b&gt; and ends with the keyword &lt;b&gt;endtask&lt;/b&gt;. A task should be followed by a task identifier and end with a semicolon. A task can contain a declaration of parameters, input arguments, output arguments, inout arguments, registers and events (these declarations are similar to module items declaration) but they are not required. Net declaration is illegal. &lt;p&gt;A task can contain zero or more behavioral statements, e.g. case statement, if statement. A begin-end block is required for bracketing multiple statements. &lt;p&gt;The task enabling statement should be made up of a task identifier and the list of comma-separated task arguments. The list of task arguments should be enclosed in parenthesis. If the task does not contain any argument declarations, then it should be enabled by specifying its identifier followed by a semicolon (&lt;i&gt;Example 2&lt;/i&gt;). &lt;p&gt;The list of task enabling arguments should correspond exactly to the list of task arguments. If a task argument is declared as an input, then a corresponding argument of the task enabling statement can be any expression. If a task argument is declared as an output or an inout then the corresponding argument of the task enabling statement should be one of the following items: &lt;ul&gt; &lt;li&gt;Register data types &lt;li&gt;Memory references &lt;li&gt;Concatenations of registers or memory references &lt;li&gt;Bit-selects and part-selects of &lt;b&gt;reg&lt;/b&gt;, &lt;b&gt;integer&lt;/b&gt; and &lt;b&gt;time&lt;/b&gt; registers&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Only the last assignment to an output or an inout argument is passed to the corresponding task enabling arguments. If a task has assignments to global variables, then all changes of these variables are effective immediately. &lt;p&gt;Tasks can enable others tasks (&lt;i&gt;Example 3&lt;/i&gt;) and functions. A task may be enabled several times in a module. If one task is enabled concurrently, then all registers and events declared in that task should be static, i.e., one variable for all instances. &lt;p&gt;A task can contain time-controlling statements. A task does not return a value by its name. &lt;p&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p&gt;Example 1 &lt;p&gt;&lt;b&gt;task&lt;/b&gt;&lt;b&gt; &lt;/b&gt;first_task;&lt;br&gt;&lt;b&gt;&amp;nbsp; parameter&lt;/b&gt; size = 4;&lt;br&gt;&lt;b&gt;&amp;nbsp; input&lt;/b&gt; a;&lt;br&gt;&lt;b&gt;&amp;nbsp; integer&lt;/b&gt; a;&lt;br&gt;&lt;b&gt;&amp;nbsp; inout&lt;/b&gt; [size-1:0] b;&lt;br&gt;&lt;b&gt;&amp;nbsp; output&lt;/b&gt; c;&lt;br&gt;&lt;b&gt;&amp;nbsp; reg&lt;/b&gt; [size-1:0] d;&lt;br&gt;&lt;b&gt;&amp;nbsp; event&lt;/b&gt; e;&lt;br&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br&gt;&amp;nbsp; d = b;&lt;br&gt;&amp;nbsp; c = |d;&lt;br&gt;&amp;nbsp; b = ~b;&lt;br&gt;&lt;b&gt;if&lt;/b&gt; (!a) -&amp;gt; e;&lt;br&gt;&lt;b&gt;&amp;nbsp; end&lt;/b&gt;&lt;br&gt;&lt;b&gt;endtask&lt;/b&gt; &lt;p&gt;This is an example of using parameters, input arguments, inout arguments, output arguments, registers and events within tasks. The &#39;a&#39; argument is declared as an input and as an integer data type. &lt;p&gt;&#39;First_task&#39; can be enabled as follows: &lt;p&gt;&lt;b&gt;integer&lt;/b&gt; x;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; a, b, y;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; [3:0] z;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; [7:0] w;&lt;br&gt;first_task(x, z, y);&lt;br&gt;first_task(x, w[7:4], w[1]);&lt;br&gt;first_task(1, {a, b, w[3], x[0]}, y); &lt;p&gt;When being enabled, the first argument of the &#39;first_task&#39; should be an integer data type expression, the second should be a 4-bit register expression, and the last argument should be 1-bit register expression. &lt;p&gt;Example 2 &lt;p&gt;&lt;b&gt;reg&lt;/b&gt; a, b;&lt;br&gt;&lt;b&gt;task&lt;/b&gt; my_task; // task definition&lt;br&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br&gt;&amp;nbsp; a = 1&#39;b1;&lt;br&gt;&amp;nbsp; b = 1&#39;bx;&lt;br&gt;&lt;b&gt;end&lt;/b&gt;&lt;br&gt;&lt;b&gt;endtask&lt;/b&gt;&lt;br&gt;my_task; // task enabling &lt;p&gt;If &#39;my_task&#39; is enabled then it will change the value of global variables &#39;a&#39; and &#39;b&#39;. &lt;p&gt;Example 3 &lt;p&gt;&lt;b&gt;task&lt;/b&gt; negation;&lt;br&gt;&lt;b&gt;&amp;nbsp; inout&lt;/b&gt; data;&lt;br&gt;&amp;nbsp; data = ~data;&lt;br&gt;&lt;b&gt;endtask&lt;/b&gt;&lt;br&gt;&lt;b&gt;task&lt;/b&gt; my_nor;&lt;br&gt;&lt;b&gt;&amp;nbsp; input&lt;/b&gt; a, b;&lt;br&gt;&lt;b&gt;&amp;nbsp; output&lt;/b&gt; c;&lt;br&gt;&lt;b&gt;&amp;nbsp; begin&lt;/b&gt;&lt;br&gt;&amp;nbsp; negation(a);&lt;br&gt;&amp;nbsp; negation(b);&lt;br&gt;&amp;nbsp; c = a &amp;amp; b;&lt;br&gt;&lt;b&gt;&amp;nbsp; end&lt;/b&gt;&lt;br&gt;&lt;b&gt;endtask&lt;/b&gt; &lt;p&gt;The &#39;my_nor&#39; task enables negation tasks. &lt;p&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt;A task can contain time-controlling statements &lt;li&gt;A task does not return any value by its name&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/4809621949534905703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/4809621949534905703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/4809621949534905703'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-tasks.html' title='Tasks'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-5677309795578677196</id><published>2012-09-09T01:42:00.000-07:00</published><updated>2012-09-13T19:39:57.192-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Structured Procedures"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Structured Procedures</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Structured procedures provide a means of modeling blocks of procedural statements.&lt;br&gt;&lt;/p&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;always&lt;/b&gt; statement &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;initial &lt;/b&gt;statement &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;function&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;task&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;/b&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Functions and tasks are described in the section: Task and Functions. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;initial&lt;/b&gt; statement (&lt;i&gt;Example 1&lt;/i&gt;) is executed only during a simulation run. The always procedural block statement (&lt;i&gt;Example 2&lt;/i&gt;) is executed continuously during simulation, i.e. when the flow of program reaches the last statement in the block, the flow continues with the first statement in the block. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;always&lt;/b&gt; statement should contain at least one procedural timing control because otherwise it may hang the simulation. &lt;p align=&quot;justify&quot;&gt;Module definition can contain more than one &lt;b&gt;initial&lt;/b&gt; or &lt;b&gt;always&lt;/b&gt; statement. &lt;p align=&quot;justify&quot;&gt;Care must be taken when same reg type variables are used in multiple procedural blocks, initial or always. This is because these blocks run in parallel and changing or assigning to one variable affects the same variable in another parallel block.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;initial&lt;/b&gt; out = 1&#39;b0;&lt;br&gt;&lt;b&gt;initial&lt;/b&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; a = 1&#39;b0;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; a = 1&#39;b1;&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&amp;nbsp; a = 1&#39;bz;&lt;br&gt;&lt;b&gt;end&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;always&lt;/b&gt; @(posedge clk)&lt;br&gt;q = d;&lt;br&gt;&lt;b&gt;always&lt;/b&gt; #10 clk = ~clk;&lt;br&gt;&lt;b&gt;initial&lt;/b&gt; clk = 0;&lt;br&gt;&lt;b&gt;initial&lt;/b&gt; &lt;b&gt;repeat&lt;/b&gt;(20)#\10 clk=~clk;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;The first initial statement sets clk to 0 at time 0, and the second initial block toggles the clk 20 times every 10 time units.&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· The &lt;b&gt;always&lt;/b&gt; statement should contain at least one procedural timing control. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/5677309795578677196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-structured-procedures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/5677309795578677196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/5677309795578677196'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-structured-procedures.html' title='Structured Procedures'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6830884744518454616</id><published>2012-09-09T01:40:00.000-07:00</published><updated>2012-09-13T19:40:58.481-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Strings"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Strings</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;The strings are sequences of 8-bit ASCII characters enclosed within quotation marks. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&quot;This is a string&quot; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt;&lt;b&gt; &lt;/b&gt;[8*number_of_characters:1] string_variable; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;The string should be given in one line. Strings can contain special characters (&lt;i&gt;Example 1&lt;/i&gt;).&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;&lt;b&gt;Character&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;&lt;b&gt;Meaning&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;\n&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;New line character&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;\t&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;Tab character&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;\\&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;\ character&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;\”&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;&quot; character&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;27%&quot;&gt; &lt;p&gt;\ddd&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;73%&quot;&gt; &lt;p&gt;A character specified by octal digit&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Table 24: Summary of special characters&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;String variables should be declared as reg type vectors (&lt;i&gt;Example 2&lt;/i&gt;). Each character needs 8 bits. &lt;p align=&quot;justify&quot;&gt;If a string variable is used in an expression, it should be treated as an unsigned value. If the size of a string assigned to a string variable is smaller than the declared size of the variable, then it will be left-padded with zeros. &lt;p align=&quot;justify&quot;&gt;The null string &quot;” should be treated same as &quot;\0”. &lt;p align=&quot;justify&quot;&gt;Concatenations of string variables preserve left-padded zeros of these variables (&lt;i&gt;Example 3&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&quot;\n This is the first line\n This is the second line&quot;&lt;br&gt;&quot;\t Line\t with\t tab\t characters&quot;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt; [8*12:1] message; &lt;p align=&quot;justify&quot;&gt;The message variable can contain 12 characters. &lt;p align=&quot;justify&quot;&gt;&lt;i&gt;Example 3&lt;/i&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt; [10*8:1] s1, s2;&lt;br&gt;s1 = &quot;Verilog&quot;;&lt;br&gt;s2 = &quot;-HDL&quot;;&lt;br&gt;{s1, s2} &amp;lt;&amp;gt; {&quot;Verilog&quot;, &quot;-HDL&quot;}&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;These expressions are not equal because {s1, s2} has 0s between &quot;Verilog” and &quot;-HDL” and {&quot;Verilog”, &quot;-HDL”} does not have any 0s between words. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Concatenation of string variables preserves left-padded zeros of these variables.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6830884744518454616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-strings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6830884744518454616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6830884744518454616'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-strings.html' title='Strings'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-5829945962688677567</id><published>2012-09-09T01:39:00.000-07:00</published><updated>2012-09-13T19:42:05.427-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Strengths"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Strengths</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;The strength declaration construct is used for modeling net type variables for a close correspondence with physical wires. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;(Strength1, Strength0)&lt;/b&gt;&lt;br&gt;&lt;b&gt;(Strength0, Strength1)&lt;/b&gt;&lt;br&gt;&lt;b&gt;Strength1:&lt;/b&gt;&lt;br&gt;&lt;b&gt;supply1, strong1, pull1, large1, weak1, medium1, small1, highz1&lt;/b&gt;&lt;br&gt;&lt;b&gt;Strength0:&lt;/b&gt;&lt;br&gt;&lt;b&gt;supply0, strong0, pull0, large0, weak0, medium0, small0, highz0&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Strengths can be used to resolve which value should appear on a net or gate output. &lt;p align=&quot;justify&quot;&gt;There are two types of strengths: drive strengths (&lt;i&gt;Example 1&lt;/i&gt;) and charge strengths (&lt;i&gt;Example 2&lt;/i&gt;). The drive strengths can be used for nets (except &lt;b&gt;trireg&lt;/b&gt; net), gates, and UDPs. The charge strengths can be used only for &lt;b&gt;trireg&lt;/b&gt; nets. The drive strength types are &lt;b&gt;supply&lt;/b&gt;, &lt;b&gt;strong&lt;/b&gt;, &lt;b&gt;pull&lt;/b&gt;, &lt;b&gt;weak&lt;/b&gt;, and &lt;b&gt;highz&lt;/b&gt; strengths. The charge strength types are &lt;b&gt;large&lt;/b&gt;, &lt;b&gt;medium&lt;/b&gt;and &lt;b&gt;small&lt;/b&gt; strengths. &lt;p align=&quot;justify&quot;&gt;All strengths can be ordered by their value. The &lt;b&gt;supply&lt;/b&gt; strength is the strongest and the &lt;b&gt;highz&lt;/b&gt; strength is the weakest strength level. Strength value can be displayed by system tasks (&lt;b&gt;$display&lt;/b&gt;, &lt;b&gt;$monitor&lt;/b&gt; - by using of the %v characters - see Display tasks for more explanation).&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;&lt;b&gt;Strength&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;&lt;b&gt;Value&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;&lt;b&gt;Value displayed by display tasks&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;supply&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;7&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;Su&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;strong&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;6&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;St&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;pull&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;5&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;Pu&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;large&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;4&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;La&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;weak&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;3&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;We&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;medium&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;Me&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;small&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;Sm&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;21%&quot;&gt; &lt;p&gt;highz&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;16%&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;64%&quot;&gt; &lt;p&gt;HiZ&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Table 23 Strengths ordered by value&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;If two or more drivers drive a signal then it will have the value of the strongest driver (&lt;i&gt;Example 3&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;If two drivers of a net have the same strength and value, then the net result will have the same value and strength (&lt;i&gt;Example 4&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;If two drivers of a net have the same strength but different values then signal value will be unknown and it will have the same strength as both drivers (&lt;i&gt;Example 5&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;If one of the drivers of a net has an H or L value, then signal value will be &lt;b&gt;n1n2X&lt;/b&gt;, where &lt;b&gt;n1&lt;/b&gt; is the strength value of the driver that has the smaller strength, and &lt;b&gt;n2&lt;/b&gt; is strength value of driver that has the larger strength (&lt;i&gt;Example 6&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;The combinations (&lt;b&gt;highz0&lt;/b&gt;, &lt;b&gt;highz1&lt;/b&gt;) and (&lt;b&gt;highz1&lt;/b&gt;, &lt;b&gt;highz0&lt;/b&gt;) are illegal. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;and&lt;/b&gt; (strong1, weak0) b(o, i1, i2); &lt;p align=&quot;justify&quot;&gt;Instance of &lt;b&gt;and&lt;/b&gt; gate with &lt;b&gt;strong1&lt;/b&gt; strength and &lt;b&gt;weak0&lt;/b&gt; strength specified. &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;trireg&lt;/b&gt; (&lt;b&gt;medium&lt;/b&gt;) t; &lt;p align=&quot;justify&quot;&gt;The charge strength declaration for &lt;b&gt;trireg&lt;/b&gt; net. &lt;p align=&quot;justify&quot;&gt;Example 3 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g1 (y, a);&lt;br&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;pull1&lt;/b&gt;, &lt;b&gt;supply0&lt;/b&gt;) g2 (y, b);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;If a = 0 and b = 0 then y will be 0 with &lt;b&gt;supply&lt;/b&gt; strength because both gates will set y to 0 and &lt;b&gt;supply&lt;/b&gt; (7) strength has bigger value than &lt;b&gt;weak&lt;/b&gt; (3) strength. &lt;p align=&quot;justify&quot;&gt;If a = 0 and b = 1 then y will be 1 with &lt;b&gt;pull&lt;/b&gt; strength because g1 will set y to 0 with &lt;b&gt;weak&lt;/b&gt; (3) strength and g2 will set y to 1 with &lt;b&gt;pull&lt;/b&gt; (5) strength (pull strength is stronger than the weak strength). &lt;p align=&quot;justify&quot;&gt;If a = 1 and b = 0 then y will be 0 with &lt;b&gt;supply&lt;/b&gt; strength because g1 will set y to 1 with &lt;b&gt;strong&lt;/b&gt; (6) strength and g2 will set y to 0 with &lt;b&gt;supply&lt;/b&gt; (7) strength (supply strength is stronger than the strong strength). &lt;p align=&quot;justify&quot;&gt;If a = 1 and b = 1 then y will be 1 with &lt;b&gt;strong&lt;/b&gt; strength because g1 will set y to 1 with &lt;b&gt;strong&lt;/b&gt; (6) strength and g2 will set y to 1 with &lt;b&gt;pull&lt;/b&gt; (5) strength. &lt;p align=&quot;justify&quot;&gt;Example 4 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g1 (y, a);&lt;br&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g1 (y, b);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;If a = 0 and b = 0 then y will be 0 with weak strength. &lt;p align=&quot;justify&quot;&gt;If a = 1 and b = 1 then y will be 1 with strong strength. &lt;p align=&quot;justify&quot;&gt;Example 5 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g1 (y, a);&lt;br&gt;&lt;b&gt;buf&lt;/b&gt; (&lt;b&gt;weak1&lt;/b&gt;, &lt;b&gt;strong0&lt;/b&gt;) g1 (y, b);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;If a = 1 and b = 0 then y will be x with &lt;b&gt;strong&lt;/b&gt; strength. &lt;p align=&quot;justify&quot;&gt;Example 6 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;bufif0&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g1 (y, i1, ctrl);&lt;br&gt;&lt;b&gt;bufif0&lt;/b&gt; (&lt;b&gt;strong1&lt;/b&gt;, &lt;b&gt;weak0&lt;/b&gt;) g2 (y, i2, ctrl);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;If ctrl = x, i1 = 0, and i2 = 1 then y will be x with &lt;b&gt;36X&lt;/b&gt; strength, because g1 will set y to L with &lt;b&gt;strong&lt;/b&gt; strength (StL - 6) and g2 will set y to H with &lt;b&gt;weak&lt;/b&gt; strength (WeH - 3). &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;If one of the drivers has an H or L value, then the output value will be X.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/5829945962688677567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-strengths.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/5829945962688677567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/5829945962688677567'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-strengths.html' title='Strengths'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-871521913068884168</id><published>2012-09-09T01:37:00.000-07:00</published><updated>2012-09-09T01:37:57.115-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Module Instantiation"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Module Instantiation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/871521913068884168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-module-instantiation_9.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/871521913068884168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/871521913068884168'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-module-instantiation_9.html' title='Module Instantiation'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-4339576468975857864</id><published>2012-09-09T01:36:00.000-07:00</published><updated>2012-09-27T19:11:51.487-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Stochastic Analysis Tasks"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Stochastic Analysis Tasks</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Stochastic analysis tasks provide a means of managing queues. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;q_initialize&lt;/b&gt;(identifier, type, length, status) ;&lt;br&gt;&lt;b&gt;$q_add(&lt;/b&gt;identifier, job, information, status&lt;b&gt;)&lt;/b&gt; ;&lt;br&gt;&lt;b&gt;$q_remove(&lt;/b&gt;identifiers, job, information, status&lt;b&gt;)&lt;/b&gt; ;&lt;br&gt;&lt;b&gt;$q_full(&lt;/b&gt;identifier, status&lt;b&gt;)&lt;/b&gt; ;&lt;br&gt;&lt;b&gt;$q_exam(&lt;/b&gt;identifier, statistic_code, statistic_value, status&lt;b&gt;)&lt;/b&gt; ;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;All statistic analysis tasks include identifier, and status arguments. The identifier is a unique integer value identifying the queue. The status argument is an output integer parameter giving information about the correctness of the specified task execution.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;&lt;b&gt;Status&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;&lt;b&gt;Message&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The queue generation was successful.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The queue cannot be increased; queue is full.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The identifier is undefined; please define an identifier.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;3&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;Cannot remove a value; queue is empty.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;4&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The queue cannot be generated; this type is unsupported.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;5&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The length parameter is &amp;lt;= 0; the queue cannot be generated.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;6&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The identifier is duplicated; please define new identifier.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;14%&quot;&gt; &lt;p&gt;7&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;86%&quot;&gt; &lt;p&gt;The queue cannot be generated; insufficient memory.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$q_initialize&lt;/b&gt; creates a queue. Parameter &lt;i&gt;type&lt;/i&gt; determines the type of a queue. In case of 1, the created queue is FIFO and in case of 2 the queue is LIFO. Parameter &lt;i&gt;length&lt;/i&gt; is an integer value specifying the maximum number of entries. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$q_add&lt;/b&gt; adds a new entry to the queue. Parameter &lt;i&gt;job&lt;/i&gt; identifies the job. The special user-defined parameter, &lt;i&gt;information&lt;/i&gt;, can maintain any information useful for the user. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$q_remove&lt;/b&gt; receives data from the queue. Parameters of this task are the same as those of the &lt;b&gt;$q_add&lt;/b&gt;&lt;b&gt; &lt;/b&gt;task. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$q_full&lt;/b&gt; checks to see of the queue identified by the identifier parameter is full. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$q_exam&lt;/b&gt; returns statistical information about the queue. Parameter &lt;i&gt;statistic_code&lt;/i&gt; determines what you need to check and returns the result in &lt;i&gt;statistic_value&lt;/i&gt;. The following table lists all possible values of &lt;i&gt;statistic_code&lt;/i&gt;:&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;&lt;b&gt;Statistic_code&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;&lt;b&gt;Statistic_value&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Length of queue.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Mean interarrival time.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;3&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Maximum length of queue.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;4&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Shortest wait time.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;5&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Longest wait time for jobs still in the queue.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;28%&quot;&gt; &lt;p&gt;6&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;72%&quot;&gt; &lt;p&gt;Average wait time in the queue.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;always&lt;/b&gt; @(posedge clk)&lt;br&gt;&lt;b&gt;begin&lt;/b&gt;&lt;br&gt;// check if queue1 is full&lt;br&gt;&lt;b&gt;$q_full&lt;/b&gt;(queue1, status);&lt;br&gt;// if full then show message and remove one item&lt;br&gt;&lt;b&gt;if&lt;/b&gt; (status) &lt;b&gt;begin&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; $display&lt;/b&gt;(&quot;Queue is full”);&lt;br&gt;&lt;b&gt;&amp;nbsp; $q_remove&lt;/b&gt;(queue1, 1, info, status);&lt;br&gt;&lt;b&gt;end&lt;/b&gt;&lt;br&gt;// add a new item to queue1&lt;br&gt;&lt;b&gt;$q_add&lt;/b&gt;(queue1, 1, info, status);&lt;br&gt;// show message if there was an error&lt;br&gt;&lt;b&gt;if&lt;/b&gt; (status)&lt;br&gt;&lt;b&gt;&amp;nbsp; $display&lt;/b&gt;(&quot;Error %d”,status);&lt;br&gt;&lt;b&gt;end&lt;/b&gt;&lt;br&gt;&lt;b&gt;end&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;This example shows how to add a new element to the queues. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;The status parameter value should be checked after all operations on the queue.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/4339576468975857864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-stcohastic-analysis-task.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/4339576468975857864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/4339576468975857864'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-stcohastic-analysis-task.html' title='Stochastic Analysis Tasks'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6641927857654926778</id><published>2012-09-09T01:30:00.003-07:00</published><updated>2012-09-27T19:09:34.301-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="State Dependent Path"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>State Dependent Path</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;State Dependent Path is a path that occurs only when the condition is met.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;if&lt;/b&gt; (condition) simple_module_path; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;if (&lt;/b&gt;condition&lt;b&gt;) &lt;/b&gt;edge_sensitive_path; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;ifnone &lt;/b&gt;simple_module_path&lt;b&gt;;&lt;br&gt;&lt;/b&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Generally, state dependent path is comprised of three parts. A condition that enables the module path, a module path description and a delay that applies to the module path. &lt;p align=&quot;justify&quot;&gt;The condition is an expression using scalars or vectors of any type. It can also be part-selects or bit-selects of a vector. Constant numbers and specparams can be used in the condition expression. The result of the conditional expression can be one bit or multiple bits. If it is more than one bit, the least significant bit represents the result. &lt;p align=&quot;justify&quot;&gt;When no edge transition is specified for the inputs, it is called the simple state-dependent path. Example 1 shows the simple-dependent path. &lt;p align=&quot;justify&quot;&gt;If any edge transition is specified for the input, then it is called an edge-sensitive state-dependent path. Different delays can be used to the same path if the following rules are followed: &lt;p align=&quot;justify&quot;&gt;a. A declaration must be unique and should use an edge or a conditional expression or both. &lt;p align=&quot;justify&quot;&gt;b. The port for which the delay is specified must be referenced in exactly the same way. You cannot mix part select, bit-select and complete ports.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;module&lt;/b&gt; example1 (cond, in_1, in_2, out);&lt;br&gt;&lt;b&gt;input&lt;/b&gt; in_1, in_2, cond ;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; out ;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; (out, in_1, in_2) ;&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam&lt;/b&gt; TRise1 = 5,&lt;br&gt;&amp;nbsp; TFall1 = 5,&lt;br&gt;&amp;nbsp; TRise2 = 7,&lt;br&gt;&amp;nbsp; TFall2 = 7;&lt;br&gt;&lt;b&gt;&amp;nbsp; if&lt;/b&gt; (cond) ( in_1, in_2 *&amp;gt; out ) = (TRise1, TFall1);&lt;br&gt;&lt;b&gt;&amp;nbsp; if&lt;/b&gt; (~cond) ( in_1, in_2 *&amp;gt; out ) = (TRise2, TFall2);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;If a conditional expression &#39;cond&#39; is true, &lt;i&gt;TRise1&lt;/i&gt; and &lt;i&gt;TFall1&lt;/i&gt; will be assigned to a path as delays. When the conditional expression &#39;cond&#39; is false, &lt;i&gt;TRise2&lt;/i&gt; and &lt;i&gt;TFall2&lt;/i&gt; will be used as the path delays.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· When a conditional expression evaluates to x or z, it should be treated as true. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6641927857654926778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-state-dependent-path.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6641927857654926778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6641927857654926778'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-state-dependent-path.html' title='State Dependent Path'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-3305386134680981164</id><published>2012-09-09T01:30:00.000-07:00</published><updated>2012-09-27T19:07:58.661-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Specify Block"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Specify Block</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Allows a specific delay across a module.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;specify&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; specparam declaration ; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; path declaration ; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; system timing check ; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;endspecify&lt;br&gt;&lt;/b&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The Specify block was designed to define a delay across a module. It starts with &lt;b&gt;specify&lt;/b&gt; and ends with the &lt;b&gt;endspecify&lt;/b&gt; keyword. Inside the block the user can specify: &lt;b&gt;specparam&lt;/b&gt;declaration, path declaration or system timing check. &lt;p align=&quot;justify&quot;&gt;The&lt;b&gt; &lt;/b&gt;syntax of &lt;b&gt;specparam&lt;/b&gt; declaration is the same as that of the parameter declaration. After the &lt;b&gt;specparam&lt;/b&gt; keyword the user can specify any number of parameters but only constant expressions are allowed on the right-hand sides of parameter assignments. A comma can separate the assignments, and the last statement ends with a semicolon. A previously declared specparameter can be used to declare the new specparameters. Unlike &lt;i&gt;parameters, specparams &lt;/i&gt;cannot be overwritten, nor can they be used outside of a specify block.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;module&lt;/b&gt; ...&lt;br&gt;...&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&amp;nbsp; (In =&amp;gt; Out) = (10);&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;...&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;A specify block with only a path declaration. Delay between input In and output Out is 10 time units. &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;module&lt;/b&gt; ...&lt;br&gt;...&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam &lt;/b&gt;TRise = 10,&lt;br&gt;&amp;nbsp; TFall = 15;&lt;br&gt;&amp;nbsp; (In =&amp;gt; Out) = (TRise, TFall) ;&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;...&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Specparam declaration with two parameters TRise and TFall to specify delays on rising transition and falling transition. &lt;p align=&quot;justify&quot;&gt;Example 3 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;module&lt;/b&gt; ...&lt;br&gt;...&lt;br&gt;&lt;b&gt;specify&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; specparam &lt;/b&gt;TRise = 10,&lt;br&gt;&amp;nbsp; TFall = 15;&lt;br&gt;&amp;nbsp; (In =&amp;gt; Out) = (TRise, TFall) ;&lt;br&gt;&lt;b&gt;&amp;nbsp; $setup&lt;/b&gt;(Data_in, posedge Clock, TRise) ;&lt;br&gt;&lt;b&gt;endspecify&lt;/b&gt;&lt;br&gt;...&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;The full specify block with &lt;b&gt;specparam&lt;/b&gt; declaration, path declaration and system timing check task.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· Specify blocks have to be inside the module declaration location. &lt;p align=&quot;justify&quot;&gt;· &lt;b&gt;Specparams&lt;/b&gt; are not visible outside of the Specify blocks. &lt;p align=&quot;justify&quot;&gt;· The&lt;b&gt; &lt;/b&gt;&lt;b&gt;defparam&lt;/b&gt; keyword cannot be used to override a &lt;b&gt;specparam&lt;/b&gt; value. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/3305386134680981164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-specify-block.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3305386134680981164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3305386134680981164'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-specify-block.html' title='Specify Block'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-9186542849372238971</id><published>2012-09-09T01:29:00.000-07:00</published><updated>2012-09-27T19:06:43.663-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Simulation Time Functions"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Simulation Time Functions</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The simulation time function provides an access to current simulation time.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;time&lt;/b&gt; ; &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;stime&lt;/b&gt; ; &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;realtime&lt;/b&gt; ;&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;When the $time system function is called, it returns the current time as a 64-bit integer value. However, this value is scaled to the `timescale unit. (See Timescale chapter) &lt;p align=&quot;justify&quot;&gt;The $stime system function returns current time as a 32-bit unsigned integer value. If the current simulation time is too large and the value does not fit in 32 bits, the function only returns the 32 low order bits of the value. The returned value is also scaled to the `timescale. &lt;p align=&quot;justify&quot;&gt;The $realtime system function returns a value as a real number. As with the other time tasks, the returned value is scaled to the `timescale.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;integer&lt;/b&gt; cur_time ;&lt;br&gt;cur_time = &lt;b&gt;$time&lt;/b&gt; ;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;integer&lt;/b&gt; cur_time ;&lt;br&gt;cur_time = &lt;b&gt;$stime&lt;/b&gt; ;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 3 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;real&lt;/b&gt; cur_time ;&lt;br&gt;cur_time = &lt;b&gt;$realtime&lt;/b&gt; ;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 4 &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;display&lt;/b&gt;($&lt;b&gt;time&lt;/b&gt;, &quot;is current time.&quot;);&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· $time, $stime, $realtime are functions which return specific values. If you are using these functions you have to declare registers that can support the returned value. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/9186542849372238971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-simulation-time-functions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/9186542849372238971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/9186542849372238971'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-simulation-time-functions.html' title='Simulation Time Functions'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-3679102356786158709</id><published>2012-09-09T01:28:00.002-07:00</published><updated>2012-09-27T19:05:23.750-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Simulation Control Tasks"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Simulation Control Tasks</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Simulation control tasks allow you to stop or quit simulation. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;stop&lt;/b&gt; [(n)] ; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;$finish&lt;/b&gt; [(n)] ; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;The $stop system task is used to suspend simulation. When invoked it suspends simulation, prints simulation time and prints location. Optional expressions can determine the type of printed message:&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;473&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt; &lt;p&gt;&lt;b&gt;Expression (n)&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt; &lt;p&gt;&lt;b&gt;Message&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt; &lt;p&gt;0&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt; &lt;p&gt;No message&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt; &lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt; &lt;p&gt;Simulation time and location&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;107&quot;&gt; &lt;p&gt;2&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;364&quot;&gt; &lt;p&gt;Simulation time, location, memory consumption and CPU time used in simulation&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;By default the value 1 is used. &lt;p align=&quot;justify&quot;&gt;The $finish system task ends the simulation, exits the simulator and passes control back to the operating system. It can be invoked with the same arguments as the $stop system task and has the same default value. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;$&lt;b&gt;stop&lt;/b&gt; ; &lt;p align=&quot;justify&quot;&gt;Suspend simulation and print message (default argument = 1) &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;#150 $&lt;b&gt;finish&lt;/b&gt;(2) ; &lt;p align=&quot;justify&quot;&gt;Exits simulator after 150 time units from the last executed statement and prints message (argument == 2). &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Remember that &lt;b&gt;$finish&lt;/b&gt;&lt;b&gt; &lt;/b&gt;control system task makes the simulator exit, however &lt;b&gt;$stop&lt;/b&gt; simply suspends simulation.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/3679102356786158709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-simulation-control-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3679102356786158709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/3679102356786158709'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-simulation-control-tasks.html' title='Simulation Control Tasks'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-1564202930669617708</id><published>2012-09-09T01:27:00.003-07:00</published><updated>2012-09-27T19:03:59.858-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Register Data Types"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Register Data Types</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Registers provide means for modeling data storage elements.&lt;br&gt; &lt;h4&gt;Simplified Syntax:&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt; range list_of_identifiers; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;integer &lt;/b&gt;list_of_identifiers; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;real&lt;/b&gt; list_of_identifiers; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;time&lt;/b&gt; list_of_identifiers; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;realtime&lt;/b&gt; list_of_identifiers;&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Registers are data types that store assigned values until a new assignment occurs. A new value can be assigned to registers only by using procedural assignments. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;reg&lt;/b&gt; register is a 1-bit wide data type. If more than one bit is required then range declaration should be used (see Vectors for more explanations). Negative values assigned to reg data type variables are treated as unsigned values (see Arithmetic expressions with integers and registers for more explanations). Reg data type variables can be declared as memory. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;integer&lt;/b&gt; register is a 32-bit wide data type. Integer declarations cannot contain range specification. Integer variables can be declared as memory. Integers store signed values. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;time&lt;/b&gt; register is a 64-bit wide data type that is used to store simulation time and to check timing dependence. Time type registers store values as unsigned numbers. Time declaration cannot contain range specification. Time data type variables can be declared as memories. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;real&lt;/b&gt; register is a 64-bit wide data type that stores floating-point values. Real registers cannot be used with event control, concatenations ({}), modulus operator (%), case equality (===, !==), bit-wise operators (~, &amp;amp;, |, ^, ^~, ~^), reduction operators (^, ~^, ^~, &amp;amp;, &amp;amp;~, |, |~) and shift operators (&amp;lt;&amp;lt;, &amp;gt;&amp;gt;). Bit-selects and part-selects on real type variables are not allowed. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;realtime&lt;/b&gt; registers are treated in the same way as real registers.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;reg scal;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; [7:0] vect;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; [7:0] mem [31:0];&lt;br&gt;&lt;b&gt;integer&lt;/b&gt; i;&lt;br&gt;&lt;b&gt;integer&lt;/b&gt; i_mem [7:0];&lt;br&gt;&lt;b&gt;time&lt;/b&gt; t;&lt;br&gt;&lt;b&gt;time&lt;/b&gt; t_mem [3:0];&lt;br&gt;&lt;b&gt;real&lt;/b&gt; r;&lt;br&gt;&lt;b&gt;realtime&lt;/b&gt; rt1, rt2;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&#39;scal&#39; is a 1-bit wide &lt;b&gt;reg&lt;/b&gt; type register. &lt;p align=&quot;justify&quot;&gt;&#39;vect&#39; is an 8-bit wide &lt;b&gt;reg&lt;/b&gt; type register. &lt;p align=&quot;justify&quot;&gt;&#39;mem&#39; is a &lt;b&gt;reg&lt;/b&gt; type memory of 32 8-bit words. &lt;p align=&quot;justify&quot;&gt;&#39;i&#39; is an &lt;b&gt;integer&lt;/b&gt; type register. &lt;p align=&quot;justify&quot;&gt;&#39;i_mem&#39; is an &lt;b&gt;integer&lt;/b&gt; type memory. &lt;p align=&quot;justify&quot;&gt;&#39;t&#39; is a &lt;b&gt;time&lt;/b&gt; type register. &lt;p align=&quot;justify&quot;&gt;&#39;t_mem&#39; is a &lt;b&gt;time&lt;/b&gt; type memory. &lt;p align=&quot;justify&quot;&gt;&#39;r&#39; is a &lt;b&gt;real&lt;/b&gt; type register. &lt;p align=&quot;justify&quot;&gt;&#39;rt1&#39; and &#39;rt2&#39; are &lt;b&gt;realtime&lt;/b&gt; type registers.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· New values can be assigned to registers only by using procedural statements. &lt;p align=&quot;justify&quot;&gt;· Some operators, bit-selects, part-selects, range and memory declaration arecannot be used with &lt;b&gt;real&lt;/b&gt; and &lt;b&gt;realtime&lt;/b&gt; type registers. &lt;p align=&quot;justify&quot;&gt;· Range can be specified only for &lt;b&gt;reg&lt;/b&gt; data type registers. &lt;p align=&quot;justify&quot;&gt;· &lt;b&gt;Real&lt;/b&gt; and &lt;b&gt;realtime&lt;/b&gt; registers are initialized to zero value. &lt;b&gt;Reg&lt;/b&gt;, &lt;b&gt;integer&lt;/b&gt; and &lt;b&gt;time&lt;/b&gt; registers are initialized to unknown value (x). &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/1564202930669617708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-register-data-types.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/1564202930669617708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/1564202930669617708'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-register-data-types.html' title='Register Data Types'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-8325439441226982636</id><published>2012-09-09T01:27:00.000-07:00</published><updated>2012-09-27T19:02:37.423-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Real Constants"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Real Constants</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The real constants are used to specify floating-point numbers.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;sign unsigned_number.unsigned_number &lt;p align=&quot;justify&quot;&gt;sign unsigned_number.unsigned_number &lt;b&gt;e&lt;/b&gt; sign unsigned_number &lt;p align=&quot;justify&quot;&gt;sign unsigned_number.unsigned_number &lt;b&gt;E&lt;/b&gt; sign unsigned_number&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;A real constant can be specified using only digits, underscores, decimal points and exponential symbols (e or E). It cannot be specified with size or base format. If a decimal point is provided then the real number should have at least one digit on both sides of a decimal point. Real numbers can be specified in the decimal notation (&lt;i&gt;Example 1&lt;/i&gt;) or in the scientific notation (&lt;i&gt;Example 2&lt;/i&gt;).&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;17.5&lt;br&gt;0.5&lt;br&gt;1_000_000.0&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;10e5&lt;br&gt;0.5694_e-5&lt;/p&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· The real constants cannot be specified with size or base format. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/8325439441226982636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-real-constants.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8325439441226982636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8325439441226982636'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-real-constants.html' title='Real Constants'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-6623052379827963713</id><published>2012-09-09T01:26:00.002-07:00</published><updated>2012-09-27T19:01:43.850-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Range Specification"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Range Specification</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The range specification can be used to specify an array of gate or module instances.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;instance_name&lt;b&gt;[l_index:r_index]&lt;/b&gt; (list of terminals);&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The range should be specified using two constant expressions separated by a colon and bracketed by square brackets. The expressions constitutes: the left-hand index (&lt;i&gt;l_index&lt;/i&gt;) and right-hand index (&lt;i&gt;r_index&lt;/i&gt;). The left-hand index can be less than, equal, or greater than the right-hand index (&lt;i&gt;Example 1&lt;/i&gt;). If these indexes are equal then only one instance will be generated (&lt;i&gt;Example 2&lt;/i&gt;). Identical instance names cannot appear twice with other range specifications (even if ranges do not overlap each other).&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt; [3:0] a, b;&lt;br&gt;&lt;b&gt;wire&lt;/b&gt; [3:0] y;&lt;br&gt;&lt;b&gt;and&lt;/b&gt; g[3:0](y,a,b);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;This declaration is equivalent to: &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;and&lt;/b&gt; g3 (y[3], a[3], b[3]);&lt;br&gt;&lt;b&gt;and&lt;/b&gt; g2 (y[2], a[2], b[2]);&lt;br&gt;&lt;b&gt;and&lt;/b&gt; g1 (y[1], a[1], b[1]);&lt;br&gt;&lt;b&gt;and&lt;/b&gt; g0 (y[0], a[0], b[0]);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;reg&lt;/b&gt; a, b;&lt;br&gt;&lt;b&gt;wire&lt;/b&gt; y;&lt;br&gt;&lt;b&gt;or&lt;/b&gt; g[0:0](y,a,b);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;This declaration is equivalent to:&lt;br&gt;&lt;b&gt;or&lt;/b&gt; g (y, a, b);&lt;/p&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· If the range is used in module or gate instantiations, then terminals of all output ports should not be scalars or there may be a bus conflict. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/6623052379827963713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-range-specification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6623052379827963713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/6623052379827963713'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-range-specification.html' title='Range Specification'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-8418070703908998306</id><published>2012-09-09T01:25:00.003-07:00</published><updated>2012-09-27T19:00:29.044-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Procedural Timing Control"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Procedural Timing Control</title><content type='html'>&lt;h4 align=&quot;justify&quot;&gt;Formal Definition&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The procedural timing control is used to determine when statements should be executed.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Simplified Syntax&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Delay control:&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; #delay &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; #(&lt;/b&gt;min:typ:max delay&lt;b&gt;)&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Event type declaration:&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; event &lt;/b&gt;identifier; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Event trigger:&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; -&amp;gt; &lt;/b&gt;event_identifier; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Event control:&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; @(&lt;/b&gt;event_identifier&lt;b&gt;)&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; @(posedge&lt;/b&gt; identifier&lt;b&gt;)&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; @(negedge&lt;/b&gt; identifier&lt;b&gt;)&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; @(&lt;/b&gt;event_expression&lt;b&gt; &lt;/b&gt;&lt;b&gt;or &lt;/b&gt;event_expression&lt;b&gt;)&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Wait statement:&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&amp;nbsp; wait &lt;/b&gt;(expression) statement&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Description&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;The Verilog HDL has two types of timing controls: delay control (&lt;i&gt;Example 1&lt;/i&gt;) and event control (&lt;i&gt;Example 2&lt;/i&gt;). &lt;p align=&quot;justify&quot;&gt;The delay control specifies the time between encountering and executing the statement. The delay control can be specified as a simple delay and as min:typ:max delay. &lt;p align=&quot;justify&quot;&gt;The named event (&lt;i&gt;Example 3&lt;/i&gt;) is a special data type that does not hold any value. The event can be triggered using special characters &lt;b&gt;-&amp;gt;&lt;/b&gt; followed by an event identifier. Any occurrence of an event trigger can be noticed using an event control statement. &lt;p align=&quot;justify&quot;&gt;An event control specifies the event that is required to resume execution of a statement. Event can be one of the following: &lt;p align=&quot;justify&quot;&gt;· Named event &lt;p align=&quot;justify&quot;&gt;· Change of a signal value &lt;p align=&quot;justify&quot;&gt;· Positive or negative edge occurred on signal (&lt;b&gt;posedge&lt;/b&gt;, &lt;b&gt;negedge&lt;/b&gt;) &lt;p align=&quot;justify&quot;&gt;· List of above-mentioned events (separated by &lt;b&gt;or&lt;/b&gt; - event or operator) &lt;p align=&quot;justify&quot;&gt;A &lt;b&gt;posedge&lt;/b&gt; is any transition from 0, x, and z to 1, and from 0 to z or x. &lt;p align=&quot;justify&quot;&gt;A &lt;b&gt;negedge&lt;/b&gt; is any transition from 1, x, and z to 0, and from 1 to z or x. &lt;p align=&quot;justify&quot;&gt;The &lt;b&gt;wait&lt;/b&gt; statement (Example 4) will suspend execution of all statements until the expression becomes true.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Examples&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;#10; &lt;p align=&quot;justify&quot;&gt;The next statement will be executed after 10 time units. &lt;p align=&quot;justify&quot;&gt;#10 a = 5; &lt;p align=&quot;justify&quot;&gt;Assignment to a variable will be delayed by 10 time units. &lt;p align=&quot;justify&quot;&gt;#(1:2:3); &lt;p align=&quot;justify&quot;&gt;Delay control with min:typ:max delay value. &lt;p align=&quot;justify&quot;&gt;#(5:3:7) a = 5; &lt;p align=&quot;justify&quot;&gt;Assignment to a variable delayed by min:typ:max delay value. &lt;p align=&quot;justify&quot;&gt;Example 2 &lt;p align=&quot;justify&quot;&gt;@ready a = a + 1; &lt;p align=&quot;justify&quot;&gt;The &#39;a&#39; variable will be incremented by 1 when a change occurs on the &#39;ready&#39; variable. &lt;p align=&quot;justify&quot;&gt;@(posedge clk) q = d; &lt;p align=&quot;justify&quot;&gt;The &#39;d&#39; variable will be assigned to &#39;q&#39; on the positive edge of clk. &lt;p align=&quot;justify&quot;&gt;@(a &lt;b&gt;or&lt;/b&gt; b &lt;b&gt;or&lt;/b&gt; c &lt;b&gt;or&lt;/b&gt; d)&lt;br&gt;y = (a | b) &amp;amp; (~c ^ d);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;A new value will be assigned to the &#39;y&#39; variable when a change occurs on any of the variables a, b, c, or d. &lt;p align=&quot;justify&quot;&gt;Example 3 &lt;p align=&quot;justify&quot;&gt;event e; &lt;p align=&quot;justify&quot;&gt;Event declaration. &lt;p align=&quot;justify&quot;&gt;initial begin&lt;br&gt;&amp;nbsp; #10;&lt;br&gt;&lt;b&gt;&amp;nbsp; -&amp;gt;&lt;/b&gt; e;&lt;br&gt;end&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Example of event triggering. &lt;p align=&quot;justify&quot;&gt;always @e d = 0; &lt;p align=&quot;justify&quot;&gt;Example of waiting for an event. &lt;p align=&quot;justify&quot;&gt;Example 4 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;wait&lt;/b&gt; (a);&lt;br&gt;i = i + 1;&lt;br&gt;&lt;b&gt;wait&lt;/b&gt; (!a);&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;This sequence of statements will wait until &#39;a&#39; becomes 1, and then the next statement will be executed. Next, execution will be suspended until &#39;a&#39; becomes 0.&lt;br&gt; &lt;h4 align=&quot;justify&quot;&gt;Important Notes&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;· The delay controls are useful in specifying patterns for testbenches. &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/8418070703908998306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-procedural-timing-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8418070703908998306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/8418070703908998306'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-procedural-timing-control.html' title='Procedural Timing Control'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9056833869813916856.post-7572019067834853481</id><published>2012-09-09T01:25:00.000-07:00</published><updated>2012-09-27T18:56:51.227-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Procedural Continuous Assignments"/><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="VLSI"/><title type='text'>Procedural Continuous Assignments</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Formal Definition&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Procedural continuous assignments provide a means to continuously drive a value into a register or a net. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Simplified Syntax&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;assign&lt;/b&gt; register_assignment ;&lt;br&gt;&lt;b&gt;deassign&lt;/b&gt;&lt;b&gt; &lt;/b&gt;register_left_value&lt;b&gt; &lt;/b&gt;&lt;b&gt;;&lt;/b&gt;&lt;br&gt;&lt;b&gt;force&lt;/b&gt;&lt;b&gt; &lt;/b&gt;register_assignment | net_assignment ;&lt;br&gt;&lt;b&gt;release&lt;/b&gt;&lt;b&gt; &lt;/b&gt;register_left_value | net_left_value ;&lt;br&gt;register_left_value - left hand-side operand ;&lt;br&gt;net_left_value - left hand-side operand ;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Description&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;In the &lt;b&gt;assign&lt;/b&gt; statement, the left hand-side operand can be a register or a concatenation of registers in contrast to continuous assignments where the left hand-side operands are nets. However, the memory word, bit-select or part-select cannot be used on the left hand-side. The priority of procedural continuous assignment is higher than that of the procedural assignments. The &lt;b&gt;deassign&lt;/b&gt; keyword informs the end of the driving of the corresponding register. After a deassign, register values remain the same until driven by another procedural or procedural continuous assignment. If the &lt;b&gt;assign&lt;/b&gt; keyword is used a second time for the same register, the first register will be deassigned and a new procedural continuous assignment statement takes place. &lt;p align=&quot;justify&quot;&gt;The keywords &lt;b&gt;force&lt;/b&gt; and &lt;b&gt;release&lt;/b&gt; have the same effect as &lt;b&gt;assign&lt;/b&gt; and &lt;b&gt;deassign&lt;/b&gt;; however the left hand-side operand should be a net or a bit-select or a part-select of vector net or concatenation of both. It cannot be part-select or bit-select of a vector register or a memory word. &lt;p align=&quot;justify&quot;&gt;An assign declared as a &lt;b&gt;force&lt;/b&gt; overrides all procedural assignments to the register until the &lt;b&gt;release&lt;/b&gt; statement is executed. In the same way, if a net is driven by a procedural continuous assignment all previous assignments are overridden until the release statement is executed. In the register case, the value will be maintained to the next procedural continuous assignment. &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Examples&lt;/b&gt; &lt;p align=&quot;justify&quot;&gt;Example 1 &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;module&lt;/b&gt; example1(clk, d, reset, set, q) ;&lt;br&gt;&lt;b&gt;input&lt;/b&gt;&lt;b&gt; &lt;/b&gt;clk, d, reset, set;&lt;br&gt;&lt;b&gt;output&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;reg&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;&amp;nbsp; always @&lt;/b&gt;(&lt;b&gt;posedge&lt;/b&gt; clk) q = d;&lt;br&gt;&lt;b&gt;&amp;nbsp; always @&lt;/b&gt;(reset or set) &lt;b&gt;begin&lt;/b&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; if&lt;/b&gt;&lt;b&gt; &lt;/b&gt;(reset) &lt;b&gt;assign&lt;/b&gt; q = 1&#39;b0;&lt;br&gt;&lt;b&gt;&amp;nbsp; else if&lt;/b&gt; (set) &lt;b&gt;assign&lt;/b&gt; q= 1&#39;b1;&lt;br&gt;&lt;b&gt;&amp;nbsp; else deassign&lt;/b&gt; q;&lt;br&gt;&lt;b&gt;&amp;nbsp; end&lt;/b&gt;&lt;br&gt;&lt;b&gt;endmodule&lt;/b&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;Important Notes&lt;/b&gt; &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;The left-hand operand of the force and release statements can be a net data type variable.&lt;/div&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Assign and deassign can only be applied to reg type variables.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; align=&quot;justify&quot; trbidi=&quot;on&quot;&gt;&lt;br&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://verilogtutorial.blogspot.com/feeds/7572019067834853481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-procedural-continuous-assignments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7572019067834853481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9056833869813916856/posts/default/7572019067834853481'/><link rel='alternate' type='text/html' href='http://verilogtutorial.blogspot.com/2012/09/verilog-procedural-continuous-assignments.html' title='Procedural Continuous Assignments'/><author><name>VLSI Encyclopedia</name><uri>http://www.blogger.com/profile/16627288764130002695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI1FUm9yP8YZ5WddN7p8m3fy3JHaFfhOfumflqlWsYU8S9fju7DmRsoh8sLEFytgjDd8-fk1j5KQJMpclLyufYNT6DAh-RKSMTs5m-VG_s5q_tOJm0XgV_ySOewvQ9Ugs/s220/VLSI_Encyclopedia.jpg'/></author><thr:total>0</thr:total></entry></feed>