Verilog Tutorial I

Download Report

Transcript Verilog Tutorial I

ENEE 408C Lab
Capstone Project: Digital System Design
Verilog Tutorial
Class Web Site:
http://www.ece.umd.edu/class/enee408c
Modules and Primitives

Modules
The user-defined components
module fulladder (<port list>)
…
endmodule

Primitives
Pre-defined components
nand g(<port_list>)
•Have to specify inputs and
outputs
•Can have multiple outputs
•Module instantiation
fulladder f(<port_list);
•First port is output
•Have only one output
•Primitives instantiation
nand g(<port_list>);
Registers and Nets

reg
–
–
–
–

wire
–
–
–
–
–

stores 1 bit information by default
similar to C/C++ variables in syntax
used on both LHS and RHS in procedural assignment
cannot be used on LHS in continuous assignment
default width is 1 bit
establish connectivity between two components
driven by the components it connects to
used on LHS in continuous assignment
cannot be used on LHS in procedural assignment
integer
– a 32-bit reg
Port Declaration

input
– must be wire type

inout
– must be wire type

output
– can be reg or wire type

If not specified, all of aboves are by default
wire type.
Behavioral Description
VS.
Structural Description

Structural Description
–
–
–
–

a Verilog description of schematic
easy to synthesize
like gate-level netlist
less readable from human’s point of view.
Behavioral Description
–
–
–
–
a description of the functionality
flexible and more readable
suitable for large scale design
not always synthesizable
Structure Description


primitive instantiation (AND, NAND, OR,
NOR, XOR, XNOR, BUF, NOT, BUFIF,
NOTIF)
parameter value assignment
Structural Description Example
primitive
module weird_logic (a,b,c,d);
output a;
input b,c,d;
wire w;
nand g1(w,b,c);
nor g2(a,w,d);
endmodule
don’t forget
Behavioral Description 1

Boolean-Equation-Based Model
module weird_logic (a,b,c,d);
output a;
– continuous assignment
input b,c,d;
– level-sensitive
continuous
wire w;
assignment
assign w = ~(b & c); – normally used for
combinational circuits
assign a = ~(w | d);
endmodule
Behavioral Description 2

Cyclic Behavior Model
module weird_logic (a,b,c,d);
–
output a;
–
input b,c,d;
reg w,a;
always@(b or c)
–
w = ~(b & c);
always@(d or posedge w)
a = ~(w | d);
endmodule
always block
can be both level
and edge sensitive
do not expire after
the last statements
Behavioral Description 2

Cyclic Behavior Model
module weird_logic (a,b,c,d);
–
output a;
input b,c,d;
–
wire w;
always@(b or c)
–
w = ~(b & c);
always@(d or posedge w)
a = ~(w | d);
endmodule
always block
can be both level
and edge sensitive
do not expire after
the last statements
Using Testbench




By giving a set of combination of inputs to
test the timing and functionality of your
design.
Can be separate from your design.
Must match the interface of your design
Need not to be synthesizable.
With Stimulus






initial block
$monitor system task
$time system task
$display system task
delay statements and assignments discussion of simulator engine
$finish system task
Testbench Example
module tb_weird_logic;
wire A;
reg B, C, D;
weird_logic instance1(A, C, D, B);
initial
// two slashes introduce a single line comment
begin
$monitor ($time,,,
"A = %b B = %b C = %b D = %b", A, B, C, D);
//waveform for simulating the binaryToESeg driver
#10 B = 0; C = 0; D = 0;
#10 D = 1;
#10 C = 1; D = 0;
#10 $finish;
end
endmodule