0% found this document useful (0 votes)
21 views10 pages

Vlog Tutorial

Uploaded by

ballmer
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views10 pages

Vlog Tutorial

Uploaded by

ballmer
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 10

1

A Brief Intro to Verilog


Brought to you by: Sat Garcia
2
Meet your 141(L) TA
! Sat Garcia
"[email protected]
"2
nd
Year Ph.D. Student
"Office Hours: (Tentative)
! Place: EBU3b B225 (basement)
! Monday: 3-4pm
! Wednesday: 11am-Noon
! Please come to my office hours. I get lonely there
by myself!
2
3
What is Verilog?
! Verilog is:
"A hardware design language (HDL)
"Tool for specifying hardware circuits
"Syntactically, a lot like C or Java
"An alternative to VHDL (and more widely used)
"What you'll be using in 141L
"HELLA COOL!*
* If you are totally into hardware design languages
4
Verilog in the Design Process
Behavioral
Algorithm
Register
Transfer Level
Gate Level
Manual
Logic Synthesis
Auto Place + Route
Test
Results
Simulate
Test
Results
Simulate
Test
Results
Adapted from Arvind & Asanovics MIT 6.375 lecture
3
5
Ways To Use Verilog
! Structural Level
"Lower level
! Has all the details in it (which gates to use, etc)
"Is always synthesizable
! Functional Level
"Higher Level
! Easier to write
" Gate level, RTL level, high-level behavioral
" Not always synthesizable
! Well be sticking with functional mostly
6
Data Types in Verilog
! Basic type: bit vector
"Values: 0, 1, X (don't care), Z (high
impedence)
! Bit vectors expressed in multiple ways:
"binary: 4'b11_10 ( _ is just for readability)
"hex: 16'h034f
"decimal: 32'd270
"other formats but these are the most useful
4
7
Data types (continued)
! Connect things together with: wire
"Single wire:
! wire my_wire;
"Array of wires
! wire[7:0] my_wire;
! Why not wire[0:7]?
! For procedural assignments, we'll use reg
"Again, can either have a single reg or an array
! reg[3:0] accum; // 4 bit reg
"reg is not necessarily a hardware register
8
A simple example (comb. circuit)
! Let's design a 1 bit full adder
FA
b a
s
cin
cout
module FA( input a, b, cin,
output s, cout);
assign s = a ^ b ^ c;
assign cout = (a & b) | (a & cin) | (b & cin);
endmodule
# Ok, but what if we want more than 1 bit FA?
*** Note: red means new concept, blue and
green are just pretty colors :-p
Adapted from Arvind & Asanovics MIT 6.375 lecture
5
9
A 4-bit Full Adder
! We can use 1 bit FA
to build a 4 bit full
adder
module 4bitFA( input [3:0] A, B, input cin,
output [3:0] S, output cout);
wire c0, c1, c2;
FA fa0(A[0],B[0],cin,S[0],c0); // implicit binding
FA fa1(.a(A[1]), .b(B[1]), .cin(c0), .s(S[1]), .cout(c1)); // explicit binding
FA fa2(A[2],B[2],c1,S[2],c2);
FA fa3(A[3],B[3],c2,S[3],cout);
endmodule
FA FA FA FA
Adapted from Arvind & Asanovics MIT 6.375 lecture
10
Testing the adder
`timescale 1ns/1ns // Add this to the top of your le to set time scale
module testbench();
reg [3:0] A, B;
reg C0;
wire [3:0] S;
wire C4;
4bitFA uut (.B(B), .A(A), .cin(C0), .S(S), .cout(C4)); // instantiate adder
initial // initial blocks run only at the beginning of simulation (only use in testbenches)
begin
$monitor($time,"A=%b,B=%b, c_in=%b, c_out=%b, sum = %b\n",A,B,C0,C4,S);
end
initial
begin
A = 4'd0; B = 4'd0; C0 = 1'b0;
#50 A = 4'd3; B = 4'd4; // wait 50 ns before next assignment
#50 A = 4'b0001; B = 4'b0010; // don!t use #n outside of testbenches
end
endmodule
6
11
Verilog RTL Operators
! Avoid using %, **, and / because you'll run
into problems when trying to synthesis
~ & | ^ ^~ Bitwise
== != ===
!===
Equality
> < >= <= Relational
! && || Logical
+ - * / % ** Arithmetic
& ~& | ~| ^
^~
Reduction
>> << >>> <<< Shift
{ } Concatenation
?: Conditional
Adapted from Arvind & Asanovics MIT 6.375 lecture
12
A simple D flip flop (seq. circuit)
! For sequential circuits, use always blocks
! Always blocks (and assign) are executed in
parallel!
module DFF( input clk, d,
output q, q_bar);
reg q, q_bar;
always @ (posedge clk) // triggered on the rising edge of the clock
begin
q <= d; // non-blocking assignment (LHS not updated until later)
q_bar <= ~d;
/* q_bar <= ~q will not function correctly! */
end
endmodule
Adapted from Arvind & Asanovics MIT 6.375 lecture
7
13
Always blocks in comb. circuits
! Can use continual assignment AND always
blocks for combinational circuits
! Our 1-bit adder using always block
module FA( input a, b, cin,
output s, cout);
reg s, cout; // when using always block, LHS must be reg type
always @ ( a or b or cin ) // for comb circuits, sensitive to ALL inputs
begin
s = a ^ b ^ cin; // use blocking assignment here (LHS immediately)
cout = (a & b) | (a & cin) | (b & cin);
end
endmodule
14
Quick Note on blocking vs. non-
blocking
! Order of blocking statements matter
"These are not the same
! Order of non-blocking statements doesnt
"These are the same
! Use non-blocking with sequential, blocking with
combintational
c = a + b;
d = c + e;
d = c + e;
c = a + b;
c <= a + b;
d <= c + e;
d <= c + e;
c <= a + b;
8
15
Tips for maintaining
synthesizability
! Only leaf modules should have functionality
" All other modules are strictly structural, i.e., they only wire together
sub-modules
! Use only positive-edge triggered flip-flops for state
! Do not assign to the same variable from more than one
always block
! Separate combinational logic from sequential logic
! Avoid loops like the plague
" Use for and while loops only for test benches
Adapted from Arvind & Asanovics MIT 6.375 lecture
16
Another Example (4 input MUX)
! We can use case
statements within
an always block
module mux4( input a, b, c, d,
input [1:0] sel,
output out );
reg out;
always @( * )
begin
case ( sel )
2d0 : out = a;
2d1 : out = b;
2d2 : out = c;
2d3 : out = d;
default : out = 1bx;
endcase
end
endmodule
Adapted from Arvind & Asanovics MIT 6.375 lecture
9
17
Finite State Machines (FSMs)
! Useful for designing many different types of
circuits
! 3 basic components:
"Combinational logic (next state)
"Sequential logic (store state)
"Output logic
! Different encodings for state:
"Binary (min FFs), Gray, One hot (good for FPGA),
One cold, etc
18
A simple FSM in Verilog
module simple_fsm( input clk, start,
output restart);
reg [1:0] state, next_state;
parameter S0 = 2b00, S1 = 2b01, S2 = 2b10; // binary encode
always @ (*)
begin : next_state_logic
case ( state )
S0: begin
if ( start ) next_state = S1;
else next_state = S0;
end
S1: begin next_state = S2; end
S2: begin
if (restart) next_state = S0;
else next_state = S2;
end
default: next_state = S0;
endcase
end // continued to the right
// continued from left
always @ (posedge clk)
begin: state_assignment
state <= next_state;
end
endmodule
10
19
Tips on FSMs
! Dont forget to handle the default case
! Use two different always blocks for next state
and state assignment
"Can do it in one big block but not as clear
! Outputs can be a mix of combin. and seq.
"Moore Machine: Output only depends on state
"Mealy Machine: Output depends on state and inputs
20
Next step: design your own HW
! Now that you have the basics
"Check out MITs 6.375 course webpage
! Thanks to Asanovic & Arvind for slides
! Lectures 2 and 3 on Verilog
! http://csg.csail.mit.edu/6.375/handouts.html
"Try making some simple circuits
"Beware when Googling for verilog tutorial
! A lot of code out there isnt synthesizable

You might also like