Title: ECE 426 VLSI System Design
1ECE 426 - VLSI System Design
- Lecture 2 - Verilog Review
- January 29, 2003
Prof. John NestorECE DepartmentLafayette
CollegeEaston, Pennsylvania 18042nestorj_at_lafayet
te.edu
2Where we are...
- Today
- Verilog Review
- Verilog, Event-Driven Simulation, and Delays
3Announcements
- Class in AEC 400 until further notice
- TA Position Available in ECE 323 Lab- See Dr.
Rich - Reading
- Wolf 8.1-8.3
- Breaking news
- Smaller chip companies combine efforts on new
processes - EE Times 1/13 AMD, IBM to collaborate on 65nm,
45nm - EE Times 1/20 Motorola, Philips
STMicroelectronics collaborating on 90nm 65nm
development - Intel continues to go it alone (EE Times 1/20)
4Major Topics this Semester
- Advanced Verilog
- Verilog Review
- Event-Driven Simulation
- Delays
- Coding Styles for Synthesis and Large Designs
- Behavioral Modeling
- Testbenches and Verification
- More about Chip Design
- Group Design Project Simplified Ethernet Design
and Verification (WimpNet 03)
5Review - ASIC Design Flow
6Verilog Review
- Basic Module Syntax
- Combinational Logic
- Parameters
- Module Instantiation
- Sequential Logic
- Finite State Machines
7Verilog Background
- Designed as a language for event-driven
simulation - Synthesis added as an afterthought
- Only a subset can be synthesized
- Synthesis tools try to match simulation behavior
- So far, weve focused on the synthesis subset
- Structural Descriptions - module instantiations
- Behavioral Descriptions
- assign - continuous assignments
- always blocks
8Verilog module construct
- Key building block of language
- declaration - specifies a module interface
- Input output ports connections to outside world
- black box model - no details about internals
- body - specifies contents of "black box"
- behavior - what it does
- structure - how it's built from other "black
boxes"
9Verilog Module Declaration
- Describes the external interface of a single
module - Name
- Ports - inputs and outputs
- General Syntax
- module modulename ( port1, port2, ... )
- port1 direction declaration
- port2 direction declaration
- reg declarations
- wire declarations
- module body - parallel statements
- endmodule // note no semicolon () here!
10Verilog Body Declaration - Parallel Statements
- Parallel statements describe concurrent behavior
(i.e., statements which execute in parallel) - Types of Parallel Statements
- assign - used to specify simple combinational
logic - always - used to specify repeating behavior for
combinational or sequential logic - initial - used to specify startup behavior (not
supported in synthesis - but useful in
simulation!) - module instantiation - used for structure
- and other features useful only in simulation
11Verilog Data Types
- nets - describe wire connections
- general purpose wire
- special purpose supply0, supply1, tri0,
tri1, triand, trior, trireg, wand, wor - registers - variables (assigned values by
procedural statement) - reg - basic binary values
- integer - binary word (32 bits - machine
dependent) - real - floating point (not supported by
synthesis) - time - simulation time (not supported in
synthesis) - realtime - simulation time (not supported in
synthesis)
12Verilog Logic Values
- Each wire or register type can take on 4 values
- 0 - Standard binary FALSE
- 1 - Standard binary TRUE
- X - UNKNOWN
- Z - High Impedance
- During simulation, all variables originally X
- Complication x z sometimes used as wildcards
(e.g. casex, casez)
13More about Data Types
- Vectors - Multiple-Bit Signals (net or register)
- wire 310 sum
- reg 70 avg
- Arrays - used for memories
- reg 70 memory 0255
- Strings - vector sized to hold ASCII constant
- a string
14Data Types and Module Ports
- Input ports must always be a wire (net)
- Output ports can be wire or reg
wire
reg
wire
wire
wire
wire
15Comb. Modeling with assign
- Used for simple logic functions
- module fulladder(a, b, cin, sum, cout)
- input a, b, cin
- output sum, cout
- assign sum a b cin
- assign cout a b a cin b cin
- endmodule
16Combinational Modeling with always
- Motivation
- assign statements are fine for simple functions
- More complex functions require procedural
modeling - Basic syntax
- always (sensitivity-list)
- statement
- or
- always (sensitivity-list)
- begin
- statement-sequence
- end
17Combinational Modeling with always
- Example 4-input mux behavioral model
- module mux4(d0, d1, d2, d3, s, y)
- input d0, d1, d2, d3
- input 10 s
- output y
- reg y
- always _at_(d0 or d1 or d2 or d3 or s)
- case (s)
- 2'd0 y d0
- 2'd1 y d1
- 2'd2 y d2
- 2'd3 y d3
- default y 1'bx
- endcase
- Endmodule
18Review Questions
- What are these pitfalls?
- Latch Inference
- Missing inputs on sensitivity list
19Modeling with Hierarchy
- Create instances of submodules
- Example Create a 4-input Mux using mux2 module
- Original mux2 module
- module mux2(d0, d1, s, y)
- input 30 d0, d1
- input s
- output 30 y
- assign y s ? d1 d0
- endmodule
20Modeling with Hierarchy
- Create instances of submodules
- Example Create a 4-input Mux using mux2 module
- module mux4(d0, d1, d2, d3, s, y)
- input 30 d0, d1, d2, d3
- input 10 s
- output 30 y
- wire 30 low, high
- mux2 lowmux(d0, d1, s0, low)
- mux2 highmux(d2, d3, s0, high)
- mux2 finalmux(low, high, s1, y)
- endmodule
21Parameterized Modules
- Parameters - define values that can change
- Declaration
- module mod1(in1, in2, out1, out2)
- parameter Ndefault-value
- input N-1 0 in1, in2
- output N-1 0 out1
-
- endmodule
- Instantiation
- wire 70 w, x, y
- wire z
- mod1 (8) my_mod1(w,x,y,z)
22Parameterized Modules Example
- N-bit 2-1 multiplexer (parameterized bitwidth)
- module mux2( sel, a, b, y )
- parameter bitwidth32
- input sel
- input bitwidth-10 a, b
- output bitwidth-10 y
- assign y sel ? b a
- endmodule
- Instantiations
- mux2 (16) my16bit_mux(s, a ,b, c)
- mux2 (5) my5bit_mux(s, d, e, f)
- mux2 (32) my32bit_mux(s, g, h, i)
- mux2 myDefault32bit_mux(s, j, k, l)
23Symbolic Constants with Parameters
- Idea use parameter to name special constants
- parameter RED_ALERT 2b11
- parameter YELLOW_ALERT 2b01
- parameter GREEN_ALERT 2b00
- Dont change in module instances
- Do this to make your code more understandable
- For others reading your code
- For yourself reading your code after some time
has passed
24Sequential Design in Verilog - Basic Constructs
- Describe edge-triggered behavior using
- always block withedge event
- always _at_(posedge clock-signal)
- always _at_(negedge clock-signal)
- Nonblocking assignments (lt)
- _at_always(posedge clock-signal)
- begin
- output1 lt expression1
- . . .
- output2 lt expression2
- . . .
- end
25Combining Sequential and Combinational Outputs
- General circuit - both registered and comb.
outputs - Approach multiple always blocks or assign
statements
26Example Adding carry to 4-bit Counter
- module counter(clk, Q, carry)
- input clk
- output 30 Q
- output carry
- reg 30 Q // a signal that is assigned a
value - assign carry (Q 4'b1111)
- always _at_( posedge clk )
- begin
- Q lt Q 1
- end
- endmodule
27Review Question What Happens Here?
- module counter(clk, Q, carry)
- input clk
- output 30 Q
- output carry
- reg 30 Q // a signal that is assigned a
value - reg carry
- always _at_( posedge clk )
- begin
- carry lt (Q 4'b1111)
- Q lt Q 1
- end
- endmodule
28State Machine Design
- Traditional Approach
- Create State Diagram
- Create State Transition Table
- Assign State Codes
- Write Excitation Equations Minimize
- HDL-Based State Machine Design
- Create State Diagram (optional)
- Write HDL description of state machine
- Synthesize
29Coding FSMs in Verilog - Explicit Style
- Clocked always block - state register
- Combinational always block -
- next state logic
- output logic
30Coding FSMs in Verilog - Code Skeleton
- Part 1 - Declarations
- module fsm(inputs, outputs)
- input . . .
- input . . .
- reg . . .
- parameter NBITS-10
- S0 2'b00
- S1 2'b01
- S2 2b'10
- S3 2b'11
- reg NBITS-1 0 CURRENT_STATE
- reg NBITS-1 0 NEXT_STATE
-
31Coding FSMs in Verilog - Code Skeleton
- Part 2 - State Register, Logic Specification
-
- always _at_(posedge clk)
- begin
- CURRENT_STATE lt NEXT_STATE
- end
- always _at_(CURRENT_STATE or xin)
- begin
- case (CURRENT_STATE)
- S0 . . . determine NEXT_STATE, outputs
- S1 . . . determine NEXT_STATE, outputs
- end case
- end // always
- endmodule
32Verilog and Event-Driven Simulation
- Key idea model circuit operation as sequence of
events that take place at specific times - Input events - when input changes
- Output events - response to input events (only
generated when output changes)
33Event-Driven Simulation
- Example Modeling and AND Gate
- Input events changes on A, B input net
- Output events changes on C output net after
delay
A
delay12
A
B
C
B
C
34Event-Driven Simulation
- Output events from AND input events for OR
- Simulation time jumps from event to event
A
delay3
B
A
D
delay4
C
B
E
C
D
E
35Notes about Event-Driven Simulation
- Why use event-driven simulation? Because it's
fast - Only model when signals change
- Loss of accuracy assumes ideal logical behavior
- What are the alternatives?
- Circuit simulation (e.g. PSpice)
- Numerical model of continuous behavior
- More accurate, but slower
- Cycle-Level Compiled code simulation
- Model behavior in each clock cycle
- Faster, but doesnt model dlay
36Event-Driven Simulation (cont'd)
- Processing Events - Data Structures
- Event - specifies
- time event will occur
- net where signal will change
- new value of net
- Event Queue - data structure that sorts events by
time - front of queue - earliest event
- back of queue - latest event
- also called a timing wheel
37Event-Driven Simulation - Algorithm
- Processing Events - Simulation Algorithm
- initialization set all nets regs to x
- while (event queue not empty)
current_event "earliest" event in queue
current_time current_event.time
current_event.net.value current_event.value
for (each module input connected to net)
evaluate(module) if output of module
changes create new event to represent
output change add new event to queue
38Verilog Simulation Model
- assign statement
- executes when event changes any input
- produces output event when output values changes
- always block
- executes when event changes variable in
sensitivity list - produces output events when outputs change
39Coming Up
- Delay Modeling in Verilog
- Other Verilog Features
- tasks functions
- system tasks
- Verilog coding styles
- Behavioral Modeling
- Testbenches and Verification
40Outline - Introduction to Verilog
- Goals of HDL-Based Design
- Verilog Background
- A First Example
- Module and Port Declarations
- Modeling with Continuous Assignments
- Some Language Details
- Modeling with Hierarchy
- Modeling with always blocks (combinational logic)
- Demonstration Using Verilogger
- Discuss Project 1
- Summary
41HDL Overview
- What is an HDL? A language for
- simulation - event driven model of execution
- synthesis - generates designs that match
simulated behavior for a subset of the language - Common HDLs
- Verilog HDL
- VHDL - VHSIC (Very High-Speed IC) HDL
- SystemC - C with class libraries to support
System-Level Design and Hardware Design
42Verilog Simulators
- On Windows Machines Synapticad Verilogger
(formerly veriwell) - Available on PCs in DSP Electronics Labs
- OR download from class website
- OR borrow CD
- To run Programs-gtSynapticad/Verilogger Pro
- On the Sun Workstation Synopsys vcs / virsim
- vcs -RI
- On Windows NT Machines Cadence Verilog
- Installed, but havent used yet
43Verilog module construct
- Key building block of language
- declaration - specifies a module interface
- Input output ports connections to outside world
- black box model - no details about internals
- body - specifies contents of "black box"
- behavior - what it does
- structure - how it's built from other "black
boxes"
44A First Example
- Full Adder
- module fulladder(a, b, cin, sum, cout)
- input a, b, cin
- output sum, cout
- assign sum a b cin
- assign cout a b a cin b cin
- endmodule
45Comments about the First Example
- Verilog describes a circuit as a set of modules
- Each module has input and output ports
- Single bit
- Multiple bit - array syntax
- Each port can take on a digital value (0, 1, X,
Z)during simulation - Three main ways to specify module internals
- Continuous assignment statements - assign
- Concurrent statements - always
- Submodule instantiation (hierarchy)
46Bitwise Operators
- Basic bitwise operators identical to C/C/Java
- module inv(a, y)
- input 30 a
- output 30 y
- assign y a
- endmodule
47Reduction Operators
- Apply a single logic function to multiple-bit
inputs - module and8(a, y)
- input 70 a
- output y
- assign y a
- endmodule
48Conditional Operators
- Like C/C/Java Conditional Operator
- module mux2(d0, d1, s, y)
- input 30 d0, d1
- input s
- output 30 y
- assign y s ? d1 d0// if s1, yd1, else
yd0 - endmodule
49More Operators
- Equivalent to C/C/Java Operators
- Arithmetic - /
- Comparison ! lt lt gt gt
- Shifting ltlt gtgt
- Example
- module adder(a, b, y)
- input 310 a, b
- output 310 y
- assign y a b
- endmodule
- Small expressions can create big hardware!
50Bit Manipulation Concatenation
- is the concatenation operator
- module adder(a, b, y, cout)
- input 310 a, b
- output 310 y
- output cout
- assign cout,y a b
- endmodule
51Bit Manipulation Replication
- n pattern replicates a pattern n times
- module signextend(a, y)
- input 150 a
- output 310 y
- assign y 16a15, a150
- endmodule
52Internal Signals
- Declared using the wire keyword
- module fulladder(a, b, cin, s, cout)
- input a, b, cin
- output s, cout
- wire prop, gen
- assign prop a b
- assign gen a b
- assign s prop cin
- assign cout gen (cin prop)
- endmodule
53Some Language Details
- Syntax - See Quick Reference Card
- Major elements of language
- Lexical Elements (tokens and token
separators) - Data Types and Values
- Operators and Precedence
- Syntax of module declarations
54Verilog Lexical Elements
- Whitespace - ignored except as token separators
- blank spaces
- tabs
- newlines
- Comments
- Single-line comments //
- Multi-line comments / /
- Operators- unary, binary, ternary
- Unary a b
- Binary a b c
- Ternary a (b lt c) ? b c
55Verilog Numbers
- Sized numbers ltsizegt'ltbase formatgtltnumbergt
- ltsizegt - decimal number specifying number of bits
- ltbase formatgt - base of number
- decimal 'd or 'D
- hex 'h or 'H
- binary b or B
- ltnumbergt - consecutive digits
- normal digits 0, 1, , 9 (if appropriate for
base) - hex digits a, b, c, d, e, f
- x "unknown" digit
- z "high-impedance" digit
- Examples
- 4b1111 12h7af 16d255
56Verilog Numbers (cont'd)
- Unsized numbers
- Decimal numbers appearing as constants (236, 5,
15, etc.) - Bitwidth is simulator-dependent (usually 32 bits)
- Negative numbers
- sized numbers '-' before size -8'd127 -3'b111
- unsized numbers '-' before first digit -233
- As in VHDL, underline '_' can be used as a
"spacer - 12'b00010_1010_011 is same as
12'b000101010011
57Verilog Strings
- Anything in quotes is a string "This is a
string" "a / b" - Strings must be on a single line
- Treated as a sequence of 1-byte ASCII values
- Special characters - C-like (\)
58Verilog Identifiers
- Starting character alphabetic or '_'
- Following characters alpha, numeric, or '_'
- Examples george _paul
- "Escaped" identifiers
- start with backslash
- follow with any non-whitespace ASCII
- end with whitespace character
- Examples \212net \xyzzy \foo
- Special notes
- Identifiers are case sensitive
- Identifiers may not be reserved words
59Verilog Reserved Words
- always and assign begin buf bufif0 bufif1 case
- casex casez cmos deassign default defparam disabl
e edge - else end endcase endfunction endmodule
- endprimitive endspecify endtable endtask event for
- force forever fork function highz0 highz1 if ifnon
e - initial inout input integer join large macromodule
- medium module nand negedge nmos nor not
- notif0 notif or output parameter pmos
- posedge primitive pull0 pull1 pulldown pullup rcmo
s - real realtime reg release repeat rnmos rpmos rtran
- rtranif0 rtranif1 scalared small specify specparam
strong0 - strong1 supply0 supply1 table task time tran trani
f0 - tranif1 tri tri0 tri1 triand trior trireg vectored
- wait wand weak0 weak1 while wire wor xnor
- xor
60Verilog Data Types
- Nets - connections between modules
- input, output ports
- wires - internal signals
- Other types wand, wor, trior, trireg (ignore for
now) - Advanced Data Types (more later)
- Vectors - multiple bit wires, registers, etc.
- reg - Variables that are assigned values
- Arrays and Memories
- Parameters
61Operators and Precedence
- Override with parentheses () when needed
62Verilog Module Declaration
- Describes the external interface of a single
module - Name
- Ports - inputs and outputs
- General Syntax
- module modulename ( port1, port2, ... )
- port1 direction declaration
- port2 direction declaration
- reg declarations
- module body - parallel statements
- endmodule // note no semicolon () here!
63Verilog Body Declaration - Parallel Statements
- Parallel statements describe concurrent behavior
(i.e., statements which execute in parallel) - Types of Parallel Statements
- assign - used to specify simple combinational
logic - always - used to specify repeating behavior for
combinational or sequential logic - initial - used to specify startup behavior (not
supported in synthesis) - module instantiation - used for structure
- and other features well talk about later
64Combinational Modeling with always
- Motivation
- assign statements are fine for simple functions
- More complex functions require procedural
modeling - Basic syntax
- always (sensitivity-list)
- statement
- or
- always (sensitivity-list)
- begin
- statement-sequence
- end
65Combinational Modeling with always
- Example 4-input mux behavioral model
- module mux4(d0, d1, d2, d3, s, y)
- input d0, d1, d2, d3
- input 10 s
- output y
- reg y
- always _at_(d0 or d1 or d2 or d3 or s)
- case (s)
- 2'd0 y d0
- 2'd1 y d1
- 2'd2 y d2
- 2'd3 y d3
- default y 1'bx
- endcase
- endmodule
66Modeling with Hierarchy
- Create instances of submodules
- Example Create a 4-input Mux using mux2 module
- Original mux2 module
- module mux2(d0, d1, s, y)
- input 30 d0, d1
- input s
- output 30 y
- assign y s ? d1 d0
- endmodule
67Modeling with Hierarchy
- Create instances of submodules
- Example Create a 4-input Mux using mux2 module
- module mux4(d0, d1, d2, d3, s, y)
- input 30 d0, d1, d2, d3
- input 10 s
- output 30 y
- wire 30 low, high
- mux2 lowmux(d0, d1, s0, low)
- mux2 highmux(d2, d3, s0, high)
- mux2 finalmux(low, high, s1, y)
- endmodule
68Larger Hierarchy Example
- Use full adder to create an n-bit adder
- module add8(a, b, sum, cout)
- input 70 a, b
- output 70 sum
- output cout
- wire 70 c // used for carry connections
- assign c00
- fulladder f0(a0, b0, c0, sum0, c1)
- fulladder f1(a1, b1, c1, sum1, c2)
- fulladder f2(a2, b2, c2, sum2, c3)
- fulladder f3(a3, b3, c3, sum3, c4)
- fulladder f4(a4, b4, c4, sum4, c5)
- fulladder f5(a5, b5, c5, sum5, c6)
- fulladder f6(a6, b6, c6, sum6, c7)
- fulladder f7(a7, b7, c7, sum7, cout)
- endmodule
69Hierarchical Design with Gate Primitives
- Built-In standard logic gates
- and or not xor nand nor xnor
- Using Gate Primitives
- and g1(y, a, b, c, d)
- How are the different from operators (, , ,
etc.)? - Operators specify function
- Gate primitives specify structure
70Gate Primitives Example
- 2-1 Multiplexer
- module mux2s(d0, d1, s, y)
- wire sbar, y0, y1
- not inv1(sbar, s)
- and and1(y0, d0, sbar)
- and and2(y1, d1, s)
- or or1(y, y0, y1)
- endmodule
- Why shouldnt we use gate primitives?
- Requires low-level implementation decisions
- Its usually better to let synthesis tools make
these
71Lab 8 - Comb. Design with Verilog
- Prelab write out case statement by hand for
binary decoder - In the lab
- Type in and simulate binary decoder using
Verilogger - FTP to workstations synthesize using Synopsys
tools
72Demonstration Using Verilogger
- Starting Verilogger
- Start-gtProgram Files-gtSynapticad-gtVerilogger Pro
- Key Windows
- Project Manager
- HDL Editor Windows
- Timing Diagram Window
- Creating and Simulating a Verilog file
- Editor-gtNew HDL File
- Editor-gtSave HDL File As...
- Project-gtAdd File to Project
- Simulate-gtBuild (yellow button)
- Simulate-gtRun (green play button)
73Using Verilogger
- Create new project Project-gtNew Project
- Create HDL File(s) Editor-gtNew HDL File
- Run Simulator Simulate-gtRun
- Edit timing diagram to control input stimulus /
observe response - Timing diagram is represented as a separate
verilog file