0% found this document useful (0 votes)
50 views9 pages

Verilog Tutorial (Part 2) : Announcements

The document provides an introduction to Verilog concepts for designing hardware circuits. It discusses basic examples like a 1-bit full adder and D flip-flop. It explains blocking vs non-blocking assignments and always blocks. It also covers data types, operators, finite state machines, and tips for maintaining synthesizability. The overall document serves as a tutorial to teach basic Verilog concepts for hardware design.

Uploaded by

Nishana Kumar
Copyright
© Attribution Non-Commercial (BY-NC)
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)
50 views9 pages

Verilog Tutorial (Part 2) : Announcements

The document provides an introduction to Verilog concepts for designing hardware circuits. It discusses basic examples like a 1-bit full adder and D flip-flop. It explains blocking vs non-blocking assignments and always blocks. It also covers data types, operators, finite state machines, and tips for maintaining synthesizability. The overall document serves as a tutorial to teach basic Verilog concepts for hardware design.

Uploaded by

Nishana Kumar
Copyright
© Attribution Non-Commercial (BY-NC)
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/ 9

Verilog Tutorial (Part 2)

Brought to you by: Sat Garcia

Announcements

Lab 1 due date postponed


Due:

Wed. Oct 8 @ 6PM (via e-mail)

Lab 2, Part 1 will be up early next week


Design

fetch unit for your processor Look over description before next lecture! up for mailing lists so you get posts automatically
2

Stay up-to-date with webboard


Sign

A simple example (comb. circuit)

Let's design a 1 bit full adder (RTL style)


a b cin cout

FA
s

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?


Adapted from Arvind & Asanovics MIT 6.375 lecture
3

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! Why not? */ end endmodule
Adapted from Arvind & Asanovics MIT 6.375 lecture
4

Always blocks in comb. circuits


Can use continual assignment OR 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 @ ( * ) // for comb circuits, use * so avoid errors begin s = a ^ b ^ cin; // use blocking assignment here (LHS immediately) cout = (a & b) | (a & cin) | (b & cin); end endmodule
5

Blocking vs. non-blocking assignment

Order of blocking statements matter


These
c = a + b; d = c + e;

are not the same

d = c + e; c = a + b;

Order of non-blocking statements doesnt


These

are the same


c <= a + b; d <= c + e; d <= c + e; c <= a + b;

Use non-blocking with sequential, blocking with combinational


6

Blocking vs. Non-blocking assignments


Order of blocking statements matters assume a = 1, b = 2, c = 4, d = 4, e = 5 initially
// ex1 c = a + b; d = c + e; //ex2 d = c + e; c = a + b;

Order of non-blocking statements doesnt Example: (same assumptions)


// ex1 c <= a + b; d <= c + e; //ex2 d <= c + e; c <= a + b;

Ex1: c = 3 , d = 8 Ex2: c = 3 , d = 9

Ex1: c = 3 , d = 9 Ex2: c = 3 , d = 9

Guideline: Use blocking for combination, non-blocking for sequential

Verilog Simulation Behavior

Always blocks and assign statements execute in parallel


Signals

in sensitivity list (@()) trigger always

blocks Assign trigged when RHS signal changes

Non-blocking assignment is 2-step processes


Step

1: Evaluate RHS (beginning of time step) Step 2: Update LHS (end of time step)

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

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
10

Data types (continued)

Connect things together with wires


Single

wire: of wires

wire my_wire; wire[7:0] my_wire;

Array

Why not wire[0:7]?

For always blocks, must use reg type


Single

reg or an array of reg

reg[3:0] accum; // 4 bit reg

reg

is not necessarily a hardware register


11

Verilog RTL Operators


Arithmetic Logical Relational Equality Bitwise
+ - * / % ** ! && || > < >= <= == != === !=== ~ & | ^ ^~

Reduction Shift Concatenation Conditional

& ~& | ~| ^ ^~ >> << >>> <<< { } ?:

Avoid using %, **, and / because you'll run into problems when trying to synthesis

Adapted from Arvind & Asanovics MIT 6.375 lecture

12

Mystery Combinational Circuit


We can use case statements within an always block What hardware will this turn into?

module mystery( 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
13

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
14

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 // continued from left S1: begin next_state = S2; end always @ (posedge clk) S2: begin begin: state_assignment if (restart) next_state = S0; state <= next_state; else next_state = S2; end end endmodule default: next_state = S0; endcase end // continued to the right

15

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

16

Next step: Design your own HW

You now have the basics of Verilog


Can

create simple circuits of teh Internetz

Combinational, Sequential, or Mixed A lot of code out there isnt synthesizable

Beware

How do the real HW designers code?


Next:

More advanced design techniques

17

You might also like