| 
  Part 2
  
Technical Topics
: 
Future of Verilog 
 Programming
Language Interface. 
 Connecting
other scripting languages to Verilog  
 VCD (Value
Change Data)   
 Different
types of Verilog Simulators
 Finite
State Machines in Verilog
 FSM
Design and Analysis Tools 
 Verilog Model
Examples
 
Synthesis 
 
Technical Questions
  
Future
of Verilog
 Verilog-2000
 The final draft of Verilog-2000 is completed
on March 1st 2000. Once IEEE approval is done it will be a new Verilog
HDL standard called IEEE Std. 1364-2000. This new standard contains 30
new enhancements over earlier standard for higher level, abstract syatem
level modeling. It adds powerful capabilities Intellectual Property modeling,
greater deep submicron accuracy and scalable, re-usable modeling.
 Analog Verilog
 Through OVI's efforts and actions, Verilog
is now IEEE Standard 1364 and is available from many vendors. Now they
are trying to push Verilog further by introducing Verilog AMS (Analog and
Mixed Signal). 
 The intent of the Verilog-AMS standard
is to define extensions to the Verilog standard (OVI 2.0 / IEEE 1364) for
describing analog circuit and system behavior combined with digital circuit
and system behavior, with maximum forward and backward compatibility. 
 Visit http://www.eda.org/verilog-ams/
to get more details.
 Interesting examples of Verilog-AMS are
here.
 Resistor
 Capacitor
 Sine
Wave Generator
 Diode
 D
Flip flop
 Bouncing
Ball
 OVI is also trying on other fronts to create
IEEE standards. IEEE 1497 will be created to describe SDF (Standard Delay
Format) specifications. Proposed draft can be seen at
 http://www.eda.org/sdf/sdf_3.0.pdf
 Programming
Language Interface.
 PLI stands for Programming Language Interface.
The PLI consists of an interface mechanism, a set of routines to interact
with the simulation environment, and a set of routines to access the Verilog
internal data structures. These allow user supplied C code to interact
dynamically with the simulation and data structures. 
 There are two good books available on PLI.
  
 
  | 
Principles of
Verilog PLI 
 by Swapnajit Mittra 
 Price: $112.00
 Hardcover (March 1999) 
 Kluwer Academic Pub; 
 ISBN: 0792384776 . 
 (More
Information)
He also maintains "Veri Page" dedicated
to PLI. He has links to  many Verilog and PLI related sites on this
page. He has kept his own PLI (1 and  2) examples. 
 http://www.angelfire.com/ca/verilog/  | 
 
  | 
The Verilog Pli
Handbook : A User's Guide and Comprehensive Reference on the Verilog
Programming Language Interface 
 by Stuart Sutherland 
 Price: $148.00
 Hardcover (March 1999) 
 Kluwer Academic Publishers; 
 ISBN: 079238489X 
 (More
Information) | 
 
 
 JavaPLI : http://www.javapli.com/jpli/index.html 
JavaPLI can extend the reach of Verilog models into Java realm. You can do these
and more interesting things with JavaPLI.
- Verilog model combined with a GUI for providing stimuli
and observing the model's behavior in a graphical form. 
- A Verilog model that reads and writes complex data
via XML. The data might be stored on file, or transmitted over the net or the
Internet (using Java's XML package and possibly the java.net package). and many
more.
 
Christian B. Spear has donated
his PLI routines to Verilog community. The following guide describes how
you can read files in a Verilog model using a set  of system functions
which are based on the C stdio package. With these system  functions
you can perform file input directly in Verilog models without having to 
learn C or the PLI. Visit his own PLI web site 
 http://www.chris.spear.net/pli/index.htm
 David Roberts,
of Cadence Design Systems, has provided a great example using sockets to
communicate between a PLI application and an independently running C program. 
David has provided this example with no restrictions on usage, copying
or distribution.
 
pli_socket_example_pc.zip          
Using sockets example, compressed using WinZip (27 KB)
 
pli_socket_example_unix.tar.gz   
Using sockets example, compressed using compressed using GZIP (18 KB)
 
pli_socket_example_unix.tar        
Using sockets example, uncompressed (100 KB)
 
    
      ScriptSim :
    Bring the power of Perl/Tk and Python/Tk to your Verilog?simulations. 
     
    ScriptSim is a tool for rapid development of simulation models. It uses a graphical user interface, creating professional-looking windows for presentation of simulation results in text or graphical formats. It is available as open-source software. 
     
    Requirements: Unix/Linux/Solaris system with gcc compiler, Verilog simulator
    with PLI interface 
    
Verilog simulator
dumps the simulation information for waveform viewing in VCD Format (Value
Change Data). It's specification is part of IEEE Std 1364. Michael J. Smith's
site has a beta pages of Verilog LRM. Following page lists specification for VCD
format. 
http://www-ee.eng.hawaii.edu/~msmith/ASICs/HTML/Verilog/LRM/HTML/15/ch15.2.htm 
   
Different
types of Verilog Simulators
There are mainly two types of simulators
available. 
 
Event-based Simulator: 
This Digital Logic Simulation method sacrifices
performance for rich functionality: every active signal is calculated for
every device it propagates through during a clock cycle. Full Event-based
simulators support 4-28 states; simulation of Behavioral HDL, RTL HDL,
gate, and transistor representations; full timing calculations for all
devices; and the full HDL standard. Event-based simulators are like a Swiss
Army knife with many different features but none are particularly fast. 
 Event based simulators are further categorized
in 2 types. 
 Compiled-Code Simulators: 
 This technique takes the input definition
(HDL) of the design and spends  time compiling it into a new data
structure in order to enable much faster calculations during run-time.
You sacrifice compile time to be able to run large numbers of tests faster.
it is used in some high end, Event-based simulators. 
 e.g. Synopsys Inc.'s VCS Simulator converts
verilog files into C code which then be compiled and run, just like any
other executable file. It is 10 to 50 times faster than any other interpretive
simulator. 
 see http://www.synopsys.com/products/simulation/vcs_ds.html
 Cadence's Native Compiled Verilog generates
direct machine language instructions from verilog files. 
 see http://www.cadence.com/datasheets/affirma_nc_verilog_sim.html 
  
 Interpreted Code Simulators: 
 This method of simulation allows for rapid
change of the source HDL of  the design and restart of the simulation
since there is little or no compilation involved after every design change.
This is good for  interaction but leads to poor run times of large
tests compared to Compiled Code Techniques. 
 e.g. Cadence Design Systems Verilog - XL. 
 see http://www.cadence.com/technology/pcb/products/prev_ds/verilog-xl-family.html
  
 Cycle Based Simulator: 
 This is a Digital Logic Simulation method
that eliminates unnecessary calculations to achieve huge performance gains
in verifying Boolean logic: 
 1.) Results are only examined at the end
of every clock cycle; and 
 2.) The digital logic is the only part
of the design simulated (no timing calculations). By limiting the calculations,
Cycle based Simulators can provide huge increases  in performance
over conventional Event-based simulators. 
 Cycle based simulators are more like a
high speed electric carving knife in comparison because they focus on a
subset of the biggest problem: logic verification. 
 Cycle based simulators are almost invariably
used along with Static Timing verifier to compensate for the lost timing
information coverage. 
 for example 
 Avanti's Polaris cycle based simulator 
 http://www.avanticorp.com/product/ds/polaris.html
 In following table differences between
Event based and Cycle based simulation are summarized. 
  
  
 
| Event based Simulation | 
Cycle Based Simulation | 
 
| Evaluates inputs looking for state change | 
Evaluate entire design every clock cycle  | 
 
| Schedule events in time | 
No event scheduling  | 
 
| Calculate time delay | 
No delay calculations or timing checks  | 
 
| Store state values and time information | 
No such storage. Very fast, very efficient 
memory usage.  | 
 
| Identify timing violations | 
Does not identify timing violations | 
 
 
 
  
 Where two simulations
are appropriate 
 
 
 Comparison between
Event Based and Cycle based Simulation 
 Finite
State Machines in Verilog
 State machine design is becoming more complex
due to increasing time   constraints and verification issues.
Following papers provide good insight into design and optimization. 
 1] State Machine Design Techniques for
Verilog and VHDL : by Steve Golson,  Trilobyte Systems 
 PDF
version of article
 Text Version : http://www.synopsys.com/news/pubs/JHLD/JHLD-099401
 FSM
Design and Analysis Tools
 FSMDesigner
 It is a Java based Finite State Machine
(FSM) editor, which allows the hardware designer to specify complex control
circuits in an easy and comfortable way. The graphical FSM is converted
into a proprietary state/flow table format. It can be translated into efficient
and synthesizable Verilog HDL. 
 More Information : http://mufasa.informatik.uni-mannheim.de/lsra/projects/fsmdes/
  
 Verilog
Model Examples
 The Verilog beginners need examples of 
simple building blocks to learn coding techniques. This section tries to
create a database of such designs. If you have any such design please mail
to Rajesh Bawankule (rajesh52@hotmail.com)
  
 
| D
Type Flip-flop:
 A sample code is shown below. A header
indicates a minimum set of information needed to identify and maintain
the code.   | 
  | 
 
 
////////////////////////////////////////////////////////////////////
 // 
 //  Copyleft (C) 1998 by Rajesh Bawankule
 //  This model is available for free
distribution
 // 
 //  file name     
: dff.v
 //  last modified  : 07/23/98
 //  function      
: d flip flop
 //
 ////////////////////////////////////////////////////////////////////
module dff (data, clock, q);
     // port list
     input   data,
clock;
     output  q;
     // reg / wire declaration
for outputs / inouts
     reg    
q;
     // logic begins here
     always @(posedge clock) 
        
q <= data;
 endmodule
  
  
  
 
| D
Type Flip-flop with asynchronous reset:
 Example of D type Flip flop with asynchronous
reset.  | 
  | 
 
 
module dff_async (data, clock, reset, q);
     // port list
     input   data,
clock, reset;
     output  q;
    // reg / wire declaration
for outputs / inouts
     reg    
q;
     // reg / wire declaration
for internal signals
     // logic begins here
     always @(posedge clock
or negedge reset)
        
if(reset == 1'b0)
            
q <= 1'b0;
        
else 
            
q <= data;
 endmodule
  
  
  
 
| D
Type Flip-flop with Synchronous reset:
 Example of D type Flip flop with synchronous
reset.  | 
  | 
 
 
module dff_sync (data, clock, reset, q);
     // port list
     input   data,
clock, reset;
     output  q;
    // reg / wire declaration
for outputs / inouts
     reg    
q;
     // reg / wire declaration
for internal signals
     // logic begins here
     always @(posedge clock) 
        
if(reset == 1'b0)
            
q <= 1'b0;
        
else 
            
q <= data;
 endmodule
  
  
 
| D
Type Flip-flop with asynchronous reset and clock enable | 
  | 
 
 
module dff_cke (data, clock, reset, cke, q);
     // port list
     input   data,
clock, reset, cke;
     output  q;
    // reg / wire declaration
for outputs / inouts
     reg    
q;
     // logic begins here
     always @(posedge clock
or negedge reset) 
        
if (reset == 0)
            
q <= 1'b0;
        
else if (cke == 1'b1)
            
q <= data;
 endmodule
  
  
 
| 4:1
Multiplexer Using case statement | 
  | 
 
 
module mux4_1_case(Y,I0,I1,I2,I3,C0,C1);
   input I0,I1,I2,I3,C0,C1;
   output Y;
  reg   Y;
   always@(I0 or I1 or I2 or I3 or C0
or C1) begin
       case ({C1,C0}) 
          
2'b00 : Y = I0 ;
          
2'b01 : Y = I1 ;
          
2'b10 : Y = I2 ;
          
2'b11 : Y = I3 ;
       endcase
   end
 endmodule
  
  
 
4:1
Multiplexer Using if-else statements:
 This implementation gives priority encoder
structure. | 
  | 
 
 
module mux4_1_if(Y,I0,I1,I2,I3,C0,C1);
   input I0,I1,I2,I3,C0,C1;
   output Y;
   reg   Y;
   always@(I0 or I1 or I2 or I3 or C1)
begin
       if ({C1,C0}
== 2'b00) Y = I0;
       else if ({C1,C0}
== 2'b01) Y = I1;
       else if ({C1,C0}
== 2'b10) Y = I2;
       else if ({C1,C0}
== 2'b11) Y = I3;
   end
 endmodule
  
  
 4:1
Multiplexer Using assign statements :
 This implementation is given to show flexibility
of Verilog language. This type of coding is generally not preferred for
mux implementation as it is difficult to debug. 
 module mux4_1_assign(Y,I0,I1,I2,I3,C0,C1); 
   input I0,I1,I2,I3,C0,C1; 
   output Y; 
   wire a_0, a_1, a_2, a_3;        
// intermediate signals 
   wire c0_n, c1_n; 
   wire Y; 
   assign c0_n = ~C0; 
   assign c1_n = ~C1; 
   assign a_0 = I0 & c1_n & c0_n; 
   assign a_1 = I1 & c1_n & C0; 
   assign a_2 = I2 & C1 & c0_n; 
   assign a_3 = I3 & C1 & C0; 
   assign Y = a_0 | a_1 | a_2 | a_3; 
 endmodule 
 Behavioral
FIFO model: 
 This is a behavioral fifo model, which
enables simultaneous  shift-in and shift-out, posedge triggered and
asynch reset, 
 Assumptions: 
 - no shift-in is made on a full fifo 
 - no shift-out is made on an empty fifo 
 This model is contributed by Lars Rzymianowicz
(lr@mufasa.informatik.uni-mannheim.de) 
 module fifo( 
 dout,  // head of fifo 
 full,  // no more space, no shift-in allowed 
 half,  // fifo is >=50% full 
 quarter, // fifo is >=25% full 
 empty,  // head of fifo is invalid data 
 clk, 
 res_, 
 din,        // data to store 
 shiftin, // store data from din in fifo 
 shiftout); // i've read the head of fifo, show me next 
    parameter WIDTH = 32;   // bit width 
    parameter DEPTH = 16;   // depth of fifo 
    output [(WIDTH-1):0] dout; 
    output              
full, half, quarter, empty; 
    reg                 
full, half, quarter, empty; 
    input               
clk, res_, shiftin, shiftout; 
    input [(WIDTH-1):0]  din;
    reg [(WIDTH-1):0]    entry [0:(DEPTH-1)]; 
    // the register stages 
    integer             
wp; 
    // write pointer (points to first free slot) 
    integer             
i;    // loop count 
  
    // first stage of fifo is output 
    assign dout = entry[0]; 
  
    always @(posedge clk or negedge res_)   //
trigger new evaluation
    begin 
       if (res_ == 0)   // it's
a reset 
       begin 
          wp      
= 0;     // the initial values 
          full   
<= 1'b0; 
          half   
<= 1'b0; 
          quarter <=
1'b0; 
          empty  
<= 1'b1; 
       end 
       else   // it's a posedge
of clk 
       begin 
          case ({shiftin,
shiftout}) 
            
2'b00: ; // nothing to do 
            
2'b01:   // shift-out(assumes: at least 1 valid value in fifo) 
               
begin 
                  
for (i=1; i<wp; i=i+1)   // shift all valid entries 
                     
entry[i-1] <= entry[i]; 
                  
wp       = wp-1; 
                  
full    <= 1'b0; 
                  
half    <= (wp >= (DEPTH/2)) ? 1'b1 : 1'b0; 
                  
quarter <= (wp >= (DEPTH/4)) ? 1'b1 : 1'b0; 
                  
empty   <= (wp == 0) ? 1'b1 : 1'b0; 
               
end 
            
2'b10:   // shift-in (assumes: at least 1 entry free) 
                
begin 
                   
entry[wp] <= din; 
                   
wp       = wp+1; 
                   
full    <= (wp == DEPTH) ? 1'b1 : 1'b0; 
                   
half    <= (wp >= (DEPTH/2)) ? 1'b1 : 1'b0; 
                   
quarter <= (wp >= (DEPTH/4)) ? 1'b1 : 1'b0; 
                   
empty   <= 1'b0; 
                
end 
            
2'b11:   //simultaneous shift-in and -out 
               
begin // (at least 1 valid entry) 
                  
for (i=1; i<wp; i=i+1) 
                     
entry[i-1] <= entry[i]; 
                  
entry[wp-1] <= din; 
               
end 
    endcase // case ({shiftin, shiftout}) 
    end // else: !if(res_ == 0) 
    end // always @ (posedge clk or negedge res_) 
 endmodule
 Examples
from "The Verilog Hardware Description Language"
 by D.E. Thomas and P.R. Moorby 
 Micron memory
simulation models with testbenches.
 Micron memory models are available for
EDO DRAM, SDRAM, SRAM, SGRAM, SLDRAM with various flavors and testbenches.
 
http://www.micron.com/products/ 
 
Synthesis
 Synthesis: It is a process to map and
optimizing higher level HDL description to technology cells (gates, flip
flops etc.)
 Synthesis
Flow Diagram:
 
  
HDL Description: This is
description of design in Verilog. One has to use subset of constructs as
synthesis tools does not support all of them.
 Technology Library: This
file contains functional description and other information related to area
and speed for all the cells of particular technology.
 Here "technology" means information about
particular process for particular vendor. For example Company X, Standard
Cell, 0.18 micron, Y Process, Z Type.
 Constraints: This optional
file contains information about physical expectations from design. For
example speed and area.
 Netlist: A netlist is a text
file description of a physical connection of components.
 Reports: This optional output
file contains physical performance of design in terms of speed and area.
 Schematic: Some tools provide
the facility to view netlist in terms of schematics for better understanding
of design and to match the results with the expectations.
 Simple example:
 Following trivial example explains the
Synthesis process. In this example only always procedural statement is
used.
 module test (out, in1, in2); // behavioral description
   input in1, in2;
   output out;
   reg out;
   reg temp;                
// temporary register
   always@(in1 or in2) begin
     temp = ~in2;
     out = ~in1 ^ temp;  // I am trying to have
exor with inverted 
   end                  
// inputs
 endmodule
 ---------------
 after synthesis one gets following "netlist"
in verilog. Note that XOR2 is module picked up from technology library.
It will be different for different libraries.
 ---------------
 module add ( out , in1 , in2 );  // netlist
     output out ;
     input in1 ;
     input in2 ;
     XOR2   instance_name (.Y (out ),.A
(in1 ),.B (in2 ) );
 endmodule
 --------------
 Note that synthesis tool optimized the
logic. Netlist can be obtained in other formats like  .EDIF, .vhdl.
Here is an example of .xnf format ( Xilinx netlist format)
 --------------
 LCANET, 5
 USER, LIBRARY_NAME, temp
 USER, CELL_NAME, test
 USER, VIEW_NAME, INTERFACE
 SIG, out, S
 SIG, in1, S
 SIG, in2, S
 SYM, instance_name, XOR2
 PIN, A, I, in1,
 PIN, B, I, in2,
 PIN, Y, O, out, 1.000000
 END
 EOF
 ---------
 You can get detailed information on netlist
formats in respective synthesis tool manuals / guides and SDF manual.
 Now try the same example which uses always,
assign and simple gate level description. You will find that results are
identical. Synthesis tool optimizes the description and produces the minimal
hardware required.
 module xor_example (in1, in2, out);
     input  in1, in2;
     output out;
     reg    out;
     reg    temp1;
     wire   temp2;
     always @(in1 or in2) begin
         temp1 = in1 &
~in2;
     end
     assign temp2 = ~in1 & in2;
     or my_or (out, temp1, temp2);
 endmodule
  
  
 Unsupported
Verilog Language Constructs
 Synthesis tools are not so intelligent.
They try to infer hardware from HDL description. Most synthesis tools does
not support the following Verilog constructs:
 ?Unsupported definitions and declarations
 - primitive definition
 - time declaration
 - event declaration
 - triand, trior, tri1, tri0, andtriregnet
types
 - Ranges and arrays for integers
 ?Unsupported statements
 - defparam statement
 - initial statement
 - repeat statement
 - delay control
 - event control
 - wait statement
 - fork-join statements
 - deassign statement
 - force statement
 - release statement
 - Assignment statement with a variable
used as a bit-select on the left side of the equal sign
 ?Unsupported operators
 - Case equality and inequality operators
(=== and !==)
 - Division and modulus operators for variables
 ?Unsupported gate-level constructs
 - nmos, pmos, cmos, rnmos, rpmos, rcmos, pullup, pulldown,
 tranif0, tranif1, rtran, rtrainf0, andrtrainf1gate
types
 ?Unsupported miscellaneous constructs
 - Hierarchical names within a module
 Synthesis
Tools
 Currently there is no single free
synthesis tool available. Following is a list of commercially available
sythesis tools.
 
- 
Synopsys,
Inc. 
 
- 
Design Compiler and Behavioral Compiler 
 
- 
Synplicity,
Inc. 
 
- 
Synplify 
 
- 
Exemplar
Logic 
 
- 
Leonardo Spectrum 
 
- 
Mentor
Graphics Corp. 
 
- 
AutoLogic and PLDSynthesis 
 
- 
Avanti
 
- 
Asyn 
 
- 
Cadence Design
Systems Inc. 
 
- 
Ambit 
 
- Magma
  Design Automation
 
-          
  Blast Create
 
 
 
Synthesis
Standards Working group working on Synthesis
 There is Verilog Synthesis Subset Working
Group (IEEE PAR 1364.1)  working on formalizing Verilog subset used
in Synthesis.
 http://www.eda.org/vlog-synth/
IEEE P1364.1/D1.4 Draft Standard for Verilog
Register Transfer Level Synthesis is available at
 http://www.eda.org/vlog-synth/vlogrtl.pdf
 "RTL Coding Styles That Yield Simulation
and Synthesis Mismatches"  by Don Mills is available in pdf format
at http://www.eda.org/vlog-synth/Mills_Final.pdf
  
 Good books
on Synthesis:
  
  
 
  | 
Logic Synthesis
Using Synopsis 
 by Pran Kurup, Taher Abbasi 
 Price: $120.00
 Hardcover 2nd edition (June 1997) 
 Kluwer Academic Pub;
 ISBN: 079239786X  | 
 
  | 
Behavioral Synthesis
: Digital System Design Using the Synopsis Behavioral Compiler
 by David W. Knapp 
 Price: $68.00   Hardcover -
231 pages Bk&Disk edition (June 1996) 
 Prentice Hall; 
 ISBN: 0135692520  | 
 
  | 
Advanced Asic
Chip Synthesis : Using Synopsys Design Compiler and Primetime
 by Himanshu Bhatnagar 
 Hardcover (June 1999) 
 Kluwer Academic Pub; 
 Price: $115.00
 ISBN: 0792385373  | 
 
 | 
 | 
 
 
Usenet
group related to synthesis
  
 
- 
John Cooley maintains moderated email based
ESNUG (Synopsys User Group) email list. Past and present email archives
can be found at http://www.DeepChip.com/ 
 
 
- 
Usenet group comp.cad.synthesis
is created to discuss synthesis related questions. One get postings through
http://www.deja.com/
and other sites. 
 
 
Technical
Questions
 This section lists questions asked in
comp.lang.verilog usenet forum and their answers. This section is kept
on
separate page here.
 |