02 Verilog
02 Verilog
1
This Unit: Digital Logic & Verilog
App App App • Transistors & fabrication
System software
• Digital logic basics
• Focus on useful components
Mem CPU I/O
• Hardware design methods
• Introduction to Verilog
2
Readings
• Digital logic
• P&H, Appendix C
• Manufacturing
• P&H, Section 1.7
3
Motivation: Implementing a Datapath
datapath
fetch
control
• Datapath: performs computation (registers, ALUs, etc.)
• ISA specific: can implement every insn (single-cycle: in one pass!)
• Control: determines which computation is performed
• Routes data through datapath (which regs, which ALU op)
• Fetch: get insn, translate opcode into control
• Fetch ® Decode ® Execute “cycle”
4
Two Types of Components
datapath
fetch
control
• Purely combinational: stateless computation
• ALUs, muxes, control
• Arbitrary Boolean functions
• Combinational+sequential: storage
• PC, insn/data memories, register file
• Internally contain some combinational components
5
Example LC4 Datapath
6
LC4 Datapath
+1
16
insn[2:0] 3
insn[11:9]
insn[11:9] 3
insn[8:6]
insn[11:9] 3 3’b111
3’b111
Memory
16 16 216 by 16
PC we wsel
16 bit
r1sel r2sel 16
16 Reg.
r1data
File
16
ALU
addr we wdata
16
out
r2data
Memory
216 by 16 bit
Reg.
File in
n/z/p
16 3 we
NZP Reg
3 Branch
NZP Reg Logic
16
7
Transistors & Fabrication
8
Intel
Pentium M
Wafer
9
Semiconductor Technology
gate gate
insulator
source drain source drain
Substrate channel
channel
• Basic technology element: MOSFET
• Solid-state component acts like electrical switch
• MOS: metal-oxide-semiconductor
• Conductor, insulator, semi-conductor
• FET: field-effect transistor
• Channel conducts source®drain only when voltage applied to gate
• Channel length: characteristic parameter (short ® fast)
• Aka “feature size” or “technology”
• Currently: “5 nanometers (nm)”
• Continued miniaturization (scaling) known as “Moore’s Law”
• Won’t last forever, physical limits approaching (or are they?)
10
Transistors and Wires
©IBM
From slides © Krste Asanović, MIT
11
Complementary MOS (CMOS)
• Voltages as values
• Power (VDD) = “1”, Ground = “0” power (1)
• Two kinds of MOSFETs p-transistor
• N-transistors
input output
• Conduct when gate voltage is 1
(“node”)
• Good at passing 0s
n-transistor
• P-transistors
• Conduct when gate voltage is 0
ground (0)
• Good at passing 1s
• CMOS
• Complementary n-/p- networks form boolean logic (i.e., gates)
• And some non-gate elements too (important example: RAMs)
12
Basic CMOS Logic Gate
• Inverter: NOT gate
• One p-transistor, one n-transistor
• Basic operation 0
• Input = 0 1
• P-transistor closed, n-transistor open
• Power charges output (1)
• Input = 1
• P-transistor open, n-transistor closed
• Output discharges to ground (0)
1 0
13
Another CMOS Gate Example
• What is this? Look at truth table A B
• 0, 0 ® 1
• 0, 1 ® 1 output
• 1, 0 ® 1 A
• 1, 1 ® 0
B
• Result: NAND (NOT AND)
• NAND is “universal”
B
output
A B
14
Digital Building Blocks: Logic Gates
• Logic gates: implement Boolean functions
• Basic gates: NOT, NAND, NOR
• Underlying CMOS transistors are naturally inverting ( = NOT)
NOT (Inverter) NAND NOR
A A
A A’ (AB)’ (A | B)’
B B
16
Boolean Functions and Truth Tables
• Any Boolean function can be represented as a truth table
• Truth table: point-wise input ® output mapping
• Function is disjunction of all rows in which “Out” is 1
A,B,C ® Out
0,0,0 ® 0
0,0,1 ® 0
0,1,0 ® 0
0,1,1 ® 0
1,0,0 ® 0
1,0,1 ® 1
1,1,0 ® 1
1,1,1 ® 1
17
Truth Tables and PLAs
• Implement Boolean function by implementing its truth table
• Takes two levels of logic
• Assumes inputs and inverses of inputs are available (usually are)
• First level: ANDs (product terms)
• Second level: ORs (sums of product terms)
18
PLA Example
• PLA with 3 inputs, 2 outputs, and 4 product terms
• Out0 = AB’C | ABC’ | ABC
A Permanent
B connections
C
Programmable
connections
(unconnected)
Out0
Out1
19
Boolean Algebra
• Boolean Algebra: rules for rewriting Boolean functions
• Useful for simplifying Boolean functions
• Simplifying = reducing gate count, reducing gate “levels”
• Rules: similar to logic (0/1 = F/T)
• Identity: A1 = A, A | 0 = A
• 0/1: A0 = 0, A | 1 = 1
• Inverses: (A’)’ = A
• Idempotency: AA = A, A | A = A
• Tautology: AA’ = 0, A | A’ = 1
• Commutativity: AB = BA, A | B = B | A
• Associativity: A(BC) = (AB)C, A | (B | C) = (A | B) | C
• Distributivity: A(B | C) = AB | AC, A | (BC) = (A | B)(A | C)
• DeMorgan’s: (AB)’ = A’ | B’, (A | B)’ = A’B’
20
Logic Minimization
• Logic minimization
• Iterative application of rules to reduce function to simplest form
• Design tools do this automatically
21
Non-Arbitrary Boolean Functions
• PLAs implement Boolean functions point-wise
• E.g., represent f(X) = X+5 as [0®5, 1®6, 2®7, 3®8, …]
• Mainly useful for “arbitrary” functions, no compact representation
22
Multiplexer (Mux)
• Multiplexer (mux): selects output from N inputs
• Example: 1-bit 4-to-1 mux
• Not shown: N-bit 4-to-1 mux = N 1-bit 4-to-1 muxes + 1 decoder
S (binary)
S (1-hot)
S (binary)
A
A
B
O
B O C
D
23
Adder
• Adder: adds/subtracts two binary integers in two’s
complement format
• Half adder: adds two 1-bit “integers”, no carry-in
• Full adder: adds three 1-bit “integers”, includes carry-in
• Ripple-carry adder: N chained full adders add 2 N-bit integers
• To subtract: negate B input, set bit 0 carry-in to 1
24
Full Adder
• What is the logic for a full adder?
• Look at truth table CI
CI A B ® C0 S
0 0 0 ® 0 0 S
0 0 1 ® 0 1 CI
A
0 1 0 ® 0 1 A S
0 1 1 ® 1 0 B FA
1 0 0 ® 0 1 B
1 0 1 ® 1 0 CO
1 1 0 ® 1 0
1 1 1 ® 1 1
CO
25
N-bit Adder/Subtracter
0
1
A0 S0
FA
B0
A1 S1 A
FA +/- S
B1 B
+/–
…
AN-1 SN-1
FA
BN-1
+/–
• More later when we cover arithmetic
26
FPGAs
27
Alternative to Fabrication: FPGA
• We’ll use FPGAs (Field Programmable Gate Array)
• Also called Programmable Logic Devices (PLDs)
• Uses
• Hardware prototyping (what we’re doing)
• Low-volume special-purpose hardware
• Network processing. FPGAs in AWS & Azure
28
FPGA
• A Field Programmable Gate Array contains a collection of configurable logic
elements and a programmable interconnect that can be set up to perform the
desired logical operations.
Configurable Logic Blocks (CLBs)
Programmable Interconnect
29
Configurable Logic Blocks
• Each of the configurable logic blocks (or logic cells) contains some lookup
tables and one or more flip-flops.
• By setting the entries in the lookup tables (LUTs) these units can be
programmed to implement arbitrary logical functions on their inputs.
• http://en.wikipedia.org/wiki/Field-programmable_gate_array
• ZedBoard has 85K logic cells
30
Configuring FPGAs
• By configuring the CLBs and the interconnect the FPGA can be
‘programmed’ to implement the desired operation.
Configurable Logic Blocks (CLBs)
AND
AND
XOR XOR
NAND
NAND
Programmable Interconnect
31
FPGA “Design Flow”
e ck
ch
netlist
HDL source (wires, implementation
synthesis bitstream
code gates, (place & route)
FFs)
sim
ula
tio
n
32
Simulation
• One way to test and debug designs
• Graphical output via waveforms
33
Hardware Design Methods
34
Hardware Design Methodologies
• Fabricating a chip requires a detailed layout
• All transistors & wires
• How does a hardware designer describe such design?
• (Bad) Option #1: draw all the masks “by hand”
• All 10 billion transistors? Umm…
• Option #2: use computer-aided design (CAD) tools to help
• Layout done by engineers with CAD tools or automatically
• Design levels – uses abstraction
• Transistor-level design – designer specifies transistors (not layout)
• Gate-level design – designer specifics gates, wires (not transistors)
• Higher-level design – designer uses higher-level building blocks
• Adders, memories, etc.
• Or logic in terms of and/or/not, and tools translates into gates
35
Describing Hardware
• Two general options
• Schematics
• Pictures of gates & wires
S
A
O
B
• Draw pictures
• Use a schematic entry program to draw wires, logic blocks, gates
• Support hierarchical design (arbitrary nesting)
+ Good match for hardware which is inherently spatial
– Time consuming, “non-scalable” (large designs are unreadable)
• Rarely used in practice (“real-world” designs are too big)
37
Hardware Description Languages (HDLs)
• Write “code” to describe hardware
• HDL vs. SDL
• Specify wires, gates, modules (also hierarchical)
+ Easier to create, edit, modify, scales well
– Misleading “sequential” representation: must still “think” spatially
(gets easier with practice)
S
4
module mux2to1_4(S, A, B, Out); A 4
input [3:0] A; 4 Out
input [3:0] B; B
input S;
output [3:0] Out;
39
Verilog HDL
• Verilog: HDL we will be using
• Syntactically similar to C (by design)
± Ease of syntax hides fact that this isn’t C (or any software lang)
• We will use a few lectures to learn Verilog
41
Hardware is not Software
• Just two different beasts
• Things that make sense in hardware, don’t in software, vice versa
• One of the main themes of this course
• Software is sequential
• Hardware is inherently parallel and “always on”
• Have to work to get hardware to not do things in parallel
• Software is digital
• Hardware has many analog properties
• Including analog correctness properties!
• Software is mostly about functionality
• Performance, power, area and functionality matter in hardware
• One reason that HDLs are not SDLs
42
HDL: Behavioral Constructs
• HDLs have low-level structural constructs
• Specify hardware structures directly
• Transistors, gates (and, not) and wires, hierarchy via modules
• Also have mid-level behavioral constructs
• Specify operations, not hardware to perform them
• Low-to-medium-level: &, ~, +, *
• Also higher-level behavioral constructs
• High-level: if-then-else, for loops
• Some of these are synthesizable (some are not)
• Tools try to guess what you want, often highly inefficient
– Higher-level ® more difficult to know what it will synthesize to!
• HDLs are both high- and low-level languages in one!
• And the boundary is not clear!
43
HDL: Simulation
• Another use of HDL: simulating & testing a hardware design
• Cheaper & faster turnaround (no need to fabricate)
• More visibility into design (“debugger” interface)
44
Side note: High-Level Synthesis
• Translate “C to gates”
• write hardware at a higher level of abstraction than
conventional HDLs
• greater programmer productivity
• need to write stylized C that will synthesize well
• tools are still slow
• take ESE 5320 & 5390 to learn much more
45
Verilog HDL
46
HDL History
• 1970s:
• First HDLs
• Late 1970s: VHDL
• VHDL = VHSIC HDL = Very High Speed Integrated Circuit HDL
• VHDL inspired by programming languages of the day (Ada)
• 1980s:
• Verilog first introduced
• Verilog inspired by the C programming language
• VHDL standardized
• 1990s:
• Verilog standardized (Verilog-1995 standard)
• 2000s:
• Continued evolution (Verilog-2001 standard)
• Both VHDL and Verilog are evolving, still in use today
47
Modern HDLs
• BlueSpec
• MIT startup from 2003
• more functional style, richer types
• inspired by Haskell
• Chisel
• from Berkeley in 2012
• embedded DSL in Scala
48
Verilog HDL
• Verilog is a (surprisingly) big language
• Structural constructs at both gate and transistor level
• Facilities for specifying memories
• Precise timing specification and simulation
• Lots of “behavioral” constructs
• C-style procedural variables, including arrays
• A pre-processor
• VPI: Verilog programming interface
• …
49
Our Verilog HDL
• We’re going to learn a focused subset of Verilog
• Focus on synthesizable constructs
• Focus on avoiding subtle synthesis errors
• Use as an educational tool
• For synthesis
• Structural constructs at gate-level only
• A few behavioral constructs
• Some testing and debugging features
50
Basic Verilog Syntax
• Have already seen basic syntax, looks like C
• C/C++/Java style comments
• Names are case sensitive, and can use _ (underscore)
• Avoid: clock, clk, power, pwr, ground, gnd, vdd, vcc, init, reset, rst
• Some of these are “special” and will silently cause errors
/* this is a module */
module mux2to1(input wire S,
input wire A,
input wire B,
output wire Out);
wire S_, AnS_, BnS;
// these are gates
not (S_, S);
and (AnS_, A, S_);
and (BnS, B, S);
or (Out, AnS_, BnS);
endmodule
51
(Gate-Level) Structural Verilog
• Primitive “data type”: wire
• Have to declare it
Structural
module mux2to1(input wire S,
input wire A, S
input wire B, A
output wire Out); Out
wire S_, AnS_, BnS;
not (S_, S); B
and (AnS_, A, S_);
and (BnS, B, S);
or (Out, AnS_, BnS);
endmodule
52
(Gate-Level) Structural Verilog
• Primitive “operators”: gates
• Specifically: and, or, xor, nand, nor, xnor, not, buf
• Can be multi-input: e.g., or (C, A, B, D) (C= A | B | D)
• “Operator” buf just repeats input signal (may amplify it)
Structural
module mux2to1(input wire S, S
input wire A,
input wire B, A
output wire Out); Out
wire S_, AnS_, BnS;
B
not (S_, S);
and (AnS_, A, S_);
and (BnS, B, S);
or (Out, AnS_, BnS);
endmodule
53
(Gate-Level) Behavioral Verilog
• Primitive “operators”: boolean operators
• Specifically: &, |, ^, ~
• Can be combined into expressions
• Can be mixed with structural Verilog
“Behavioral” (Synthesizable)
module mux2to1(input wire S, S
input wire A,
input wire B, A
output wire Out); Out
wire S_, AnS_, BnS;
B
assign S_ = ~S;
assign AnS_ = A & S_;
assign BnS = B & S;
assign Out = AnS_ | BnS;
endmodule
54
Wire Assignment
• Wire assignment:
• Connect combinational logic block or other wire to wire input
• Order of statements not important, executed totally in parallel
• When right-hand-side changes, it is re-evaluated and re-assigned
• Designated by the keyword assign
“Behavioral” (Synthesizable)
module mux2to1(input wire S, S
input wire A,
input wire B, A
output wire Out); Out
wire S_, AnS_, BnS;
B
assign S_ = ~S;
assign AnS_ = A & S_;
assign BnS = B & S;
assign Out = AnS_ | BnS;
endmodule
55
Wire Assignment
• Assignment can be combined with declaration
wire c = a | b;
“Behavioral” (Synthesizable)
S
module mux2to1(input wire S,
input wire A, A
input wire B, Out
output wire Out);
wire S_ = ~S; B
wire AnS_ = A & S_;
wire BnS = B & S;
assign Out = AnS_ | BnS;
endmodule
56
(Gate-Level) Behavioral Verilog
• Primitive “operators”: boolean operators
• Specifically: &, |, ^, ~
• Can be combined into expressions
• Can be mixed with structural Verilog
“Behavioral” (Synthesizable)
module mux2to1(input wire S, S
input wire A,
A
input wire B, Out
output wire Out);
assign Out = (~S & A) | (S & B); B
endmodule
57
Best Way to do a Mux
• Verilog supports ?: conditional assignment operator
• Much more useful (and common) in Verilog than in C/Java
“Behavioral” (Synthesizable)
module mux2to1(input wire S, S
input wire A,
A
input wire B, Out
output wire Out);
assign Out = S ? B : A; B
endmodule
58
Wires Are Not C-like Variables!
• Order of assignment doesn’t matter
• This works fine
module mux2to1(input wire S,
input wire A,
input wire B,
output wire Out);
assign Out = AnS_ | BnS;
assign BnS = B & S;
assign AnS_ = A & S_;
assign S_ = ~S;
endmodule
59
Wire Vectors
• Wire vectors: also called “arrays” or “buses”
wire [7:0] w1; // 8 bits, w1[7] is most significant bit
wire [0:7] w2; // 8 bits, w2[0] is most significant bit
• Example:
module mux2to1(input wire S,
input wire [7:0] A,
input wire [7:0] B, Unlike C, array range is
output wire [7:0] Out); part of type, not variable!
assign Out = S ? B : A;
endmodule
• Operations
• Bit select: vec[3]
• Range select: vec[3:2]
• Concatenate: assign vec = {w, x, y, z};
60
Wire and Wire Vector Constants
wire [3:0] w = 4’b0101;
• The “4” is the number of bits
• The “b” means “binary” - “h” for hex, “o” for octal, “d” for decimal
• The “0101” are the digits (in binary in this case)
wire [3:0] w = 4’d5; // same thing, effectively
• Here is a single wire constant
wire w = 1’b0;
61
Repeated Signals
• Concatenation
wire [2:0] vec = {x, y, z};
• Can also repeat a signal n times
wire [15:0] vec = {16{x}}; // 16 copies of x
• Example uses (what does this do?):
wire [7:0] out;
wire [3:0] A;
assign out = {{4{1’d0}}, A[3:0]};
• What about this?
assign out = {{4{A[3]}}, A[3:0]};
62
Gate-Level Vector Operators
• Verilog also supports behavioral vector operators
63
Signed types
• All wires are unsigned by default
• Verilog supports signed types as well
• changes the semantics of comparison operators < > <= >=
• permits use of >>> arithmetic shift operator
• useful for implementing CMP,SRA insns
• Vivado lets you intermix signed and unsigned types
• use signed sparingly to avoid confusion
wire signed [3:0] s; // signed wire
assign s = …;
wire out = (s > 1) ? 1’b0 : 1’b1 ;
wire [3:0] sra = s >>> amt[1:0];
// $signed() operator on an unsigned wire
wire [3:0] u;
wire out2 = ($signed(u) > 2) ? 1’b0 : 1’b1;
64
Why Use a High-Level Operator?
• Abstraction
• Why write assembly, when you can write C? (yay?)
65
Hierarchical Design using Modules
• Old-style interface specification
module mux2to1(Sel, A, B, Out);
input Sel, A, B;
output Out;
• Can also have inout: bidirectional wire (we will not use this)
• Recommended Alternative: Verilog 2001 interfaces
module mux2to1(input wire Sel, A, B, output Out);
A and B share same type as Sel. Convenient, but dangerous!
• Declarations
• Internal wires, i.e., “locals”
• Wires also called “nets” or “signals”
wire S_, AnS_, BnS;
• Implementation: primitive and module instantiations
and (AnS_, A, S_);
66
Verilog Module Example
module mux2to1(input wire Sel,
input wire A,
input wire B, S
output wire Out);
A
wire S_, AnS_, BnS; O
not (S_, Sel); B
and (AnS_, A, S_);
and (BnS, B, Sel);
or (Out, AnS_, BnS);
endmodule
68
Connections via Named Association
• ALWAYS specify module connections by name
• Like named parameters/keyword arguments in SDLs
• Helps keep the bugs away
• Bad example
mux2to1 mux0 (res, s, a, b);
• Good example
mux2to1 mux0 (.Sel(s), .A(a), .B(b), .Out(res));
• Also, order becomes irrelevant
mux2to1 mux1 (.A(a), .B(b), .Out(res), .Sel(s));
69
Generate construct
• basic metaprogramming to reduce repetition
• for loop must have a fixed bound
• think of this as “copy-and-paste”, not a SDL for loop
70
Per-Instance Module Parameters
• Module parameters: useful for defining varying bus widths
module Nbit_mux2to1 (input wire Sel,
input wire [N-1:0] A,
input wire [N-1:0] B,
output wire [N-1:0] Out);
parameter N = 1;
assign Out = Sel ? B : A;
endmodule
71
Per-Instance Module Parameters
• localparam: a parameter that is only visible within a
module
• a constant, scoped to that module
72
Getting Fancy: Generate and Parameters
module rca
#(parameter N = 4)
(input wire [N-1:0] a,
input wire [N-1:0] b,
output wire [N-1:0] s);
wire [N:0] carry;
assign carry[0] = 1'b0;
73
Wire Arrays
• Verilog supports multi-dimensional wire vectors
• Useful with generate loops when you need lots of buses
74
Verilog Pre-Processor
• Like the C pre-processor
• But uses ` (back-tick) instead of #
• Constants: `define
• No parameterized macros
• Use ` before expanding constant macro
`define letter_A 8’h41
wire w[7:0] = `letter_A;
• Conditional compilation: `ifdef, `endif
• File inclusion: `include
• Parameter vs `define
• A parameter is scoped to a module instance
• A `define is scoped to a file (potentially across modules)
• Can use parameters as constants
75
Verilog Errata
• Wires have binary values: 0 or 1
• except when they don’t: x and z are undefined values
• No particular naming convention for modules and their files
• Unlike, say, Java public classes
• No “imports” or “libraries”
• There are ways to do this, to integrate 3rd-party Intellectual
Property (IP) into your design. We won’t explore this.
76
Verilog testing constructs
• integer, reg types
• correspond to storage (unlike wire which is stateless)
• DO NOT use these outside of testing!
• we’ll see this later: reg will synthesize into a latch/FF
• delay statement
• #10; means “wait 10 cycles”
• for/while loops
• allow iterating over test inputs
• $display()
• printf-like output
• $display(“wire was %b", a);
• $finish
• ends the simulation
77
Sequential Logic
78
Two Types of Digital Circuits
• Combinational Logic
• Logic without state variables
• Examples: adders, multiplexers, decoders, encoders
• No clock involved
• Sequential Logic
• Logic with state variables
• State variables: latches, flip-flops, registers, memories
• Clocked
• State machines, multi-cycle arithmetic, processors
79
Sequential Logic & Synchronous Systems
Combinational Storage
Logic Element
Clock
• Processors are complex fine state machines (FSMs)
• Combinational (compute) blocks separated by storage elements
• State storage: memories, registers, etc.
• Synchronous systems
• Clock: global signal acts as write enable for all storage elements
• Typically marked as triangle
• All state elements write together, values move forward in lock-step
+ Simplifies design: design combinational blocks independently
• Aside: asynchronous systems
• Same thing, but … no clock
• Values move forward using explicit handshaking
± May have some advantages, but difficult to design
80
Datapath Storage Elements
datapath
fetch
control
81
S-R Latch
• S-R (set-reset) latch
• Cross-coupled NOR gates
R Q
• Distinct inputs/outputs
Q’
S,R ® Q S
0,0 ® oldQ
0,1 ® 0
1,0 ® 1 R Q
1,1 ® 0 SR
S
• S=0, R=0? circuit degenerates to cross-coupled INVs
• S=1, R=1? reset has “higher priority”
• Not really used … except as component in something else
82
D Latch
D
Q
D Q
DL
E
83
Timing Diagrams
• Voltage {0,1} diagrams for different nodes in system
• “Digitally stylized”: changes are vertical lines (instantaneous?)
• Reality is analog, changes are continuous and smooth
• Timing diagram for a D latch
84
Triggering: Level vs. Edge
E
Q
86
FFWE: FF with Separate Write Enable
• FFWE: FF with separate write enable
• FF D(ata) input is MUX of D and Q, WE selects
D Q Q
FF D FFWE
WE
WE
• Bad idea: why not just AND the CLK and WE?
+ Fewer gates
– Creates timing problems
§ Do not try to do logic on CLK in Verilog
§ No, really. Never do this.
87
N-bit Register
D0 Q0
FFWE
D1 Q1
n n
FFWE
D Q
DN-1 QN-1
FFWE
WE
88
Sequential Logic in Verilog
89
Designing Sequential Logic
• key design rule: separate combinational logic from
sequential state elements
• Not enforced by Verilog, but a very good idea
• Possible exceptions: counters, shift registers
• We’ll give you a flip-flop module (see next slide)
• Edge-triggered, not a transparent latch
• Parameterized to create an n-bit register
• Example use: state machine
Clock
State Combinational Output
Register Current Logic
State
Next State
90
Sequential Logic In Verilog
• How are state-holding variables specified in Verilog?
• First instinct: structurally
• After all, real latches and flip-flops are made from gates…
91
Verilog Flipflop (Behavioral Magic)
• How do we specify state-holding constructs in Verilog?
module dff (output wire out,
input wire in, input wire writeEnable,
input wire reset, input wire clock);
reg out;
always @(posedge clock)
begin • reg: storage bit
if (reset) • always @ (): synthesizable
out = 0; behavioral sequential Verilog
else if (writeEnable)• Tricky: hard to know exactly what
out = in; it will synthesize to
end • We will give this to you,
endmodule don’t write your own
• “Creativity is a poor substitute for
knowing what you’re doing”
92
Verilog Register (Behavioral Magic)
• How do we specify state-holding constructs in Verilog?
module register (output wire [n-1:0] out,
input wire [n-1:0] in, input wire writeEnable,
input wire reset, input wire clock);
parameter n = 1;
• Ramifications:
• Never do logic operations on the clocks
• If you want to add a “write enable” to a flip-flop:
• Use a mux to route the old value back into it
• (or use the flip-flop with write enable we give you!)
• Do not just “and” the write-enable signal with the clock!
94
What does <…> do in Verilog?
• https://www.edaplayground.com
• web-based Verilog editor+simulator
• recommended simulator: Icarus Verilog 0.10.0
• https://hdlbits.01xz.net/wiki/Main_Page
• online Verilog problem sets
95
Testbenches
• A more effective way to test & debug designs
• In Java?
• Write test code in Java to test Java
• “Test harness”, “unit testing”
• For Verilog?
• Write test code in Verilog to test Verilog
• Verilog has advanced “behavioral” commands to facilitate this:
• Delay for n units of time
• Full high-level constructs: if, while, sequential assignment, ints
• Input/output: file I/O, output to display, etc.
96
Common Errors
• Tools are from a less civilized time
• More like C, less like Java
• Assume that you mean what you say
• Common errors:
• Not assigning a wire a value
• Assigning a wire a value more than once
• Implicit wire declarations (default to type “wire” 1-bit wide)
• Mis-matched wire assignment widths
• Combinational loops
• Avoid names such as:
• clock, clk, power, pwr, ground, gnd, vdd, vcc, init, reset, rst
• Some of these are “special” and will silently cause errors
97
Official Vivado Verilog Reference
98
List of Verilog keywords
always endspecify medium rnmos vectored
and endtable module rpmos wait
assign endtask nand rtran wand
automatic event negedge rtranif0 weak0
begin for nmos rtranif1 weak1
buf force nor scalared while
bufif0 forever noshow-cancelled* show-cancelled* wire
bufif1 fork not signed wor
case function notif0 small xnor from Chapter 7 of
casex generate notif1 specify xor Vivado Design Suite
casez genvar or specpa User Guide: Synthesis
cell* highz0 output strong0 UG901 (v2017.4)
cmos highz1 parameter strong1
config* if pmos supply0
deassign ifnone posedge supply1
default incdir* primitive table
defparam include* pull0 task
design* initial pull1 time
disable inout pullup* tran
edge input pulldown* tranif0
else instance* pulsestyle_ondetect* tranif1
end integer pulsestyle_onevent* tri
endcase join rcmos tri0
endconfig* larger real tri1
endfunction liblist* realtime triand
endgenerate library* reg trior
endmodule localparam release trireg
99
endprimitive macromodule repeat use*
Additional Verilog Resources
• Elements of Logic Design Style by Shing Kong, 2001
• Do’s, do-not’s, other tips
• http://www.cis.upenn.edu/~milom/elements-of-logic-design-style/
100
Summary
App App App • Transistors & fabrication
System software
• Digital logic basics
• Focus on useful components
Mem CPU I/O
• Hardware design methods
• Introduction to Verilog
101