Verilog HDL - Text Book
Verilog HDL - Text Book
SunSoft Press
1996
1
3
11
27
47
61
85
115
157
169
191
193
213
229
249
275
319
321
327
343
345
363
367
[j
LJ
LJ
[j
[j
[j
[j
[J
[J
Basic Concepts
Lexical conventions, data types, system tasks, compiler directives.
1. Technically, the term Computer-Aided Design (CAD) tools refers to back-end tools that perform functions related
to place and route, and layout of the chip. The term Computer-Aided Engineering (CAE) tools refers to tools that
are used for front-end processes such HDL simulation, logic synthesis and timing analysis. However, designers
use the term CAD and CAE interchangeably. For the sake of simplicity, in this book, we will refer to all design
tools as CAD tools.
continue until they had built the top-level block. Logic simulators came into
existence to verify the functionality of these circuits before they were fabricated
on chip.
As designs got larger and more complex, logic simulation assumed an important
role in the design process. Designers could iron out functional bugs in the
architecture before the chip was designed further.
Behavioral Description
c:
Gate-Level Netlist
Figure 1-1
The design flow shown in Figure 1-1 is typically used by designers who use
HDLs. In any design, specifications are written first. Specifications describe
abstractly the functionality, interface, and overall architecture of the digital circuit
to be designed. At this point, the architects do not need to think about how they
will implement this circuit. A behavioral description is then created to analyze the
design in terms of functionality, performance, compliance to standards, and other
high-level issues. Behavioral descriptions can be written with HDLs.
The behavioral description is manually converted to an RTL description in an
HDL. The designer has to describe the data flow that will implement the desired
digital circuit. From this point onward, the design process is done with the
assistance of Computer-Aided Design (CAD) tools.
Logic synthesis tools convert the RTL description to a gate-level netlist. A gatelevel netlist is a description of the circuit in terms of gates and connections
between them. The gate-level netlist is input to an Automatic Place and Route
tool, which creates a layout. The layout is verified and then fabricated on chip.
Thus, most digital design activity is concentrated on manually optimizing the
RTL description of the circuit. After the RTL description is frozen, CAD tools are
available to assist the designer in further processes. Designing at RTL level has
shrunk design cycle times from years to a few months. It is also possible to do
many design iterations in a short period of time.
Behavioral synthesis tools have begun to emerge recently. These tools can create
RTL descriptions from a behavioral or algorithmic description of the circuit. As
these tools mature, digital circuit design will become similar to high-level
computer programming. Designers will simply implement the algorithm in an
HDL at a very abstract level. CAD tools will help the designer convert the
behavioral description to a final IC chip.
It is important to note that although CAD tools are available to automate the
processes and cut design cycle times, the designer is still the person who controls
how the tool will perform. CAD tools are also susceptible to the "GIGO: Garbage
In Garbage Out" phenomenon. If used improperly, CAD tools will lead to
inefficient designs. Thus, the designer still needs to understand the nuances of
design methodologies, using CAD tools to obtain an optimized design.
All fabrication vendors provide Verilog HDL libraries for postlogic synthesis
simulation. Thus, designing a chip in Verilog HDL allows the widest choice
of vendors.
The Programming Language Interface (PLI) is a powerful feature that allows
the user to write custom C code to interact with the internal data structures
of Verilog. Designers can customize a Verilog HDL simulator to their needs
with the PLI.
chip, and a system bus. The CPU designers would build the next-generation CPU
themselves at an RTL level, but they would use behavioral models for the
graphics chip and the I/O chip and would buy a vendor-supplied model for the
system bus. Thus, the system-level simulation for the CPU could be up and
running very quickly and long before the RTL descriptions for the graphics chip
and the I/O chip are completed.
10
Hierarchical Modeling
Concepts
Before we discuss the details of the Verilog language, we must first
understand basic hierarchical modeling concepts in digital design. The
designer must use a "good" design methodology to do efficient Verilog HDLbased design. In this chapter, we discuss typical design methodologies and
illustrate how these concepts are translated to Verilog. A digital simulation is
made up of various components. We talk about the components and their
interconnections.
Learning Objectives
Understand top-down and bottom-up design methodologies for digital
design.
Explain differences between modules and module instances i*n Verilog.
Describe four levels of abstraction-behavioral,
switch level-to represent the same module.
=2
Figure 2-1
In a bottom-up design methodology, we first identify the building blocks that are
available to us. We build bigger cells, using these building blocks. These cells are
then used for higher-level blocks until we build the top-level block in the design.
Figure 2-2 shows the bottom-up design process.
Figure 2-2
12
The flow meets at an intermediate point where the switch-level circuit designers
have created a library of leaf cells by using switches, and the logic level designers
have designed from top-down until all modules are defined in terms of leaf cells.
To illustrate these hierarchical modeling concepts, let us consider the design of a
negative edge-triggered 4-bit ripple carry counter described in Section 2.2, 4-bit
qO
ql
r--- 1------
clock
I
I
I
I
I
I
reset
-- - - - --
r-
..,
d
q q
q r--l...c
q ~~
f-L-c
~ T_FF
T_FF
~ T_FF
~ T_FF
tff3
tffO
tffl
tff2
I
L
Figure 2-3
q3
q2
____ _
_ _ ..J
The ripple carry counter shown in Figure 2-3 is made up of negative edgetriggered toggle flip-flops (TJF). Each of the TJFs can be made up from
negative edge-triggered D-flipflops CD_FF) and inverters (assuming q_bar output
is not available on the D_FF), as shown in Figure 2-4.
13
reset
'In
'In+l
r---
-,
cloG:l-....---a
reset
Figure 2-4
T-flipflop
Thus, the ripple carry counter is built in a hierarchical fashion by using building
blocks. The diagram for the design hierarchy is shown in Figure 2-5.
TFF
(tIro)
TFF
(tIm
Inverter
gate
Figure 2-5
Inverter
gate
T FF
TFF
(tff2)
(tff3)
Inverter
gate
Inverter
gate
Design Hierarchy
14
bigger blocks; e.g., we could build DJF from and and or gates, or we could
build a custom D_FF from transistors. Thus, the bottom-up flow meets the topdown flow at the level of the D_FF.
2.3 Modules
We now relate these hierarchical modeling concepts to Verilog. Verilog provides
the concept of a module. A module is the basic building block in Verilog. A
module can be an element or a collection of lower-level design blocks. Typically,
elements are grouped into modules to provide common functionality that is used
at many places in the design. A module provides the necessary functionality to
the higher-level block through its port interface (inputs and outputs), but hides
the internal implementation. This allows the designer to modify module internals
without affecting the rest of the design.
In Figure 2-5, ripple carry counter, T_FF, D_FF are examples of modules. In Verilog,
a module is declared by the keyword module. A corresponding keyword
endmodule must appear at the end of the module definition. Each module must
have a module_name, which is the identifier for the module, and a
module_terminaClist, which describes the input and output terminals of the
module.
module <module_name> module_terminal_list;
<module internals>
endmodule
<functionality of T-flipflop>
endmodule
15
16
2.4 Instances
A module provides a template from which you can create actual objects. When a
module is invoked, Verilog creates a unique object from the template. Each object
has its own name, variables, parameters and I/O interface. The process of
creating objects from a module template is called instantiation, and the objects are
called instances. In Example 2-1, the top-level block creates four instances from the
T-flipflop (TJF) template. Each TJF instantiates a DJF and an inverter gate.
Each instance must be given a unique name. Note that II is used to denote
single-line comments.
Example 2-1
Module Instantiation
IIFour instances of the module T_FF are created. Each has a unique
Ilname.Each instance is passed a set of signals. Notice, that
Ileach instance is a copy of the module T_FF.
T_FF tffO(q[O] ,clk, reset);
T_FF tffl(q[l],q[O], reset);
T_FF tff2(q[2] ,q[l], reset);
T_FF tff3(q[3] ,q[2], reset);
endmodule
17
Example 2-1
II
II
II
endmodule
18
(Stimulus block)
elk
reset
(Design Block)
Ripple Carry
Counter
q
Figure 2-6
The second style of applying stimulus is to instantiate both the stimulus and
design blocks in a top-level dummy module. The stimulus block interacts with
the design block only through the interface. This style of applying stimulus is
shown in Figure 2-7. The stimulus module drives the signals d_elk and dJeset,
which are connected to the signals elk and reset in the design block. It also checks
and displays signal c_q, which is connected to the signal q in the design block.
The function of top-level block is simply to instantiate the design and stimulus
blocks.
19
Top-Level Block
d_elk
Stimulus
Block
d_reset
c_q
Figure 2-7
---
-....
-
elk
reset Design Blod<
Ripple Carry
Counter
q
2.6 Example
To illustrate the concepts discussed in the previous sections, let us build the
complete simulation of a ripple carry counter. We will define the design block and
the stimulus block. We will apply stimulus to the design block and monitor the
outputs. As we develop the Verilog models, you do not need to understand the
exact syntax of each construct at this stage. At this point, you should simply try to
understand the design process. We discuss the syntax in much greater detail in
the later chapters.
2.6.1
Design Block
20
2=
Example 2-3
T_FF
T_FF
T_FF
T_FF
tffO(q[O],clk,
tffl(q[l],q[O],
tff2(q[2] ,q[l],
tff3(q[3],q[2],
reset);
reset);
reset);
reset);
endmodu.le
In the above module, four instances of the module TJF (T-flipflop) are used.
Therefore, we must now define (Example 2-4) the internals of the module T_FF,
which was shown in Figure 2-4.
Example 2-4
Flip-flop TJF
reset);
output q;
input clk, reset;
wire d;
D_FF dffO(q, d, clk, reset);
not nl(d, q); II not is a Veri log-provided primitive. case sensitive
endmodule
Since T_FF instantiates D_FF, we must now define (Example 2-5) the internals of
module D_FF. We assume asynchronous reset for the D_FF.F
Example 2-5
Flip-flop D J
21
Flip-flop D J
Example 2-5
(Continued)
All modules have been defined down to the lowest-level leaf cells in the design
methodology. The design block is now complete.
2.6.2
Stimulus Block
We must now write the stimulus block to check if the ripple carry counter design
is functioning correctly. In this case, we must control the signals elk and reset so
that the regular function of the ripple carry counter and the asynchronous reset
mechanism are both tested. We use the waveforms shown in Figure 2-8 to test the
design. Waveforms for elk, reset, and 4-bit output q are shown. The cycle time for
elk is 10 units; the reset signal stays up from time 0 to 15 and then goes up again
from time 195 to 205. Output q counts from 0 to 15.
clk
reset
Figure 2-8
22
L------~HI----
We are now ready to write the stimulus block (see Example 2-4) that will create
the above waveforms. We will use the stimulus style shown in Figure 2-6. Do not
worry about the Verilog syntax at this point. Simply concentrate on how the
design block is instantiated in the stimulus block.
Example 2-4
Stimulus Block
module stimulus;
reg elk;
reg reset;
wire[3:0] q;
II instantiate the design block
ripple_carry_counter rl(q, clk, reset);
I I Control the clk signal that drives the design block. Cycle time = 10
initial
clk = l'bO; Iiset elk to 0
always
#5 elk = -clk; Iitoggle clk every 5 time units
II Control the reset signal that drives the design block
%d",
q);
endmodule
23
Once the stimulus block is completed, we are ready to run the simulation and
verify the functional correctness of the design block. The output obtained when
stimulus and design blocks are simulated is shown in Example 2-6.
Example 2-6
Output
Output
Output
Output
Output
Output
Output
Output
Output
output
output
Output
Output
Output
Output
Output
Output
Output
Output
Output
Output
Output
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
q
= 1
= 2
= 3
= 4
= 5
= 6
= 7
= 8
= 9
= 10
= 11
=
12
= 13
= 14
= 15
= 0
= 1
= 2
=
=
=
0
1
2
2.7 Summary
In this chapter we discussed the following concepts.
Two kinds of design methodologies are used for digital design: top-down
and bottom-up. A combination of these two methodologies is used in
today's digital designs. As designs become very complex, it is important to
follow these structured approaches to manage the design process.
Modules are the basic building blocks in Verilog. Modules are used in a
design by instantiation. An instance of a module has a unique identity and
is different from other instances of the same module. Each instance has an
independent copy of the internals of the module. It is important to
understand the difference between modules and instances.
There are two distinct components in a simulation: a design block and a
stimulus block. A stimulus block is used to test the design block. The
stimulus block is usually the top-level block. There are two different styles
of applying stimulus to a design block.
The example of the ripple carry counter explains the step-by-step process of
building all the blocks required in a simulation.
This chapter is intended to give an understanding of the design process and how
Verilog fits into the design process. The details of Verilog syntax are not important
at this stage and will be dealt with in later chapters.
2.8 Exercises
1. An interconnect switch (IS) contains the following components, a shared
memory (MEM), a system controller (SC) and a data crossbar (Xbar).
a. Define the modules MEM, SC, and Xbar, using the module/endmodule
keywords. You do not need to define the internals. Assume that the
modules have no terminal lists.
b. Define the module IS, using the module/endmodule keywords.
Instantiate the modules MEM, SC, Xbar and call the instances rnernl, scl,
and xbarl, respectively. You do not need to define the internals. Assume
that the module IS has no terminals.
c. Define a stimulus block (Top), using the module/endmodule keywords.
Instantiate the design block IS and call the instance isl. This is the final
step in building the simulation environment.
2. A Cbit ripple carry adder (Ripple-Add) contains four l-bit full adders (FA).
a. Define the module FA. Do not define the internals or the terminal list.
b. Define the module Ripple-Add. Do not define the internals or the
terminal list. Instantiate four full adders of the type FA in the module
Ripple-Add and call them faO, fal, fa2, and fa3.
=2
26
Basic Concepts
In this chapter, we discuss the basic constructs and conventions in Verilog. These
conventions and constructs are used throughout the later chapters. These
conventions provide the necessary framework for Verilog HDL. Data types in
Verilog model actual data storage and switch elements in hardware very closely.
This chapter may seem dry, but understanding these concepts is a necessary
foundation for the successive chapters.
Learning Objectives
Understand lexical conventions for operators, comments, whitespace,
numbers, strings, and identifiers.
Define the logic value set and data types such as nets, registers, vectors,
numbers, simulation time, arrays, parameters, memories, and strings.
Identify useful system tasks for displaying and monitoring information, and
for stopping and finishing the simulation.
Learn basic compiler directives to define macros and include files.
3.1.1
Whitespace
Blank spaces (\b) ,tabs (\t) and newlines (\n) comprise the whitespace.
Whitespace is ignored by Verilog except when it separates tokens. Whitespace is
not ignored in strings.
3.1.2
Comments
Comments can be inserted in the code for readability and documentation. There
are two ways to write comments. A one-line comment starts with" //". Verilog
skips from that point to the end of line. A multiple-line comment starts with "/*"
and ends with "*/". Multiple-line comments cannot be nested.
a
=b
3.1.3
Operators
Operators are of three types, unary, binary, and ternary. Unary operators precede
the operand. Binary operators appear between two operands. Ternary operators
have two separate operators that separate three operands.
a
a
a
3.1.4
Number Specification
There are two types of number specification in Verilog: sized and unsized.
Sized numbers
Sized numbers are represented as <size> <base format> <number>.
I
<size> is written only in decimal and specifies the number of bits in the number.
Legal base formats are decimal ('d or 'D), hexadecimal ('h or 'H), binary ('b or 'B)
and octal ('0 or '0). The number is specified as consecutive digits from 0, 1, 2, 3,
4,5, 6, 7, 8, 9, a, b, c, d, e, f. Only a subset of these digits is legal for a particular
base. Uppercase letters are legal for number specification.
28
4'b1111
12'habc
16'd255
II
II
II
This is a 4-bit
This is a 12-bit
This is a 16-bit
binary number
hexadecimal number
decimal number.
Unsized numbers
Numbers that are specified without a <base format> specification are decimal
numbers by default. Numbers that are written without a <size> specification have
a default number of bits that is simulator- and machine-specific (must be at least
32).
XorZvalues
Verilog has two symbols for unknown and high impedance values. These values
are very important for modeling real circuits. An unknown value is denoted by
an x. A high impedance value is denoted by z.
12' h13x II This is a 12-bi t hex number; 4 least significant bits unknown
6'hx II This is a 6-bit hex number
32'bz II This is a 32-bit high impedance number
An x or z sets four bits for a number in the hexadecimal base, three bits for a
number in the octal base, and one bit for a number in the binary base. If the most
significant bit of a number is 0, x, or z, the number is automatically extended to
fill the most significant bits, respectively, with 0, x, or z. This makes it easy to
assign x or z to whole vector. If the most significant digit is 1, then it is also zero
extended.
Basic Concepts
29
Negative numbers
Negative numbers can be specified by putting a minus sign before the size for a
constant number. Size constants are always positive. It is illegal to have a minus
sign between <base format> and <number>.
-6'd3
4'd-2
II 8-bit
negative number stored as 2's complement of 3
II Illegal specification
/I?/I
3.1.5
Strings
3.1.6
Identifiers are names given to objects so that they can be referenced in the design.
Identifiers are made up of alphanumeric characters, the underscore ( _ ) and the
dollar sign ( $ ) and are case sensitive. Identifiers start with an alphabetic
character or an underscore. They cannot start with a number or a $ sign (The $
sign as the first character is reserved for system tasks, which are explained later in
the book).
reg value; II reg is a keyword; value is an identifier
input elk; II input is a keyword, elk is an identifier
3.1.7
Escaped Identifiers
Escaped identifiers begin with the backslash ( \ ) character and end with
whitespace (space, tab, or newline). All characters between backslash and
whitespace are processed literally. Any printable ASCII character can be included
in escaped identifiers. The backslash or whitespace is not considered a part of the
identifier.
I \\**my_name**
..
b-c
3.2.1
Value Set
Verilog supports four values and eight strengths to model the functionality of real
hardware. The four value levels are listed in Table 3-1.
Table 3-1
Value Levels
Value Level
Unknown value
Basic Concepts
31
In addition to logic values, strength levels are often used to resolve conflicts
between drivers of different strengths in digital circuits. Value levels 0 and 1 can
have the strength levels listed in Table 3-2.
Table 3-2 Strength Levels
Strength Level
Type
supply
Driving
strong
Driving
pull
Driving
large
Storage
weak
Driving
medium
Storage
small
Storage
highz
High Impedance
Degree
strongest
weakest
If two signals of unequal strengths are driven on a wire, the stronger signal
prevails. For example, if two signals of strength strongl and weakO contend, the
result is resolved as a strongl. If two signals of equal strengths are driven on a
wire, the result is unknown. If two signals of strength strongl and strongO
conflict, the result is an x. Strength levels are particularly useful for accurate
modeling of signal contention, MOS devices, dynamic MOS, and other low-level
devices. Only trireg nets can have storage strengths large, medium, and small.
Detailed information about strength modeling is provided in Appendix A,
Strength Modeling and Advanced Net Definitions.
3.2.2
Nets
Nets represent connections between hardware elements. Just as in real circuits, nets
have values continuously driven on them by the outputs of devices that they are
connected to. In Figure 3-1 net a is connected to the output of and gate gi. Net a
will continuously assume the value computed at the output of gate gi, which is b &
c.
Figure 3-1
32
Example of Nets
Nets are declared primarily with the keyword wire. Nets are one-bit values by
default unless they are declared explicitly as vectors. The terms wire and net are
often used interchangeably. The default value of a net is z (except the trireg net,
which defaults to x). Nets get the output value of their drivers. If a net has no
driver, it gets the value z.
wire a; II Declare net a for the above circuit
wire b,c; II Declare two wires b,c for the above circuit
wire d = l'bO; II Net d is fixed to logic value 0 at declaration.
Note that net is not a keyword but represents a class of data types such as wire,
wand, wor, tri, triand, trior, trireg, etc. The wire declaration is used most
frequently. Other net declarations are discussed in Appendix A, Strength Modeling
and Advanced Net Definitions.
3.2.3
Registers
Registers represent data storage elements. Registers retain value until another
value is placed onto them. Do not confuse the term registers in Verilog with
hardware registers built from edge-triggered flip-flops in real circuits. In Verilog,
the term register merely means a variable that can hold a value. Unlike a net, a
register does not need a driver. Verilog registers do not need a clock as hardware
registers do. Values of registers can be changed anytime in a simulation by
assigning a new value to the register.
Register data types are commonly declared by the keyword reg. The default
value for a reg data type is x. An example of how registers are used is shown
Example 3-1.
Example 3-1
Example of Register
reg reset; II declare a variable reset that can hold its value
initial II this construct will be discussed later
begin
reset = l'b1; Ilinitialize reset to 1 to reset the digital circuit.
#100 reset = l'bO; II after 100 time units reset is deasserted.
end
Basic Concepts
33
3.2.4
Vectors
Nets or reg data types can be declared as vectors (multiple bit widths). If bit
width is not specified, the default is scalar (I-bit).
wire a; II scalar net variable, default
wire [7:0] bus; II 8-bit
bus
wire [31:0] busA,busB,busC; II 3 buses of 32-bit width.
reg clock; II scalar register, default
reg [0:40] virtual_addr; //Vector register,virtual address 4lbitswide
Vectors can be declared at [high# : low#] or [low# : high#], but the left number in
the squared brackets is always the most significant bit of the vector. In the
example shown above, bit 0 is the most significant bit of vector virtuaCaddr.
For the vector declarations shown above, it is possible to address bits or parts of
vectors.
busA[7] II bit # 7 of vector busA
bus[2:0] II Three least significant bits of vector bus,
II using bus[0:2] is illegal because the significant bit should
II always be on the left of a range specification
virtual_addr[O:l] //Two most significant bits of vector virtual_addr
3.2.5
Integer, real, and time register data types are supported in Verilog.
Integer
34
integer counter;
initial
counter = -1;
II
II
Real
Real number constants and real register data types are declared with the keyword
decimal notation (e.g., 3.14) or in scientific notation
(e.g., 3e6, which is 3 x 106 ). Real numbers cannot have a range declaration, and
their default value is o. When a real value is assigned to an integer, the real
number is rounded off to the nearest integer.
real. They can be specified in
Time
Verilog simulation is done with respect to simulation time. A special time register
data type is used in Verilog to store simulation time. A time variable is declared
with the keyword time. The width for time register data types is implementation
specific but is at least 64 bits.The system function $time is invoked to get the
current simulation time.
time save_sim_time; II Define a time variable save_sim_time
initial
save_sim_time = $time; II Save the current simulation time
Basic Concepts
35
3.2.6
Arrays
Arrays are allowed in Verilog for reg, integer, time, and vector register data
types. Arrays are not allowed for real variables. Arrays are accessed by
<array_name> [<subscript>]. Multidimensional arrays are not permitted in Verilog.
integer count [0: 7] ; I I An array of 8 count variables
reg bool[31:0]; II Array of 32 one-bit boolean register variables
time chk-point[1:100]; II Array of 100 time checkpoint variables
reg [4: 0] port_id [0: 7 J ; j j Array of 8 port_ids; each port_id is 5 bi ts wide
integer matrix[4:0] [4:0J; Ilrllegaldeclaration.Multidimensional
array
count[5] II 5th element of array of count variables
chk-point[100J jj100th time check point value
port_id[3J 113rd element of port_id array. This is a 5-bit value.
3.2.7
Memories
In digital simulation, one often needs to model register files, RAMs, and ROMs.
Memories are modeled in Verilog simply as an array of registers. Each element of
the array is known as a word. Each word can be one or more bits. It is important
to differentiate between n l-bit registers and one n-bit register. A particular word
in memory is obtained by using the address as a memory array subscript.
reg mem1bit [0: 1023] ; I I Memory mem1bit with 1K 1-bit words
reg [7:0J membyte[0:1023J;IIMemory membyte with 1K8-bitwords(bytes)
membyte [511J II Fetches 1 byte word whose address is 511.
36
3=
3.2.8
Parameters
3.2.9
Strings
Strings can be stored in reg. The width of the register variables must be large
enough to hold the string. Each character in the string takes up 8 bits (1 byte). If
the width of the register is greater than the size of the string, Verilog fills bits to
the left of the string with zeros. If the register width is smaller than the string
width, Verilog truncates the leftmost bits of the string. It is always safe to declare
a string that is slightly wider than necessary.
reg [8*18: 1] string_value; / / Declare a variable that is 18 bytes
wide
initial
string_value
"Hello Verilog World"; II String can be stored
II in variable
Basic Concepts
37
Escaped Characters
Character Displayed
\n
newline
\t
tab
%%
\\
\"
\000
3.3.1
System Tasks
38
Strings can be formatted by using the format specifications listed in Table 3-4. For
more detailed format specifications, see Verilog HDL Language Reference Manual.
Table 3-4 String Format Specifications
Display
Format
%dor %D
%b or %B
%s or %5
Display string
%h or %H
%c or %C
%mor%M
%v or %V
Display strength
%0
or %0
%t or %T
%e or %E
%f or %F
%g or %G
Example 3-2 shows some examples of the $display task. If variables contain x or
z values they are printed in the displayed string as x or z.
Example 3-2
$display Task
Basic Concepts
39
Example 3-2
IIDisplay x characters
IIDisplay value of 4-bit bus 10xx (signal contention) in binary
reg [3:0] bus;
$display ("Bus value is %b", bus);
-- Bus value is 10xx
//Display the hierarchical name of instance p1 instantiated under
lithe highest-level module called top. No argument is required. This
Ilis a useful feature)
$display("This string is displayed from %m level of hierarchy");
-- This string is displayed from top.p1 level of hierarchy
Special Characters
Monitoring information
Verilog provides a mechanism to monitor a signal when its value changes. This
facility is provided by the $moni tor task.
40
Only one monitoring list can be active at a time. If there is more than one
$monitor statement in your simulation, the last $monitor statement will be the
active statement. The earlier $monitor statements will be overridden.
Two tasks are used to switch monitoring on and off.
Usage: $monitoron;
$monitoroff;
The $monitoron tasks enables monitoring, and the $monitoroff task disables
monitoring during a simulation. Monitoring is turned on by default at the
beginning of the simulation and can be controlled during the simulation with the
$monitoron and $monitoroff tasks. Examples of monitoring statements are
given in Example 3-4. Note the use of $time in the $monitor statement.
Example 3-4
Monitor Statement
Usage: $stop;
The $stop task puts the simulation in an interactive mode. The designer can then
debug the design from the interactive mode. The $stop task is used whenever the
designer wants to suspend the simulation and examine the values of signals in
the design.
The $finish task terminates the simulation.
Usage: $finish;
Examples of $stop and $finish are shown in Example 3-5.
Basic Concepts
41
Example 3-5
II
II
3.3.2
Compiler Directives
Compiler directives are provided in Verilog. All compiler directives are defined
by using the '<keyword> construct. We deal with the two most useful compiler
directives.
'define
The 'define directive is used to define text macros in Verilog (see Example 3-6).
This is similar to the #define construct in C. The defined constants or text macros
are used in the Verilog code by preceding them with a ' (back tick). The Verilog
compiler substitutes the text of the macro wherever it encounters a
, <macro_name>.
Example 3-6
'define Directive
IIUsed
1:
Iidefine a frequently used text string
'define WORD_REG reg [31:0]
II you can then define a 32-bit register as 'WORD_REG reg32;
42
'include
The ' include directive allows you to include entire contents of a Verilog source
file in another Verilog file during compilation. This works similarly to the #include
in the C programming language. This directive is typically used to include header
files, which typically contain global or commonly used definitions (see Example
Example 3-7
'include Directive
'include header.^
...
...
<Verilog code in file design.vz
Two other directives, ' ifdef and ' timescale, are used frequently. They are
discussed in Chapter 9, Useful Modeling Techniques.
3.4 Summary
We discussed the basic concepts of Verilog in this chapter. These concepts lay the
foundation for the material discussed in the further chapters.
Verilog is similar in syntax to the C programming language . Hardware
designers with previous C programming experience will find Verilog easy to
learn.
Lexical conventions for operators, comments, whitespace, numbers, strings,
and identifiers were discussed.
Various data types are available in Verilog. There are four logic vaIues, each
with different strength levels. Available data types include nets, registers,
vectors, numbers, simulation time, arrays, memories, parameters, and
strings. Data types represent actual hardware elements very closely.
Verilog provides useful system tasks to do functions like displaying,
monitoring, suspending, and finishing a simulation.
Basic Concepts
Compiler directive 'define is used to define text macros, and ' include is
used to include other Verilog files.
3.5 Exercises
1. Practice writing the following numbers
a. Decimal number 123 as a sized 8-bit number in binary. Use
readability.
b. A 16-bit hexadecimal unknown number with all X'S.
for
c. A 4-bit negative 2 in decimal . Write the 2's complement form for this
number.
d. An unsized hex number 1234.
2. Are the following legal strings? If not, write the correct strings.
a. "This is a string displaying the % sign"
d. exec$
4. Declare the following variables in Verilog.
a. An &bit vector net called a-in.
b. A 32-bit storage register called address. Bit 31 must be the most
significant bit. Set the value of the register to a 32-bit decimal number
equal to 3.
c. An integer called count.
d. A time variable called snap-shot.
e. An array called delays. Array contains 20 elements of the type integer.
f. A memory MEM containing 256 words of 64 bits each.
g. A parameter cache-size equal to 512.
= %b\n", latch);
= %b\n", inJeg[2:0});
Basic Concepts
45
46
Learning Objectives
Identify the components of a Verilog module definition, such as module
names, port lists, parameters, variable declarations, dataflow statements,
behavioral statements, instantiation of other modules, and tasks or
functions.
Understand how to define the port list for a module and declare it in
Verilog.
Describe the port connection rules in a module instantiation.
Understand how to connect ports to external signals, by ordered list, and by
name.
Explain hierarchical name referencing of Verilog identifiers.
4.1 Modules
We discussed how a module is a basic building block in Chapter 2, Hierarchical
Modeling Concepts. We ignored the internals of modules and concentrated on how
modules are defined and instantiated. In this section we analyze the internals of
the module in greater detail.
A module in Verilog consists of distinct parts, as shown in Figure 4-1.
Module Name,
Port List, Port Declarations (if ports present)
Parameters(optional),
Declarations of wires,
regs and other variables
Instantiation of lower
level modules
endmodule statement
Figure 4-1
A module definition always begins with the keyword module. The module name,
port list, port declarations, and optional parameters must come first in a module
definition. Port list and port declarations are present only if the module has any
ports to interact with the external environment.The five components within a
module are - variable declarations, dataflow statements, instantiation of lower modules,
behavioral blocks, and tasks or functions. These components can be in any order and
at an'{ ~lace in the module definition. The endm.odul.e statement must alwa~s
come last in a module definition. All components except module, module name,
and endmodule are optional and can be mixed and matched as per design needs.
Verilog allows multiple modules to be defined in a single file. The modules can be
defined in any order in the file.
To understand the components of a module shown above, let us consider a simple
example of an SR latch, as shown in Figure 4-2.
48
r------------,
Sbar
(set)
Rbar
(reset)
Figure 4-2
I
b---.,..-I;...- Q
P--~---LI-
Qbar
L. ___________ J
SR Latch
The SR latch has 5 and R as the input ports and Q and Qbar as the output ports.
The SR latch and its stimulus can be modeled as shown in Example 4-1.
Example 4-1
Components of SR Latch
IIPort declarations
output Q, Qbar;
input Sbar, Rbar;
II Instantiate lower-level modules
II In this case, instantiate Verilog primitive nand gates
II Note, how the wires are connected in a cross-coupled fashion.
nand nl(Q, Sbar, Qbar);
nand n2(Qbar, Rbar, Q);
II endmodule statement
endmodule
II Module name and port list
II Stimulus module
module Top;
49
Example 4-1
wire q, qbar;
reg set, reset;
/ / Instantiate lower-level modules
/ / In this case, instantiate SR-latch
/ / Feed inverted set and reset signals to the SR latch
However, the stimulus block for the SR latch contains module name, wire, reg,
and variable declarations, instantiation of lower level modules, bekavioral block
( i n i t i a l ) , and endmodule statement but does not contain port list, port
declarations, and data flow ( a s s i g n ) statements.
Thus, all parts except module, module name, and endmodule are optional and
can be mixed and matched as per design needs.
4.2 Ports
Ports provide the interface by which a module can communicate with its
environment. For example, the input/output pins of an Ie chip are its ports. The
environment can interact with the module only through its ports. The internals of
the module are not visible to the environment. This provides a very powerful
flexibility to the designer. The internals of the module can be changed without
affecting the environment as long as the interface is not modified. Ports are also
referred to as terminals.
4.2.1
List of Ports
A module definition contains an optional list of ports. If the module does not
exchange any signals with the environment, there are no ports in the list.
Consider a 4-bit full adder that is instantiated inside a top-level module Top. The
diagram for the input/ output ports is shown in Figure 4-3.
Top
full
adder
(4 bit)
fulladd4
Figure 4-3
--'sum
Notice that in the above figure, the module Top is a top-level module. The module
fulladd4 is instantiated below Top. The module fulladd4 takes input on ports a, b,
and c_in and produces an output on ports sum and c_out. Thus, module fulladd4
performs an addition for its environment. The module Top is a top-level module
in the simulation and does not need to pass signals to or receive signals from the
environment. Thus, it does not have a list of ports. The module names and port
lists for both module declarations in Verilog are as shown in Example 4-2.
Example 4-2
List of Ports
51
4.2.2
Port Declaration
All ports in the list of ports must be declared in the module. Ports can be declared
as follows:
Verilog Keyword
input
output
inout
Type of Port
Input port
Output port
Bidirectional port
Each port in the port list is defined as input, output, or inout, based on the
direction of the port signal. Thus, for the example of the fulladd4 in Example 4-2,
the port declarations will be as shown in Example 4-3.
Example 4-3
Port Declarations
Note that all port declarations are implicitly declared as wire in Verilog. Thus, if
a port is intended to be a wire, it is sufficient to declare it as output, input, or
inout. Input or inout ports are normally declared as wires. However, if output
ports hold their value, they must be declared as reg. For example, in the
definition of DFF, in Example 2-5, we wanted the output q to retain its value until
the next clock edge. The port declarations for DFF will look as shown in Example
4-4.
52
4=
Example 4-4
endmodule
Ports of the type input and inout cannot be declared as reg because reg
variables store values and input ports should not store values but simply reflect
the changes in the external signals they are connected to.
4.2.3
One can visualize a port as consisting of two units, one unit that is internal to the
module another that is external to the module. The internal and external units are
connected. There are rules governing port connections when modules are
instantiated within other modules. The Verilog simulator complains if any port
connection rules are violated. These rules are summarized in Figure 4-4.
net ~~
net
inout
"
reg or net
Figure 4-4
..
...
input
output
reg or net
--..
net
Inputs
Internally, input ports must always be of the type net. Externally, the inputs can
be connected to a variable which is a reg or a net.
53
Outputs
Internally, outputs ports can be of the type reg or net. Externally, outputs must
always be connected to a net. They cannot be connected to a reg.
Inouts
Internally, in out ports must always be of the type net. Externally, inout ports must
always be connected to a net.
Width matching
It is legal to connect internal and external items of different sizes when making
inter-module port connections. However, a warning is typically issued that the
widths do not match.
Unconnected ports
Verilog allows ports to remain unconnected. For example, certain output ports
might be simply for debugging, and you might not be interested in connecting
them to the external signals. You can let a port remain unconnected by
instantiating a module as shown below.
fulladd4 faO(SUM,
module Top;
54
Example 4-5
<stimulus>
endmodule
This problem is rectified if the variable SUM is declared as a net (wire). A similar
problem would occur if an input port were declared as a reg.
4.2.4
There are two methods of making connections between signals specified in the
module instantiation and the ports in a module definition. The two methods
cannot be mixed.
Connecting by ordered list
Connecting by ordered list is the most intuitive method for most beginners. The
signals to be connected must appear in the module instantiation in the same order
as the ports in the port list in the module definition. Once again, consider the
module fulladd4 defined in Example 4-3. To connect signals in module Top by
ordered list, the Verilog code is shown in Example 4-6. Notice that the external
signals SUM, C_OUT, A, B, and CjN appear in exactly the same order as the
ports sum, c_out, a, b, and cin in module definition of fulladd4.
Example 4-6
module Top;
//Declare connection variables
reg [3:0]A,B;
reg C_IN;
wire [3:0] SUM;
wire C_OUT;
//Instantiate fulladd4, call it fa_ordered.
//Signals are connected to ports in order (by position)
fulladd4 fa_ordered (SUM, C_OUT, A, B, C_IN);
<stimulus>
55
Example 4-6
endmodule
56
4=
Another advantage of connecting ports by name is that as long as the port name
is not changed, the order of ports in the port list of a module can be rearranged
without changing the port connections in module instantiations.
stimulus
(Root level)
q, qbar,
set, reset
(variables)
nl
(nand)
Figure 4-5
~
~
Q, Qbar
S, R
(signals)
For this simulation, stimulus is the top-level module. Since the top-level module is
not instantiated anywhere, it is called the root module. The identifiers defined in
this module are q, qbar, set, and reset. The root module instantiates ml, which is a
module of type SR_Iatch. The module ml instantiates nand gates nl and n2. Q,
Qbar, S, and R are port signals in instance ml. Hierarchical name referencing
57
assigns a unique name to each identifier. To assign hierarchical names, use the
module name for root module and instance names for all module instances below
the root module. Example 4-7 shows hierarchical names for all identifiers in the
above simulation. Notice that there is a dot ( .) for each level of hierarchy from the
root module to the desired identifier.
Example 4-7
Hierarchical Names
stimulus
stimulus.qbar
stimulus.reset
stimu1us.ml.Q
stimu1us.ml.S
stimulus.nl
Each identifier in the design is uniquely specified by its hierarchical path name.
To display the level of hierarchy, use the special character %m in the $display
task. See Table 3-4, String Format Specifications, for details.
4.4 Summary
In this chapter we discussed the following aspects of Verilog
Module definitions contain various components. Keywords module and
endmodule are mandatory. Other components-port list, port declarations,
variable and signal declarations, dataflow statements, behavioral blocks, lower-level
module instantiations, and tasks or functions-are optional and can be added
as needed.
Ports provide the module with a means to communicate with other modules
or its environment. A module can have a port list. Ports in the port list must
be declared as input, output, or inout. When instantiating a module, port
connection rules are enforced by the Verilog simulator.
Ports can be connected by name or by ordered list.
Each identifier in the design has a unique hierarchical name. Hierarchical
names allow us to address any identifier in the design from any other level
of hierarchy in the design.
4.5 Exercises
1. What are the basic components of a module? Which components are
mandatory?
2. Does a module that does not interact with its environment have any I/O
ports? Does it have a port list in the module definition?
3. A 4-bit parallel shift register has I/O pins as shown in the figure below.
Write the module definition for this module shiftJeg. Include the list of
ports and port declarations. You do not need to show the internals.
shiftJeg
---. reg_out
[3:0]
(4 bit)
4. Declare a top-level module stimulus. Define REGjN (4 bit) and CLK (1 bit)
as reg register variables and REG_OUT (4 bit) as wire. Instantiate the
module shiftJeg and call it sr1. Connect the ports by ordered list.
5. Connect the ports in Step 4 by name.
6. Write the hierarchical names for variables REGjN, CLK, and REG_OUT.
7. Write the hierarchical name for the instance sr1. Write the hierarchical names
for its ports clock and reg_in.
59
60
Gate-Level Modeling
In the earlier chapters, we laid the foundations of Verilog design by discussing
design methodologies, basic conventions and constructs, modules and port
interfaces. In this chapter, we get into modeling actual hardware circuits in
Verilog.
We discussed the four levels of abstraction used to describe hardware. In this
chapter, we discuss a design at a low level of abstraction-gate level. Most digital
design is now done at gate level or higher levels of abstraction. At gate level, the
circuit is described in terms of gates (e.g., and, nand). Hardware design at this
level is intuitive for a user with a basic knowledge of digital logic design because
it is possible to see a one-to-one correspondence between the logic circuit diagram
and the Verilog description. Hence, in this book, we chose to start with gate-level
modeling and move to higher levels of abstraction in the succeeding chapters.
Actually, the lowest level of abstraction is switch- (transistor-) level modeling.
However, with designs getting very complex, very few hardware designers work
at switch level. Therefore, we will defer switch-level modeling to Chapter 11,
Switch-Level Modeling, in Part 2 of this book.
Learning Objectives
Identify logic gate primitives provided in Verilog.
Understand instantiation of gates, gate symbols and truth tables for andlor
and buflnot type gates.
Understand how to construct a Verilog description from the logic diagram of
the circuit.
Describe rise, fall, and turn-off delays in the gate-level design.
Explain min, max, and typ delays in the gate-level design.
=5
5.1 Gate Types
A logic circuit can be designed by use of logic gates. Verilog supports basic logic
gates as predefined primitives. These primitives are instantiated like modules
except that they are predefined in Verilog and do not need a module definition.
All logic circuits can be designed by using basic gates. There are two classes of
basic gates: and/or gates and but/not gates.
5.1.1
And/Or Gates
And/ or gates have one scalar output and multiple scalar inputs. The first terminal
in the list of gate terminals is an output and the other terminals are inputs. The
output of a gate is evaluated as soon as one of the inputs changes. The and/or
gates available in Verilog are shown below.
I nand
=d
or
nor
xor
xnor
The corresponding logic symbols for these gates are shown in Figure 5-1. We
consider gates with two inputs. The output terminal is denoted by out. Input
terminals are denoted by il and i2.
and
nand
or
nor
'1=L>~
12
xor
Figure 5-1
62
out
xnor
Basic Gates
5=
These gates are instantiated to build logic circuits in Verilog. Examples of gate
instantiations are shown below. In Example 5-1, for all instances, OUT is
connected to the output out, and INl and IN2 are connected to the two inputs i1
and i2 of the gate primitives. Note that the instance name does not need to be
specified for primitives. This lets the designer instantiate hundreds of gates
without giving them a name.
More than two inputs can be specified in a gate instantiation. Gates with more
than two inputs are instantiated by simply adding more input ports in the gate
instantiation (see Example 5-1). Verilog automatically instantiates the appropriate
gate.
Example 5-1
The truth tables for these gates define how outputs for the gates are computed
from the inputs. Truth tables are defined assuming two inputs. The truth tables
for these gates are shown in Table 5-1. Outputs of gates with more than two
inputs are computed by applying the truth table iteratively.
Gate-Level Modeling
63
--
Table 5-1
a
a a
a
1
x
a
z
a
and
i2
i1
a
a a
x
a
a
x
nand
i2
il
i2
i1
a
a a
nor
x
1
or
i2
a
1
i1
a
a a
x
x
xor
i2
5.1.2
i1
x
x
xnor
i2
Buf/Not Gates
Buf/not gates have one scalar input and one or more scalar outputs. The last
terminal in the port list is connected to the input. Other terminals are connected
to the outputs. We will discuss gates that have one input and one output.
64
5=
Two basic buf/not gate primitives are provided in Verilog.
not
The symbols for these logic gates are shown in Figure 5-2.
.-,[>>--__
in __
out
in ---[>o_----::out
buf
Figure 5-2
not
These gates are instantiated in Verilog as shown Example 5-2. Notice that these
gates can have multiple outputs but exactly one input, which is the last terminal
in the port list.
Gate Instantiations of Buf/Not Gates
Example 5-2
The truth tables for these gates are very simple. Truth tables for gates with one
input and one output are shown in Table 5-2.
Table 5-2
buf
in
out
not
in
out
Gate-Level Modeling
65
=5
Bufif/notif
Gates with an additional control signal on buf and not gates are also available.
I bufif1
bufifO
notifl
notifO
These gates propagate only if their control signal is asserted. They propagate z if
their control signal is deasserted. Symbols for bufif/notif are shown in Figure 5-3.
in
ctr1J?
out
in
ctrl
bufifl
in
ctr1}?
bufifO
Figure 5-3
notifl
out
out
in
ctrl
notifO
The truth tables for these gates are shown in Table 5-3.
66
out
5
Table 5-3
ctrl
x
1
ctrl
x
1
bufifl
in
notifl
in
bufifO 0
ctrl
x
1
ctrl
x
1
in
notifO
in
--
These gates are used when a signal is to be driven only when the control signal is
asserted. Such a situation is applicable when multiple drivers drive the signal.
These drivers are designed to drive the signal on mutually exclusive control
signals. Example 5-3 shows examples of instantiation of bufif and notif gates.
Example 5-3
Gate-Level Modeling
67
=5
5.1.3
Examples
Having understood the various types of gates available in Verilog, we will discuss
a real example that illustrates design of gate-level digital circuits.
Gate-level multiplexer
We will design a 4-to-1 multiplexer with 2 select signals. Multiplexers serve a
useful purpose in logic design. They can connect two or more sources to a single
destination. They can also be used to implement boolean functions. We will
assume for this example that signals 51 and sO do not get the value x or z. The
I/O diagram and the truth table for the multiplexer are shown in Figure 5-4. The
I/O diagram will be useful in setting up the port list for the multiplexer.
iO
i1
i2
4-to-1
Mux
i3
sl
Figure 5-4
--..out
sl
sO
out
10
II
12
13
sO
4-to-l Multiplexer
We will implement the logic for the multiplexer using basic logic gates. The logic
diagram for the multiplexer is shown in Figure 5-5.
68
5=
iO
r--------------------------~
yO
---1..._ _ _ _ _ _ _---1
I
I
I
I
I
I
I
I
I
I
I
i1 -+-----+------~--~
out
y3
s1n
sOn
s1 -;-......- .....
L__________________________
sO~--------~--~
Figure 5-5
The logic diagram has a one-to-one correspondence with the Verilog description.
The Verilog description for the multiplexer is shown in Example 5-4. Two
intermediate nets, sOn and sl n, are created; they are complements of input signals
51 and sO. Internal nets yO, yl, y2, y3 are also required. Note that instance names
are not specified for primitive gates, not, and, and or. Instance names are
optional for Verilog primitives but are mandatory for instances of user-defined
modules.
Example 5-4
IIO diagram
Gate-Level Modeling
69
=5
Verilog Description of Multiplexer (Continued)
Example 5-4
(yO,
(yl,
(y2,
(y3,
iO,
ii,
i2,
i3,
sin,
sin,
sl,
sl,
sOn);
sO);
sOn);
sO);
This multiplexer can be tested with the stimulus shown in Example 5-5. The
stimulus checks that each combination of select signals connects the appropriate
input to the output. The signal OUTPUT is displayed one time unit after it
changes. System task $monitor could also be used to display the signals when
they change values.
Example 5-5
70
5=
Example 5-5
%b, SO
%b, OUTPUT
II choose IN1
Sl = 0; SO = 1;
#1 $display ( "Sl
%b, SO
%b, OUTPUT
II choose IN2
Sl = 1; SO = 0;
#1 $display ( "Sl
%b, SO
%b, OUTPUT
%b, SO
%b, OUTPUT
II choose IN3
Sl = 1; so = 1;
#1 $display (" Sl
end
endmodule
The output of the simulation is shown below. Each combination of the select
signals is tested.
INO- 1, IN1- 0, IN2- 1, IN3- a
Sl
0,
so
0, OUTPUT
Sl
0,
so
1, OUTPUT
Sl
1,
so
0, OUTPUT
Sl
1,
so
1, OUTPUT
Gate-Level Modeling
71
=5
4-bit full adder
In this example, we design a 4-bit full adder whose port list was defined in
Section 4.2.1, List of Ports. We use primitive logic gates, and we apply stimulus to
the 4-bit full adder to check functionality. For the sake of simplicity, we will
implement a ripple carry adder. The basic building block is a I-bit full adder. The
mathematical equations for a I-bit full adder are shown below.
sum= (a ffi b ffi cin)
cout
(a b) + cin . (a ffi b)
The logic diagram for a I-bit full adder is shown in Figure 5-6.
r-----------------------------l
a
s1
I
sum
c_in
L _____________________________
Figure 5-6
I
I
I
This logic diagram for the I-bit full adder is converted to a Verilog description,
shown in Example 5-6.
Example 5-6
72
5=
Verilog Description for l-bit Full Adder (Continued)
Example 5-6
endmodule
A 4-bit ripple carry full adder can be constructed from four I-bit full adders, as
shown in Figure 5-7. Notice that faD, fal, fa2, and fa3 are instances of the module
fulladd (I-bit full adder).
a[O] b[O]
a[1] b[1]
-l-- i-
full
c1
adder
faO
-.-
a[2] b[2]
full
c2
adder
fal
a[3] b[3]
-.- I
full
c3
adder
fa2
L_
...J
sum [0]
Figure 5-7
c_out
full
adder
fa3
sum[1]
sum[2]
sum[3]
This structure can be translated to Verilog as shown in Example 5-7. Note that the
port names used in a I-bit full adder and a 4-bit full adder are the same but they
represent different elements. The element sum in a I-bit adder is a scalar quantity
and the element sum in the 4-bit full adder is a 4-bit vector quantity. Verilog keeps
names local to a module. Names are not visible outside the module unless fullpath, hierarchical name referencing is used. Also note that instance names must
be specified when defined modules are instantiated, but when instantiating
Verilog primitives, the instance names are optional.
Gate-Level Modeling
73
=5
Example 5-7
endmodule
74
5=
Example 5-8
initial
begin
$monitor($time," A= %b, B=%b, C_IN= %b, --- C_OUT= %b, SUM=: %b\n" ,
A, B, C_IN, C_OUT, SUM);
end
II Stimulate inputs
initial
begin
A = 4'dO; B = 4'dO; C_IN
l'bO;
#5 A
4' d3; B
4'd4;
#5 A
4'd2; B
4'd5;
#5 A
4 'd9; B
4 'd9;
#5 A
4'd10; B
4'd15;
#5 A
end
4'd10; B
4 'd5; C IN
l'b1;
endmodule
Gate-Level Modeling
75
=5
5.2 Gate Delays
Until now, we described circuits without any delays (i.e., zero delay). In real
circuits, logic gates have delays associated with them. Gate delays allow the
Verilog user to specify delays through the logic circuits. Pin-to-pin delays can also
be specified in Verilog. They are discussed in Chapter 10, Timing and Delays.
5.2.1
There are three types of delays from the inputs to the output of a primitive gate.
Rise delay
The rise delay is associated with a gate output transition to a
value.
from another
0, x
or z
Fall delay
The fall delay is associated with a gate output transition to a 0 from another
value.
1, x
or z
Turn-off delay
The turn-off delay is associated with a gate output transition to the high
impedance value (z) from another value.
If the value changes to x, the minimum of the three delays is considered.
76
5=
Three types of delay specifications are allowed. If only one delay is specified, this
value is used for all transitions. If two delays are specified, they refer to the rise
and fall delay values. The turn-off delay is the minimum of the two delays. If all
three delays are specified, they refer to rise, fall, and turn-off delay values. If no
delays are specified, the default value is zero. Examples of delay specification are
shown in Example 5-9.
Example 5-9
5.2.2
Min/Typ/Max Values
Verilog provides an additional level of control for each type of delay mentioned
above. For each type of delay-rise, fall, and turn-off-three values, min, typ, and
max, can be specified. Anyone value can be chosen at the start of the simulation.
Mini typ I max values are used to model devices whose delays vary within a
minimum and maximum range because of the Ie fabrication process variations.
Min value
The min value is the minimum delay value that the designer expects the gate to
have.
Typval
The typ value is the typical delay value that the designer expects the gate to have.
Gate-Level Modeling
77
=5
Max value
The max value is the maximum delay value that the designer expects the gate to
have.
Min, typ, or max values can be chosen at Verilog run time. Method of choosing a
min/typ/max value may vary for different simulators or operating systems. (For
Verilog-XUM, the values are chosen by specifying options +maxdelays,
+typdelay, and +mindelays at run time. If no option is specified, the typical delay
value is the default). This allows the designers the flexibility of building three
delay values for each transition into their design. The designer can experiment
with delay values without modifying the design.
Examples of min, typ, and max value specification for Verilog-XL are shown in
Example 5-10.
Example 5-10
II One delay
II i f +mindelays, delay=
II i f +typdelays, delay=
II i f +maxdelays, delay=
and #(4:5:6) al(out, il,
4
5
6
i2) ;
II
II
II
II
Two delays
if +mindelays, rise= 3,
if +typdelays, rise= 4,
if +maxdelays, rise= 5,
and #(3:4:5,5:6:7) a2(out,
II
II
II
II
Three delays
if +mindelays, rise= 2
if +typdelays, rise= 3
if +maxdelays, rise= 4
and #(2:3:4, 3:4:5, 4:5:6)
min(3,5)
min(4,6)
min(5,7)
fall= 5, turn-off
fall= 6, turn-off
fall= 7, turn-off
il, i2);
fall= 3
fall= 4
fall= 5
a3(out,
turn-off
turn-off
turn-off
il,i2);
4
5
6
78
5=
> verilog test.v +mindelays
5.2.3
Delay Example
Let us consider a simple example to illustrate the use of gate delays to model
timing in the logic circuits. A simple module called D implements the following
logic equations:
out= (a b) + c
I
I
I
I
a
b
Figure 5-8
I
I
out
I
L ____________ J
Module D
Gate-Level Modeling
79
=5
Example 5-11
or
IIDelay of 4 on gate 01
endmodule
The waveforms from the simulation are shown in Figure 5-9 to illustrate the effect
of specifying delays on gates. The waveforms are not drawn to scale. However,
simulation time at each transition is specified below the transition.
80
5=
A
B
XXX~
OUT XXXXXXX
I""
I""
~I
I""
Time 0
Figure 5-9
9 10
14 15
~I
I""
20
~L
25
29
1, OUT
1
transitions to
after 5 time units.
after a
5.3 Summary
In this chapter we discussed how to model gate-level logic in Verilog. We
discussed different aspects of gate-level design.
Basic types of gates are and, or, xor, buf, and not. Each gate has a logic
symbol, truth table, and a corresponding Verilog primitive. Primitives are
instantiated like modules except that they are predefined in Verilog. Output
of a gate is evaluated as soon as one of its inputs changes.
Gate-Level Modeling
81
For gate-level design, start with the logic diagram, write the Verilog
description for the logic by using gate primitives, provide stimulus, and
look at the output. Two design examples, a 4-to-1 multiplexer and a 4-bit full
adder, were discussed. Each step of the design process was explained.
Three types of delays are associated with gates, rise, fall, and turn-off. Verilog
allows specification of one, two, or three delays for each gate. Values of rise,
fall, and turn-off delays are computed by Verilog, based on the one, two, or
three delays specified.
For each type of delay, a minimum, typical, and maximum value can be
specified. The user can choose which value to apply at simulation time. This
provides the flexibility to experiment with three delay values without
changing the Verilog code.
The effect of propagation delay on waveforms was explained by the simple,
two-gate logic example. For each gate with a delay of t, the output changes t
time units after any of the inputs change.
5.4 Exercises
1. Create your own 2-input Verilog gates called my-or, my-and and my-not from
2-input nand gates. Check the functionality of these gates with a stimulus
module.
2. A 2-input x o r gate can be built from my-and, my-or and my-not gates.
Construct an x o r module in Verilog that realizes the logic function, z = xy' +
x'y. Inputs are X and y, and z is the output. Write a stimulus module that
exercises all four combinations of X and y inputs.
3. The l-bit full adder described in the chapter can be expressed in a sum of
products form.
sum = a.b.c-in + a'.b.c-in' + a'.b'.c-in + a.b'.c-in'
c-out = a.b + b.c-in + a.c-in
Assuming a, b, c-in are the inputs and sum and c-out are the outputs, design
a logic circuit to implement the l-bit full adder, using only and, not, and o r
gates. Write the Verilog description for the circuit. You may use up to 4-input
Verilog primitive and and o r gates. Write the stimulus for the full adder and
check the functionality for all input combinations.
5=
4. The logic diagram for an RS latch with delay is shown below.
r------------,
reset
set
I
p--r.....,Ir-- q
P----">---!-I- qbar
__________ --.J
(reset)
Write the Verilog description for the RS latch. Include delays of 1 unit when
instantiating the nor gates. Write the stimulus module for the RS latch,
using the following table, and verify the outputs.
set
reset
qn+l
o
o
'In
Gate-Level Modeling
83
=5
5. Design a 2-to-I multiplexer using
r -
bufifO
and
bufifl
-,
bufifI
inI
-..,...--l
out
inO
bI
bufifO
L___
.J
Typ
Max
Rise
Fall
Turnoff
84
Dataflow Modeling
For small circuits, the gate-level modeling approach works very well because the
number of gates is limited and the designer can instantiate and connect every
gate individually. Also, gate-level modeling is very intuitive to a designer with a
basic knowledge of digital logic design. However, in complex designs the number
of gates is very large. Thus, designers can design more effectively if they
concentrate on implementing the function at a level of abstraction higher than
gate level. Dataflow modeling provides a powerful way to implement a design.
Verilog allows a circuit to be designed in terms of the data flow between registers
and how a design processes data rather than instantiation of individual gates.
Later in this chapter, the benefits of dataflow modeling will become more
apparent.
With gate densities on chips increasing rapidly, dataflow modeling has assumed
great importance. No longer can companies devote engineering resources to
handcrafting entire designs with gates. Currently, automated tools are used to
create a gate-level circuit from a dataflow design description. This process is
called logic synthesis. Dataflow modeling has become a popular design approach
as logic synthesis tools have become sophisticated. This approach allows the
designer to concentrate on optimizing the circuit in terms of data flow. For
maximum flexibility in the design process, designers typically use a Verilog
description style that combines the concepts of gate-level, data flow, and
behavioral design. In the digital design community , the term RTL (Register
Transfer Level) design is commonly used for a combination of dataflow modeling
and behavioral modeling.
Learning Objectives
Describe the continuous assignment (assign) statement, restrictions on the
assign statement, and the implicit continuous assignment statement.
Explain assignment delay, implicit assignment delay, and net declaration
delay for continuous assignment statements.
Define expressions, operators, and operands.
Notice that drive strength is optional and can be specified in terms of strength
levels discussed in Section 3.2.1, Value Set. We will not discuss drive strength
specification in this chapter. The default value for drive strength is strong1 and
strongo.The delay value is also optional and can be used to specify delay on the
a s s i m statement. This is like specifying delays for gates. Delay specification is
discussed in this chapter. Continuous assignments have the following
characteristics.
1. The left hand side of an assignment must always be a scalar or vector net or
a concatenation of scalar and vector nets. It cannot be a scalar or vector
register. Concatenations are discussed in Section 6.4.8, Concatenation
Operator.
2. Continuous assignments are always active. The assignment expression is
evaluated as soon as one of the right-hand-side operands changes and the
value is assigned to the left-hand-side net.
3. The operands on the right-hand side can be registers or nets or function
calls. Registers or nets can be scalars or vectors.
4. Delay values can be specified for assignments in terms of time units. Delay
values are used to control the time when a net is assigned the evaluated
value. This feature is similar to specifying delays for gates. It is very useful
in modeling timing behavior in real circuits.
Examples of continuous assignments are shown below. Operators such as &, /\, I,
{, } and + used in the examples are explained in Section 6.4, Operator Types. At this
point, concentrate on how the assign statements are specified.
Example 6-1
II Continuous assign.
assign out = il & i2;
= addrl_bits[15:01
addr2_bits[15:01;
= a[3:01
+ b[3:0]
+ c_in;
6.1.1
Instead of declaring a net and then writing a continuous assignment on the net,
Verilog provides a shortcut by which a continuous assignment can be placed on a
net when it is declared. There can be only one implicit declaration assignment per
net because a net is declared only once.
Dataflow Modeling
87
=6
6.2 Delays
Delay values control the time between the change in a right-hand-side operand
and when the new value is assigned to the left-hand side. Three ways of
specifying delays in continuous assignment statements are regular assignment
delay, implicit continuous assignment delay, and net declaration delay.
6.2.1
88
ll-
in!
I
I
I
I
in2
out
xxxxxi
I
time
Figure 6-1
10
I
I
I
20
30
60
70
8085
Delays
6.2.2
The declaration above has the same effect as defining a wire out and declaring a
continuous assignment on out.
6.2.3
Dataflow Modeling
89
IINet Delays
wire # 10 out;
assign out = in1 & in2;
Having discussed continuous assignments and delays, let us take a closer look at
expressions, operators, and operands that are used inside continuous
assignments.
6.3.1
Expressions
90
6.3.2
Operands
Operands can be anyone of the data types defined in Section 3.2, Data Types.
Some constructs will take only certain types of operands. Operands can be
constants, integers, real numbers, nets, registers, times, bit-select (one bit of vector net
or a vector register), part-select (selected bits of the vector net or register vector),
memories or function calls (functions are discussed later).
integer count, final_count;
final_count = count + 1;llcount is an integer operand
real a, b , C;
c = a - b; Iia and b are real operands
6.3.3
Operators
Operator Types.
d1 && d2 II && is an operator on operands d1 and d2
!a[O) II ! is an operator on operand a[O)
B 1 II is an operator on operands Band 1
Dataflow Modeling
91
=6
6.4 Operator Types
Operator
Type
Operator
Symbol
Arithmetic
*
/
+
Operation
Performed
Number of
Operands
multiply
divide
add
subtract
modulus
two
two
two
two
two
one
two
two
II
logical negation
logical and
logical or
Relational
>
<
>=
<=
greater than
less than
greater than or equal
less than or equal
two
two
two
two
Equality
==
equality
inequality
case equality
case inequality
two
two
two
two
bitwise
bitwise
bitwise
bitwise
bitwise
one
two
two
two
two
Logical
&:&:
!=
===
!==
Bitwise
&:
I
A
A_
or
_/\
&:
-&:
Reduction
I
-I
A
A_
92
or
_A
negation
and
or
xor
xnor
reduction and
reduction nand
reduction or
red uction nor
red uction xor
reduction xnor
one
one
one
one
one
one
Table 6-1
Operator
Type
Operation
Performed
Operator
Symbol
Shift
Concatenation
Replication
Conditional
?:
Number of
Operands
Right shift
Left shift
two
two
Concatenation
any number
Replication
any number
Conditional
three
6.4.1
Arithmetic Operators
If any operand bit has a value x, then the result of the entire expression is x. This
seems intuitive because if an operand value is not known precisely, the result
should be an unknown.
in1
in2
sum
4'b101x;
4'b1010;
inl + in2;
Dataflow Modeling
93
=6
Modulus operators produce the remainder from the division of two numbers. They
operate similarly to the modulus operator in the C programming language.
13 % 3
16 % 4
-7 % 2
7 % -2
1/
1/
II
1/
Evaluates
Evaluates
Evaluates
Evaluates
to
to
to
to
1
0
-1, takes sign of the first operand
+1, takes sign of the first operand
Unary operators
The operators + and - can also work as unary operators. They are used to specify
the positive or negative sign of the operand. Unary + or - operators have higher
precedence than the binary + or - operators.
~4
II Negative 4
_ +5 II Positive 5
6.4.2
10)/5
Logical Operators
Logical operators are logical-and (&:&:), logical-or (II) and logical-not (I). Operators
and I I are binary operators. Operator I is a unary operator. Logical operators
follow these conditions:
&:&:
94
(ambiguous).
2. If an operand is not equal to zero, it is equivalent to a logical 1 (true
condition). If it is equal to zero, it is equivalent to a logical 0 (false
condition). If any operand bit is x or z, it is equivalent to x (ambiguous
condition) and is normally treated by simulators as a false condition.
3. Logical operators take variables or expressions as operands.
Use of parentheses to group logical operations is highly recommended to improve
readability. Also, the user does not have to remember the precedence of operators.
II Logical operations
A = 3; B = 0;
A && B II Evaluates to O. Equivalent to (logical-1 && logical-OJ
A I I B II Evaluates to 1. Equivalent to (logical-1 I I logical-O)
!AII Evaluates to O. Equivalent to not(logical-1)
!BII Evaluates to 1. Equivalent to not(logical-O)
II Unknowns
A = 2'bOx; B = 2'b10;
A && B II Evaluates to x. Equivalent to (x && logical 1)
II Expressions
(a == 2) && (b == 3) II Evaluates to 1 if both a
are true.
II Evaluates to 0 if either is false.
6.4.3
2 and b
Relational Operators
II A
II X
4, B
4'b1010, Y
4'b1101, Z
4'b1xxx
Dataflow Modeling
95
=6
y
>=
x II Evaluates to a logical 1
II Evaluates to an x
y < Z
6.4.4
Equality Operators
Equality operators are logical equality (==), logical inequality (I"), case equality (===),
and case inequality (I ==). When used in an expression, equality operators return
logical value 1 if true, if false. These operators compare the two operands bit by
bit, with zero filling if the operands are of unequal length. Table 6-2 lists the
operators.
Table 6-2
Equality Operators
Expression
Description
Possible Logical
Value
a == b
0,1, x
a != b
O,l,x
a === b
0,1
a !== b
0,1
II A
II x
II Z
4, B
4'bl010, Y
4'blxxz, M
4'bllOl
4'blxxz, N
4'blxxx
A
B II Results in logical 0
X != Y II Results in logical 1
X
Z II Results in x
Z === M //Results in logical 1 (all bits match, including x and z)
Z === N / / Results in logical 0 (least significant bit does not match)
M !== N II Results in logical 1
96
6.4.5
Bitwise Operators
Bitwise operators are negation (-), and(&), or (I), xor (A), xnor (1._, _A). Bitwise
operators perform a bit-by-bit operation on two operands. They take each bit in
one operand and perform the operation with the corresponding bit in the other
operand. If one operand is shorter than the other, it will be bit extended with
zeros to match the length of the longer operand. Logic tables for the bit-by-bit
computation are shown in Table 6-3. A z is treated as an x in a bitwise operation.
The exception is the unary negation operator (-), which takes only one operand
and operates on the bits of the single operand.
Table 6-3
bitwise and 0
bitwise or
0
x
x
1
bitwise xnor
x
x
bitwise xor
bitwise
ne ation
Result
II x
II Z
4'bl010, Y
4'blOxl
-x
II
II
II
II
X &Y
X I Y
X A Y
4'bllOl
Dataflow Modeling
97
X A_ Y
X & Z
II
II
&:&:, II. Logical operators always yield a logical value 0, 1, x, whereas bitwise
II x =
4'b1010, Y
4'bOOOO
6.4.6
Reduction Operators
Reduction operators are and (&:), nand (-&:), or (I), nor (-I), xor (A), and xnor(_A,
A_). Reduction operators take only one operand. Reduction operators perform a
bitwise operation on a single vector operand and yield a I-bit result. The logic
tables for the operators are the same as shown in Section 6.4.5, Bitwise Operators.
The difference is that bitwise operations are on bits from two different operands,
whereas reduction operations are on the bits of the same operand. Reduction
operators work bit by bit from right to left. Reduction nand, reduction nor, and
reduction xnor are computed by inverting the result of the reduction and, reduction
or, and reduction xor, respectively.
II x =
4'b1010
The use of a similar set of symbols for logical (I, &:&:, I I), bitwise (-, &:, I, A), and
reduction operators (&:, I, A) is somewhat confusing initially. The difference lies in
the number of operands each operator takes and also the value of result
computed.
98
6.4.7
Shift Operators
Shift operators are right shift ( ) and left shift (<<). These operators shift a vector
operand to the right or the left by a specified number of bits. The operands are
the vector and the number of bits to shift. When the bits are shifted, the vacant bit
positions are filled with zeros. Shift operations do not wrap around.
II x = 4'bllOO
y
Y
Y
x
X
X
1;
1;
2;
Shift operators are useful because they allow the designer to model shift
operations, shift-and-add algorithms for rimltiplication, and other useful
operations.
6.4.8
Concatenation Operator
{B
{A
{A
3'bllO
C} II Result Y is 4'bOOlO
B, C , D , 3'bOOl} II Result Y is ll'b100l011000l
B[G], C[l]} II Result Y is 3'blG1
Dataflow Modeling
99
6.4.9
Replication Operator
A;
[1:0] B, C;
[2: 0] D;
l'bl; B = 2'bOO; C
4{A}
4{A}
4{A}
2'bl0; D
3'bll0;
II Result Y is 4'bllll
2{B} } II Result Y is 8'bllll0000
2{B} , C } II Result Y is 8'bllll000010
2-to-l
multiplexer -----. Out
true_expr -----. 1
t
100
6=
Conditional operators are frequently used in dataflow modeling to model
conditional assignments. The conditional expression acts as a switching control.
Ilrnodel functionality of a tristate buffer
assign addr_bus = drive_enable ? addr_out
36 'bz;
y):
( control? rn
n)
Operators
Operator Symbols
+ -
Unary
Multiply, Divide, Modulus
* I
Add, Subtract
Shift
Relational
Equality
< <=
--
Precedence
Highest precedence
> >=
!= ---
!==
Dataflow Modeling
101
Operators
Operator Symbols
Precedence
&, -&
Reduction
I, -I
A
Logical
&&
II
Conditional
?:
Lowest precedence
6.S Examples
A design can be represented in terms of gates, data flow, or a behavioral
description. In this section we consider the 4-to-l multiplexer and 4-bit full adder
described in Section 5.1.3, Examples. Previously, these designs were directly
translated from the logic diagram into a gate-level Verilog description. Here, we
describe the same designs in terms of data flow. We also discuss two additional
examples: a 4-bit full adder using carry lookahead and a 4-bit counter using negative
edge-triggered D-flipflops.
6.5.1
4-to-1 Multiplexer
We can use assignment statements instead of gates to model the logic equations of
the multiplexer (see Example 6-2). Notice that everything is same as the gate-level
Verilog description except that computation of out is done by specifying one logic
equation by using operators instead of individual gate instantiations. I/O ports
102
6=
remain the same. This is important so that the interface with the environment does
not change. Only the internals of the module change. Notice how concise the
description is compared to the gate-level description.
Example 6-2
There is a more concise way to specify the 4-to-1 multiplexers. In Section 6.4.10,
Conditional Operator, we described how a conditional statement corresponds to a
multiplexer operation. We will use this operator to write a 4-to-l multiplexer.
Convince yourself that this description (Example 6-3) correctly models a
multiplexer.
Example 6-3
Dataflow Modeling
103
Example 6-3
assign out
(sO ? i1 : iO)
endmodule
6.5.2
The 4-bit full adder in Section 5.1.3, Examples, was designed by using gates; the
logic diagram is shown in Figure 5-7 on page 73 and Figure 5-6 on page 72. In this
section, we write the dataflow description for the 4-bit adder. Compare it with the
gate-level description in Figure 5-7. In gates, we had to first describe a 1-bit full
adder. Then we built a 4-bit full ripple carry adder. We again illustrate two
methods to describe a 4-bit full adder by means of dataflow statements.
104
If we substitute the gate-level 4-bit full adder with the dataflow 4-bit full adder,
the rest of the modules will not change. The simulation results will be identical.
II Internal wires
wire pO,gO, pl,gl, p2,g2, p3,g3;
wire c4, c3, c2, cl;
II compute the p for each stage
b[O],
assign pO
a[O]
b[l],
pI
a[l]
b[2],
p2
a[2]
b [3] ;
p3
a[3]
A
A
A
Dataflow Modeling
105
Example 6-5
6.5.3
Ripple Counter
We now discuss an additional example that was not discussed in the gate-level
modeling chapter. We design a 4-bit ripple counter by using negative edgetriggered flip-flops. This example was discussed at a very abstract level in
Chapter 2, Hierarchical Modeling Concepts. We design it using Verilog dataflow
statements and test it with a stimulus module. The diagrams for the 4-bit ripple
carry counter modules are shown below.
106
6=
Figure 6-2 shows the counter being built with four T-flipflops.
qO
r----
I
I
I
clock
clea
,
-
ql
- -
--
~ T]~~L.c I) T FFi---Lc ~
q
tffO
tffl
q3
q2
- q
T_FF
tff2
1------
f-"L..c )
q~
T_FF
tff3
I
I
I
_...J
Figure 6-2
Figure 6-3 shows that the T-flipflop is built with one D-flipflop and an inverter gate.
TFF
q
r -
clock
"1
--r--O
reset
Figure 6-3
T-flipflop
Dataflow Modeling
107
Finally, Figure 6-4 shows the D-flipflop constructed from basic logic gates.
r--------------------------.
I
I
I
I
I
I
clear
cbar
I
I
I
I
I
I
elk
):>-""'"--ir--
Figure 6-4
q bar
I
I
I
I
I
I
I
I
L __________________________ JI
Given the above diagrams, we write the corresponding Verilog, using dataflow
statements in a top-down fashion. First we design the module counter. The code is
shown in Figure 6-6. The code contains instantiation of four T_FF modules.
Example 6-6
II Ripple counter
module counter(Q , clock, clear);
II I/O ports
output [3:0] Q;
input clock, clear;
II Instantiate
T_FF tffO(Q[O],
T_FF tffl(Q[l],
T_FF tff2(Q[2],
T_FF tff3(Q[3],
the T flipflops
clock, clear);
Q[O], clear);
Q[l], clear);
Q[2], clear);
endmodule
108
Next, we write the Verilog description for T_FF (Example 6-7). Notice that instead
of the not gate, a dataflow operator - negates the signal q, which is fed back.
Example 6-7
II
II
II 1/0 ports
output g;
input elk, clear;
II
II
II
Finally, we define the lowest level module D _FF (edge_dff), using dataflow
statements (Example 6-8). The dataflow statements correspond to the logic
diagram shown in Figure 6-4. The nets in the logic diagram correspond exactly to
the declared nets.
Example 6-8
II Edge-triggered D flipflop
module edge_dff(g, qbar, d, elk, clear};
II Inputs and outputs
output g,gbar;
input d, elk, clear;
II Internal variables
wire s, sbar, r, rbar,cbar;
II dataflow statements
IICreate a complement of
assign cbar
II
II
signal clear
= -clear;
Dataflow Modeling
109
=6
Example 6-8
assign
II Output latch
assign q = -(s & qbar) ,
qbar = -(q & r & cbar);
endrnodule
The design block is now ready. Now we must instantiate the design block inside
the stimulus block to test the design. The stimulus block is shown in
Example 6-9. The clock has a time period of 20 with a 50% duty cycle.
Example 6-9
110
Q[3:0]'CLEAR);
Example 6-9
CLOCK = l'bO;
forever #10 CLOCK
-CLOCK;
end
II Finish the simulation at time 400
initial
begin
#400 $finish;
end
endmodule
The output of the simulation is shown below. Note that the clear signal resets the
count to zero.
0
34
40
60
80
100
120
140
160
180
200
220
234
284
300
320
340
360
380
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Count
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
0000
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
0000
0000
0001
0010
0011
0100
0101
Clear=
C1ear=
Clear=
Clear=
Clear=
C1ear=
Clear=
Clear=
Clear=
Clear=
Clear=
Clear=
Clear=
Clear=
C1ear=
Clear=
Clear=
Clear=
C1ear=
Dataflow Modeling
1
0
0
0
0
0
0
0
0
a
0
0
1
0
a
0
0
0
0
111
6.6 Summary
Continuous assignment is one of the main constructs used in dataflow
modeling. A continuous assignment is always active and the assignment
expression is evaluated as soon as one,of the right-hand-side variables
changes. The left-hand side of a contiduous assignment must be a net. Any
logic function can be realized with continuous assignments.
Delay values control the time between the change in a right-hand-side
variable and when the new value is assigned to the left-hand side. Delays on
a net can be defined in the assign statement, implicit continuous
assignment, or net declaration.
Assignment statements contain expressions, operators, and operands.
The operator types are arithmetic, logical, relational, equality, bitwise, reduction,
shift, concatenation, replication, and conditional. Unary operators require one
operand, binary operators require two operands, and ternary require three
operands. The concatenation operator can take any number of operands.
The conditional operator behaves like a multiplexer in hardware or like the ifthen-else statement in programming languages.
Dataflow description of a circuit is more concise than a gate-level
description. The 4-to-1 multiplexer and the 4-bit full adder discussed in the
gate-level modeling chapter can also be designed by use of dataflow
statements. Two dataflow implementations for both circuits were discussed.
A 4-bit ripple counter using negative edge-triggered D-flipflops was
designed.
6.7 Exercises
1. A full subtractor has three l-bit inputs X , y, and z (previous borrow) and two
l-bit outputs D (difference) and B (borrow). The logic equations for D and B
are as follows:
Write the full Verilog description for the full subtractor module, including
I/O ports (Remember that + in logic equations corresponds to a logical or
operator (II) in dataflow). Instantiate the subtractor inside a stimulus block
and test all eight possible combinations of x, y, and z given in the following
truth table.
x
0
0
The three outputs of the magnitude comparator are A-$t_B, A_lt_B, A_eq_B.
They are defined with the following logic equations.
A-$t_B = A(3).B(3)' + x(3).A(2).B(2/ + x(3).x(2).A(l).B(1/ +
x(3).x(2).x(l).A(O).B(O)'
A_lt_B = A(3)'.B(3) + x(3).A(2)'.B(2) + x(3).x(2).A(l)'.B(l) +
x(3).x(2).x(1).A(O)'.B(O)
A_eq_B
= x(3).x(2).x(1).x(O)
Dataflow Modeling
113
=6
Write the Verilog description of the module magnitude_comparator. Instantiate
the magnitude comparator inside the stimulus module and tryout a few
combinations of A and B.
clear --+-+---~.--"*---+-----,
+-- qbar
IO-".....
K--t--l
Master-Slave IK-flipflop
0[0]
0[1]
0[3]
0[2]
o
K
clear-~~~r-t--r-i~~-t-~-i-+~~-r-+--+~~
clock -----1-t--+-+---+-+--+-+---I-+--+-+----1---1
count ----1~--+---l
enable
Figure 6-6
114
Behavioral Modeling
With the increasing complexity of digital design, it has become vitally important
to make wise design decisions early in a project. Designers need to be able to
evaluate the trade-offs of various architectures and algorithms before they decide
on the optimum architecture and algorithm to implement in hardware. Thus,
architectural evaluation takes place at an algorithmic level where the designers do
not necessarily think in terms of logic gates or data flow but in terms of the
algorithm they wish to implement in hardware. They are more concerned about
the behavior of the algorithm and its performance. Only after the high-level
architecture and algorithm are finalized, do designers start focusing on building
the digital circuit to implement the algorithm.
Verilog provides designers the ability to describe design functionality in an
algorithmic manner. In other words, the designer describes the behavior of the
circuit. Thus, behavioral modeling represents the circuit at a very high level of
abstraction. Design at this level resembles C programming more than it resembles
digital circuit design. Behavioral Verilog constructs are similar to C language
constructs in many ways. Verilog is rich in behavioral constructs that provide the
designer with a great amount of flexibility.
Learning Objectives
Explain the significance of structured procedures always and initial in
behavioral modeling.
Define blocking and nonblocking procedural assignments.
Understand delay-based timing control mechanism in behavioral modeling.
Use regular delays, intra-assignment delays, and zero delays.
Describe event-based timing control mechanism in behavioral modeling.
Use regular event control, named event control, and event OR control
Use level-sensitive timing control mechanism in behavioral modeling.
Explain conditional statements using i f and else.
7.1.1
initial Statement
initial Statement
module stimulus;
reg x,y, a,b, m;
initial
116
7=
Example 7-1
m
initial Statement
l'bO; //sing1e statement; does not need to be grouped
initial
begin
#5 a = l'b1; //mu1tip1e statements; need to be grouped
#25 b = l'bO;
end
initial
begin
#lOx
#25 y
end
l'bO;
l'b1;
initial
#50 $finish;
endmodule
In the above example, the three initial statements start to execute in parallel at time
O. If a delay #<delay> is seen before a statement, the statement is executed <delay>
time units after the current simulation time. Thus, the execution sequence of the
statements inside the initial blocks will be as follows.
time
0
5
10
30
35
50
statement executed
m
l'bO;
a = l'b1;
x = l'bO;
b
l'bO;
l'bl;
Y
$finish;
The initial blocks are typically used for initialization, monitoring, waveforms
and other processes that must be executed only once during the entire simulation
run.
Behavioral Modeling
117
=7
7.1.2
always Statement
always Statement
module clock_gen;
reg clock;
//Initialize clock at time zero
initial
clock = l'bO;
//Toggle clock every half-cycle (time period
always
#10 clock = -clock;
20)
initial
#1000 $finish;
endmodule
In Example 7-2, the always statement starts at time 0 and executes the statement
clock = -clock every 10 time units. Notice that the initialization of clock has to be
done inside a separate initial statement. If we put the initialization of clock
inside the always block, clock will be initialized every time the always is entered.
Also, the simulation must be halted inside an initial statement. If there is no
$stop or $finish statement to halt the simulation, the clock generator will run
forever.
C programmers might draw an analogy between the always block and an infinite
loop. But hardware designers tend to view it as a continuously repeated activity
in a digital circuit starting from power on. The activity is stopped only by power
off ($finish) or by an interrupt ($stop).
118
7.2.1
Blocking assignments
Blocking assignment statements are executed in the order they are specified in a
sequential block. A blocking assignment will not block execution of statements
that follow in a parallel block. Both parallel and sequential blocks are discussed in
Section 7.7, Sequential and Parallel Blocks, The = operator is used to specify
blocking assignments.
Example 7-3
Blocking Statements
reg X, y, z ;
reg r15: 01 reg-a, reg-b;
integer count;
Behavioral Modeling
119
Example 7-3
7.2.2
Nonblocking Assignments
120
7=
symbol as a relational operator, less_than_equal_to. The operator <= is interpreted
as a relational operator in an expression and as an assignment operator in the
context of a nonblocking assignment. To illustrate the behavior of nonblocking
statements and its difference from blocking statements, let us consider
Example 7-4, convert some blocking assignments to nonblocking assignments,
and observe the behavior.
Example 7-4
Nonblocking Assignments
reg x, y, z;
reg [15:0] reg_a, reg_b;
integer count;
0)
Thus, the simulator schedules a non blocking assignment statement to execute and
continues to the next statement in the block without waiting for the nonblocking
statement to complete execution. Typically, nonblocking assignment statements
are executed last in the time step in which they are scheduled, that is, after all the
blocking assignments in that time step are executed.
Behavioral Modeling
121
=7
Application of nonblocking assignments
At each positive edge of clock, the following sequence takes place for the
nonblocking assignments.
1. A read operation is performed on each right-hand-side variable, inl, in2, in3,
and regl, at the positive edge of clock. The right-hand-side expressions are
evaluated, and the results are stored internally in the simulator.
2. The write operations to the left-hand-side variables are scheduled to be
executed at the time specified by the intra-assignment delay in each
assignment, that is, schedule "write" to regl after 1 time unit, to reg2 at the
next negative edge of clock, and to reg3 after 1 time unit.
3. The write operations are executed at the scheduled time steps. The order in
which the write operations are executed is not important because the
internally stored right-hand-side expression values are used to assign to the
left-hand-side values. For example, note that reg3 is assigned the old value
of regl that was stored after the read operation, even if the write operation
wrote a new value to regl before the write operation to reg3 was executed.
Thus, the final values of regl, reg2, and reg3 are not dependent on the order in
which the assignments are processed.
To understand the read and write operations further, consider Example 7-5, which
is intended to swap the values of registers a and b at each positive edge of clock,
using two concurrent always blocks.
122
7=
Example 7-5
Behavioral Modeling
123
=7
Example 7-6
IIWrite operation
IIAssign values of temporary variables to left-hand-side variables
a
temp_b;
b = temp_a;
end
7.3.1
: :=
#<NUMBER>
11= #<identifier>
11= #mintypmax_expression> <,<mintypmax_expression*)
124
7=
Delay-based timing control can be specified by a number, identifier, or a
mintypmax_expression. There are three types of delay control for procedural
assignments: regular delay control, intra-assignment delay control, and zero delay
control.
Regular delay control
Regular delay control is used when a non-zero delay is specified to the left of a
procedural assignment. Usage of regular delay control is shown in Example 7-7.
Example 7-7
Iidefine parameters
parameter latency
20;
parameter delta = 2;
Iidefine register variables
reg x, y, z, p, q;
initial
begin
x = 0; II no delay control
#10 y = 1; II delay control with a number. Delay execution of
II y = 1 by 10 units
#latency z = 0; //Delay control with identifier. Delay of 20 units
# (latency + delta) p = 1; II Delay control with expression
#y x
=x
+ 1;
#(4:5:6) q
= 0;
end
Behavioral Modeling
125
Intra-assignment Delays
Note the difference between intra-assignment delays and regular delays. Regular
delays defer the execution of the entire assignment. Intra-assignment delays
compute the right-hand-side expression at the current time and defer the
assignment of the computed value to the left-hand-side variable. Intra-assignment
delays are like using regular delays with a temporary variable to store the current
value of a right-hand-side expression.
126
7=
Zero delay control
Example 7-9
initial
begin
x = 0;
Y
0;
end
initial
begin
#0 x
#0 y
end
7.3.2
An event is the change in the value on a register or a net. Events can be utilized to
trigger execution of a statement or a block of statements. There are four types of
event-based timing control: regular event control, named event control, event OR
control, and level-sensitive timing control.
Behavioral Modeling
127
=7
Regular event control
Verilog provides the capability to declare an event and then trigger and recognize
the occurrence of that event (see Example 7-11). The event does not hold any data.
A named event is declared by the keyword event. An event is triggered by the
symbol ->. The triggering of the event is recognized by the symbol @.
Example 7-11
128
7=
Named Event Control (Continued)
Example 7-11
Event OR control
Event OR Control
7.3.3
Event control discussed earlier waited for the change of a signal value or the
triggering of an event. The symbol @ provided edge-sensitive control. Verilog also
allows level-sensitive timing control, that is, the ability to wait for a certain
condition to be true before a statement or a block of statements is executed. The
keyword wait is used for level-sensitive constructs.
always
wait (count_enable) #20 count
count + 1;
Behavioral Modeling
129
//Type 1 statements
if(!lock) buffer = data;
if (enable) out = in;
130
7=
Example 7-13
//Type 2 statements
if (number_queued < MAX_Q_DEPTH)
begin
data_queue = data;
number_queued = number_queued + 1;
end
else
$di splay ( "Queue Full. Try again");
//Type 3 statements
//Execute statements based on ALU control signal.
if (alu_control == 0)
y = x + z;
else if(alu_control
1)
y = x - z;
else if(alu_control
2)
y = x * z;
else
$display("Invalid ALU control signal");
Behavioral Modeling
131
=7
7.5.1
case Statement
The keywords case, endcase, and defaul t are used in the case statement. .
case (expression)
alternativel: statementl;
alternative2: statement2;
alternative3: statement3;
default: default_statement;
endcase
case (alu_control)
2'dO
y
x + z;
2'd1 : y = x - z;
2'd2 : y = X * z;
default: $display("Invalid ALU control signal");
endcase
132
The case statement can also act like a many-to-one multiplexer. To understand
this, let us model the 4-to-1 multiplexer in Section 6.5, Examples, on page 102,
using case statements. The I/O ports are unchanged. Notice that an 8-to-1 or 16to-1 multiplexer can also be easily implemented by case statements.
Example 7-14
The case statement compares 0, 1, x, and z values in the expression and the
alternative bit for bit. If the expression and the alternative are of unequal bit
width, they are zero filled to match the bit width of the widest of the expression
and the alternative. In Example 7-15, we will define a 1-to-4 demultiplexer for
which outputs are completely specified, that is, definitive results are provided
even for x and z values on the select signal.
Example 7-15
Behavioral Modeling
133
Example 7-15
l'bz;enc
l'bz;enc
l'bz; enc
= in; enc
7.5.2
case
casez treats all z values in the case alternatives or the case expression as
don't cares. All bit positions with z can also represented by ? in that
position.
casex treats all X and
don't cares.
7=
The use of casex and casez allows comparison of only non-x or -z positions in
the case expression and the case alternatives. Example 7-16 illustrates the
decoding of state bits in a finite state machine using a casex statement. The use of
casez is similar. Only one bit is considered to determine the next state and the
other bits are ignored.
Example 7-16
casex Use
7.6 Loops
There are four types of looping statements in Verilog: while, for, repeat, and forever.
The syntax of these loops is very similar to the syntax of loops in the C
programming language. All looping statements can appear only inside an
initial or always block. Loops may contain delay expressions.
7.6.1
While Loop
The keyword while is used to specify this loop. The while loop executes until the
while-expression becomes false. If the loop is entered when the while-expression is
false, the loop is not executed at all. Each expression can contain the operators in
Table 6-1 on page 92. Any logical expression can be specified with these
operators. If multiple statements are to be executed in the loop, they must be
grouped typically using keywords begin and end. Example 7-17 illustrates the
use of the while loop.
Behavioral Modeling
135
=7
Example 7-17
While Loop
0;
136
7.6.2
For Loop
The keyword for is used to specify this loop. The for loop contains three parts:
An initial condition
A check to see if the terminating condition is true
A procedural assignment to change value of the control variable
The counter described in Example 7-17 can be coded as a for loop (Example 718). The initialization condition and the incrementing procedural assignment are
included in the for loop and do not need to be specified separately. Thus, the for
loop provides a more compact loop structure than the while loop. Note, however,
that the while loop is more general purpose than the for loop. The for loop
cannot be used in place of the while loop in all situations. p
Example 7-18
For Loop
integer count;
initial
for
for loops can also be used to initialize an array or memory, as shown below.
for loops are generally used when there is a fixed beginning and end to the loop.
If the loop is simply looping on a certain condition, it is better to use the while
Ioop.
Behaz~ioralModeling
7.6.3
Repeat Loop
The keyword repeat is used for this loop. The repeat construct executes the loop
a fixed number of times. A repeat construct cannot be used to loop on a general
logical expression. A while loop is used for that purpose. A repeat construct
must contain a number, which can be a constant, a variable or a signal value.
However, if the number is a variable or signal value, it is evaluated only when the
loop starts and not during the loop execution.
The counter in Example 7-17 can be expressed with the repeat loop, as shown in
Illustration 1 in Example 7-19. Illustration 2 shows how to model a data buffer that
latches data at the positive edge of clock for the next eight cycles after it receives
a data start signal.
Example 7-19
Repeat Loop
138
to 127
7=
Example 7-19
Ilcycies
begin
@(posedge clock) buffer[i]
i
end
end
end
=i
data;
endmodule
7.6.4
Forever loop
The keyword forever is used to express this loop. The loop does not contain any
expression and executes forever until the $finish task is encountered. The loop is
equivalent to a while loop with an expression that always evaluates to true, e.g.,
while (1). A forever loop can be exited by use of the disable statement.
A forever loop is typically used in conjunction with timing control constructs. If
timing control constructs are not used, the Verilog simulator would execute this
statement infinitely without advancing simulation time and the rest of the design
would never be executed. Example 7-20 explains the use of the forever
statement.
Example 7-20
Forever Loop
end
Behavioral Modeling
139
Example 7-20
Forever Loop
X =
y;
7.7.1
Block Types
There are two types of blocks: sequential blocks and parallel blocks.
Sequential blocks
The keywords begin and end are used to group statements into sequential blocks.
Sequential blocks have the following characteristics:
The statements in a sequential block are processed in the order they are
specified. A statement is executed only after its preceding statement
completes execution (except for nonblocking assignments with intraassignment timing control).
If delay or event control is specified, it is relative to the simulation time
when the previous statement in the block completed execution.
We have used numerous examples of sequential blocks in this book. Two more
examples of sequential blocks are given in Example 7-21. Statements in the
sequential block execute in order. In illustration 1, the final values are X = 0, y= 1,
z = 1, W = 2 at simulation time 0. In illustration 2, the final values are the same
except that the simulation time is 35 at the end of the block.
Example 7-21
Sequential Blocks
end
//Illustration 2: Sequential blocks with delay.
re9 X, Y;
reg [1:0] z , W;
initial
begin
= l'bO; //completes at simulation time 0
#5 y = l'bl; //completes at simulation time 5
#l0 z = {X, y}; //completes at simulation time 15
#20 W = {y, X ) ; //completes at simulation time 35
end
Parallel blocks
Parallel blocks, specified by keywords fork and join, provide interesting
simulation features. Parallel blocks have the following characteristics.
Statements in a parallel block are executed concurrently.
Ordering of statements is controlled by the delay or event control assigned
to each statement.
If delay or event control is specified, it is relative to the time the block was
entered.
Notice the fundamental difference between sequential and parallel blocks. All
statements in a parallel block start at the time when the block was entered. Thus,
the order in which the statements are written in the block is not important.
Behavioral Modeling
=7
Let us consider the sequential block with delay in Example 7-21 and convert it to
a parallel block. The converted Verilog code is shown in Example 7-22. The result
of simulation remains the same except that all statements start in parallel at time O.
Hence, the block finishes at time 20 instead of time 35.
Example 7-22
Parallel Blocks
142
l'bO;
l'b1;
7=
z = {x,
w
{y,
I join
y};
x};
The keyword fork can be viewed as splitting a single flow into independent
flows. The keyword join can be seen as joining the independent flows back into
a single flow. Independent flows operate concurrently.
7.7.2
We discuss three special features available with block statements: nested blocks,
named blocks, and disabling of named blocks.
Nested blocks
Blocks can be nested. Sequential and parallel blocks can be mixed, as shown in
Example 7-23.
Example 7-23
Nested Blocks
/ !Nested blocks
initial
begin
x = 1 'bO;
fork
#5 Y = l'b1;
#10 z = {x, y};
join
{y, x};
#20 w
end
Named blocks
Blocks can be given names.
Local variables can be declared for the named block.
Named blocks are a part of the design hierarchy. Variables in a named block
can be accessed by using hierarchical name referencing.
Named blocks can be disabled, i.e., their execution can be stopped.
Behavioral Modeling
143
=7
Example 7-24 shows naming of blocks and hierarchical naming of blocks.
Example 7-24
Named Blocks
IINamed blocks
module top;
initial
begin: blockl Iisequential block named block1
integer i; Ilinteger i is static and local to block1
II can be accessed by hierarchical name, top.block1.i
end
initial
fork: block2 Ilparallel block named block2
reg i; II register i is static and local to block2
II can be accessed by hierarchical name, top.block2.i
join
144
7=
Example 7-25
initial
begin
flag = 16'b 0010_0000_0000_0000;
i = 0;
begin: block1 liThe main block inside while is named block1
while (i < 16)
begin
if (flag[i])
begin
$display( "Encountered a TRUE bit at element number %d", i);
disable block1; Iidisable block1 because you found true bit.
end
i = i + 1;
end
end
end
7.8 Examples
In order to illustrate the use of behavioral constructs discussed earlier in this
chapter, we consider three examples in this section. The first two, 4-to-l
multiplexer and 4-bit counter are taken from Section 6.5, Examples. Earlier, these
circuits were designed by using dataflow statements. We will model these circuits
with behavioral statements. The third example is a new example. We will design
a traffic signal controller, using behavioral constructs, and simulate it.
7.S.1
4-to-1 Multiplexer
We can define a 4-to-l multiplexer with the behavioral case statement. This
multiplexer was defined, in Section 6.5.1, 4-to-l Multiplexer, by dataflow
statements. It is described in Example 7-26 by behavioral constructs. The
behavioral multiplexer can be substituted for the dataflow multiplexer; the
simulation results will be identical.
Example 7-26
Behavioral Modeling
145
=7
Example 7-26
7.8.2
4-bit Counter
In Section 6.5.3, Ripple Counter, we designed a 4-bit ripple carry counter. We will
now design the 4-bit counter by using behavioral statements. At dataflow or gate
level, the counter might be designed in hardware as ripple carry, synchronous
counter, etc. But, at a behavioral level, we work at a very high level of abstraction
and do not care about the underlying hardware implementation. We will only
design functionality. The counter can be designed by using behavioral constructs,
as shown in Example 7-27. Notice how concise the behavioral counter description
is compared to its dataflow counterpart. If we substitute the counter in place of
the dataflow counter, the simulation results will be exactly same, assuming that
there are no x and z values on the inputs.
146
7=
Example 7-27
or negedge clock)
endmodule
7.8.3
This example is fresh and has not been discussed before in the book. We will
design a traffic signal controller, using a finite state machine approach.
Specification
Consider a controller for traffic at the intersection of a main highway and a
country road.
________~I ] ~I________
Main Highway
Ifl
o
Behavioral Modeling
147
The traffic signal for the main highway gets highest priority because cars are
continuously present on the main highway. Thus, the main highway signal
remains green by default.
Occasionally, cars from the country road arrive at the traffic signal. The
traffic signal for the country road must turn green only long enough to let
the cars on the country road go.
As soon as there are no cars on the country road, the country road traffic
signal turns yellow and then red and the traffic signal on the main highway
turns green again.
There is a sensor to detect cars waiting on the country road. The sensor
sends a signal X as input to the controller. X = 1 if there are cars on the
country road; otherwise, X= 0 .
There are delays on transitions from S1 to 52, from S2 to S3, and from S4 to
SO. The delays must be controllable.
The state machine diagram and the state definitions for the traffic signal
controller are shown in Figure 7-1.
State
SO
S1
S2
S3
S4
Signals
Hwy = G Cntry = R
Hwy = Y Cntry = R
Hwy = R Cntry = R
Hwy=RCntry=G
Hwy=RCntry=Y
Figure 7-1
148
7=
Verilog description
The traffic signal controller module can be designed with behavioral Verilog
constructs, as shown in Example 7-28.
Example 7-28
'define
'define
'define
'define
'define
TRUE l'b1
FALSE l'bO
RED
2'dO
YELLOW 2'd1
GREEN 2'd2
HWY
I I GREEN
I I YELLOW
IIRED
IIRED
IIRED
IIState definition
'define
'define
'define
'define
'define
so
Sl
S2
S3
S4
3' dO
3 'd1
3 'd2
3' d3
3 'd4
eNTRY
RED
RED
RED
GREEN
YELLOW
IIDe1ays
'define Y2RDELAY
'define R2GDELAY
module sig_control
(hwy, cntry, X, clock, clear);
111/0 ports
output [1:0] hwy, cntry;
112-bit output for 3 states of signal
IIGREEN, YELLOW, RED;
reg [1:0] hwy, cntry;
Iideclared output signals are registers
input X;
Behavioral Modeling
149
Example 7-28
initial
begin
state = 'SO;
next_state = 'SO;
hwy = 'GREEN;
cntry = 'RED;
end
//state changes only at positive edge of clock
always @(posedge clock)
state = next_state;
//Compute values of main signal and country signal
always @(state)
begin
case(state)
'SO: begin
hwy
'GREEN;
cntry = 'RED;
end
'Sl: begin
'YELLOW;
hwy
cntry = 'RED;
end
'S2: begin
hwy
'RED;
cntry = 'RED;
end
'S3: begin
hwy
'RED;
cntry = 'GREEN;
end
'S4: begin
hwy
'RED;
cntry = 'YELLOW;
end
endcase
end
//State machine using case statements
always @(state or clear or X)
begin
i f (clear)
150
7=
Example 7-28
next_state = 'SO;
else
case (state)
'SO: if( X)
next_state
'Sl;
else
next_state
'SO;
'Sl: begin //delay some positive edges of clock
repeat('Y2RDELAY) @(posedge clock) ;
next_state = 'S2;
end
'S2: begin //delay some positive edges of clock
repeat ('R2GDELAY) @(posedge clock)
next_state = '83;
end
'S3: if( X)
next_state
'S3;
else
next_state
'S4;
'S4: begin //delay some positive edges of clock
repeat ('Y2RDELAY) @(posedge clock) ;
next_state = 'SO;
end
default: next_state = 'SO;
endcase
end
endmodule
Stimulus
Stimulus can be applied to check if the traffic signal transitions correctly when
cars arrive on the country road. The stimulus file in Example 7-29 instantiates the
traffic signal controller and checks all possible states of the controller.
Example 7-29
//Stimulus Module
module stimulus;
wire [l:0J MAIN_SIG, CNTRY_8IG;
reg CAR_ON_CNTRY_RD;
Behavioral Modeling
151
=7
Example 7-29
IISet up monitor
initial
$monitor ($time, "Main Sig = %b Country Sig = %b Car_on_cntry = %b",
MAIN_SIG, CNTRY_SIG, CAR_ON_CNTRY_RD);
IISet up clock
initial
begin
CLOCK
'FALSE;
forever #5 CLOCK
end
-CLOCK;
'FALSE;
#200 CAR_ON_CNTRY_RD
#100 CAR_ON_CNTRY_RD
'TRUE;
'FALSE;
#200 CAR_ON_CNTRY_RD
#100 CAR_ON_CNTRY_RD
'TRUE;
'FALSE;
#200 CAR_ON_CNTRY_RD
#100 CAR_ON_CNTRY_RD
'TRUE;
'FALSE;
#100 $stop;
152
Example 7-29
end
endmodule
Note that we designed only the behavior of the controller without worrying
about how it will be implemented in hardware.
7.9 Summary
We discussed digital circuit design with behavioral Verilog constructs.
A behavioral description expresses a digital circuit in terms of the
algorithms it implements. A behavioral description does not necessarily
include the hardware implementation details. Behavioral modeling is used
in the initial stages of a design process to evaluate various design-related
trade-offs. Behavioral modeling is similar to C programming in many ways.
Structured procedures initial and always form the basis of behavioral
modeling. All other behavioral statements can appear only inside initial
or always blocks. An initial block executes once; an always block executes
continuously until simulation ends.
Procedural assignments are used in behavioral modeling to assign values to
register variables. Blocking assignments must complete before the succeeding
statement can execute. Nonblocking assignments schedule assignments to be
executed and continue processing to the succeeding statement.
Behavioral Modeling
Sequential and parallel are two types of blocks. Sequential blocks are specified
by keywords begin and end . Parallel blocks are expressed by keywords
fork and join.Blocks can be nested and named. If a block is named, the
execution of the block can be disabled from anywhere in the design. Named
blocks can be referenced by hierarchical names.
7.10 Exercises
1. Declare a register called oscillate. Initialize it to 0 and make it toggle every 30
time units. Do not use always statement (Hint: Use the forever loop).
2. Design a clock with time period = 40 and a duty cycle of 25% by using the
always and initial statements. The value of clock at time = 0 should be
initialized to 0.
3. Given below is an initial block with blocking procedural assignments. At
what simulation time is each statement executed? What are the intermediate
and final values of a, b, c, d?
initial
begin
a = l'bO;
b = #l0 l'bl;
c = #5 l'b0;
d = #20 {a, b, cl;
end
154
7=
6. What is the final value of d in the following example. (Hint: See intraassignment delays).
initial
begin
b = l'bl; c = l'bO;
#10 b = l'bO;
initial
begin
d
#25
(b
c);
end
Select Signal
3'bOOO
3'bOOl
3'bOlO
3'bOll
3'blOO
3'b101
3'bllO
3'bll1
Function
out = a
out = a + b
out = a - b
out = a / b
out = a % b (remainder)
out = a 1
out = a 1
out = (a> b) (magnitude compare)
Behavioral Modeling
155
=7
13. Using a while loop, design a clock generator. Initial value of clock is O. Time
period for the clock is 10.
14. Using the for loop, initialize locations 0 to 1023 of a 4-bit register array
cache_var to O.
15. Using a forever statement, design a clock with time period = 10 and duty
cycle = 40%. Initial value of clock is O.
16. Using the repeat loop, delay the statement a = a + 1 by 20 positive edges of
clock.
17. Below is a block with nested sequential and parallel blocks. When does the
block finish and what is the order of execution of events? At what
simulation times does each statement finish execution?
initial
begin
x = 1 'bO;
#5 y
l'b1;
fork
#20 a
#15 b
join
#40 x
l'b1;
fork
#10 p
begin
x;
y;
x;
#10 a
#30 b
end
#5 m
y;
x;
y;
join
end
18. Design an 8-bit counter by using a forever loop, named block, and disabling of
named block. The counter starts counting at count = 5 and finishes at count =
67. The count is incremented at positive edge of clock. The clock has a time
period of 10. The counter counts through the loop only once and then is
disabled. (Hint: Use the disable statement).
156