Sandeepani Verilog

  • Uploaded by: Pavithra Patil
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Sandeepani Verilog as PDF for free.

More details

  • Words: 18,659
  • Pages: 354
Loading documents preview...
Sandeepani www.sandeepani-vlsi.com

Verilog HDL Coding for Simulation & Synthesis

Sandeepani www.sandeepani-vlsi.com

What‟s Coming • Objectives – Introduce Verilog language concepts – Use of language features to capture hardware design specification and Verify – Explore gate level modeling capabilities – Understand PLI capability

• Format – Morning – Presentations – Afternoon – Lab Exercises

• Timing – Coffee…..10.30 to 10.45 & 3.30 to 3..45 – Lunch……1.00 to 2.00

Sandeepani www.sandeepani-vlsi.com

Part-I Designing using Verilog ( RTL Coding )

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Introduction to Verilog-HDL, Data Types, Operators. • Verilog Language Concept, Hierarchy, Concurrency, Timing • Continuos and Procedural Assignments

- Session II • • • •

Lab 1- Use of Simulation and synthesis Tools Multiplexer, Comparator ,Decoder Using Hierarchy Assignments

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Verilog Coding styles – RTL , Behavioural. • Sequential statements - if else, case, for loop, while loop, statements • Blocking and Non-blocking statements,Simulation cycle

- Session II • Lab 2 • Sequential Logic exercises- Registered logic, timing logic, Counting logic.. • Assignments

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Synthesis Process • Structural RTL coding

- Session II • Lab 3 • Coding for Finite State Machines • Assignments

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Sample complete design • RTL coding Guidelines

- Session II • • • •

Lab 4 Use of External IP in design Structural coding Assignments

Sandeepani www.sandeepani-vlsi.com

Part-II Verification using Verilog ( Behavioral Coding )

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • • • •

Verification Overview, Writing Simple Test benches System Tasks & Compiler directives Use of input and output files Creating self checking test benches

- Session II • Lab 1- Use of Simulation and synthesis Tools • Writing Simple Test benches for Multiplexer, comparator,Decoder.. • Writing Test bench for Clocked logic

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Tasks & Functions • PLI Overview • Creating PLI applications

- Session II • Lab 2 • Writing test benches using Tasks • Writing test benches for FSM‟s

Sandeepani www.sandeepani-vlsi.com

SCHEDULE - Session I • Sum up

- Session II Lab 3 • Writing structured test benches using I/O files • Complete verification of structured model • Design Debugging

Sandeepani www.sandeepani-vlsi.com

Verilog Application

Sandeepani www.sandeepani-vlsi.com

Verilog Application Objectives  Identify the advantages of designing with an HDL.  Applications of Verilog  Define what is meant by “levels of abstraction” with respect to:  Verilog modeling

Sandeepani www.sandeepani-vlsi.com

What is Verilog • Verilog is not a software language • Verilog is a Hardware Description Language (HDL) – Programming language with special constructs for modeling hardware

Verilog Supports:• Structure – Physical (netlist & hierarchy) – Software (subprogram)

• Hardware behavior – Serial (sequential) – Concurrent (parallel)

Structure

q

a

b

s

c

r Behavior Tpd

• Timing • Abstraction levels

D Q

Tnet clk

Tsetup Thold Tclk-q

Timing

Sandeepani www.sandeepani-vlsi.com

Levels of Abstraction Behavioral algorithmic

f

Register Transfer Level Logic synthesis

Verilog Gate level -structural -netlist

Physical -silicon -Switch

Layout / place & Route

Sandeepani www.sandeepani-vlsi.com

Abstraction Level Example:Divide by 2 Behavioral

op

data always @ (data) op <= data/2; RTL

always @ (posedge clk) op <= data >> 1;

2 4

4

data

4

op

SLI

clk

Gate Level Netlist FD1 opreg2 ( .D(data[3]), .CP(clk), .Q(op[2] ) ); FD1 opreg1 (.D(data[2]), .CP(clk), .Q(op[1] ) ); FD1 opreg0 (.D(data[1]), .CP(clk), .Q(op[0] ) ); FD1 opreg3 ( .D(1‟b0), .CP(clk), .Q(op[3] ) );

D Q

4

Sandeepani www.sandeepani-vlsi.com

Benefits of Using an HDL  Design at a higher level.  Find problems earlier in the design cycle  Explore design alternatives  Description is implementation independent.  Functional and technology changes are easier to make  Decisions on implementation can be delayed longer  Flexibility  Re-use of design  Choice of tools,vendors  Text language based  Faster design capture  Easier to manage

Sandeepani www.sandeepani-vlsi.com

Applications Verilog language is used by:  ASIC and FPGA designers writing RTL code for synthesis  System architects doing high level system simulations  Verification engineers writing advanced tests for all level of simulation  Model developers describing ASIC or FPGA cells, or higher level components

Sandeepani www.sandeepani-vlsi.com

Verilog Based Simulation waveforms

Testbench behavioral

Design RTL

Compare

Results

Expected results

• High level testbench in Verilog • Interacts with design • Portable • Possibility of automatic checking of function • Testbench written in behavioral style • Design written in RTL style

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Verilog Language Introduction

Sandeepani www.sandeepani-vlsi.com

Aims and Topics • Objective – Examine fundamental language objects – Introduce the main language concepts

• Contents – – – –

Verilog objects Verilog connection model Hierarchy Rules and regulations

Sandeepani www.sandeepani-vlsi.com

module • Describes interface and behavior • Module‟s communicate through ports – Port names listed in parentheses after the module name. • Ports can be defined as input, or inout (bidirectional) • ^is the exclusive or operator • & is an logical and operator

module halfadd (a, b, sum, carry); output sum, carry; input a, b; assign sum assign carry

= a^b = a&b

endmodule

halfadd

a Important to Remember : Verilog is case sensitive for identifiers keywords must be in lowercase

sum +

b

carry

Sandeepani www.sandeepani-vlsi.com

Representing Hierarchy

Create hierarchy by fulladd  Instantiating module n_sum  Connecting module ports to a local ports or nets sum U1 U2  Local nets need to be n_carry2 b declared halfadd halfadd  The or construct is a “built cin carry in” gate primitive n_carry1 module fulladd (a, b, cin, sum, carry); Local nets of type input a, b, cin; wire output sum, carry; wire n_sum, n_carry1, n_carry2; halfadd U1 (.a(a), .b(b), .sum(n_sum), .carry(n_carry1) ); halfadd U2 (.a(n_sum), .b(cin), .sum(sum), .carry(in_carry2) ); or U3 (carry1, n_carry2, n_carry1) ; endmodule

Sandeepani www.sandeepani-vlsi.com

Connecting Hierarchy-Named Port Connection instantiation  Explicitly specifies which module port is mapped to which local port/wire

n_sum

a b

n_carry1

module a sum b carry

U1

module fulladd (a, b, cin, sum, carry); halfadd input a, b, cin; …mapped to output sum, carry ; wire n_carry1 wire n_sum, n_carry1, n_carry2 ; of fulladd module ….. halfadd U1 (.a(a), .b(b), .sum(n_sum), .carry(n_carry1) ); ….. module halfadd (a, b, sum, carry); output sum, carry; input a, b; Output carry of … halfadd module endmodule

Tip Use named port connection For linking hierarchy

Sandeepani www.sandeepani-vlsi.com

Connecting Hierarchy-Ordered Port Connection  Port mapping in order:•1st

instantiation

instantiation port a st mapped to 1 module port • 2nd instantiation port mapped b to 2nd module port • etc module fulladd (a, b, cin, sum, carry) ; input a, b, cin; output sum, carry; wire n_sum, n_carry1, n_carry2; ….. halfadd U1 (a, b, n_sum, n_carry1) ; …..

module halfadd (a, b, sum, carry) ; output sum, carry ; input a, b ; …… endmodule

n_sum n_carry1 U1

module

a sum b carry halfadd

input a of fulladd mapped to input a of halfadd input b of fulladd mapped to input b of halfadd

Caution Less readable and more error-prone than named port connection

Sandeepani www.sandeepani-vlsi.com

Procedural Blocks (Procedures) • Section containing procedural statements • Multiple procedures interact concurrently • always procedure – Executes when any variable in event list changes value – Runs throughout simulation



initial procedure – Executes once at start of simulation – Used for initialisation, testbenches…

Synthesis initial blocks are not synthesisable

always @ (a or b or sel) if (sel = = 1) y=a; event list else y=b;

a

1 y

b sel

0 initial begin a = 1; b = 0; end

Sandeepani www.sandeepani-vlsi.com

Event List • always procedure executes when one or more variables in the event list change value • An event is a change in logic value

“or” is a keyword used in event lists always @ (a or b or sel) begin if (sel = = 1) event list y=a; else y=b; end

Sandeepani www.sandeepani-vlsi.com

The Verilog Connectivity Model • Multiple procedures interacting concurrently – Executing statements in sequence, like conventional “software” – Communicating concurrently through variables

• Procedures contained in a module

Procedure

Procedure Procedure

– Or separated into several modules for a hierarchical design Procedure

Sandeepani www.sandeepani-vlsi.com

Compilation Library Some Verilog tools use compilation libraries: A collection of compiled modules or primitives  Physical exists as a directory  Referred to by library name  Simulator startup file specifies mapping

a_clk.v

WORK PRIMS

MY_WORK

 Library name ->directory name

PROJ

Compile into “WORK”  WORK mapped to specific library name

Sandeepani www.sandeepani-vlsi.com

Design Compilation • Design compiled from a list tb_one



testbench

design structural

cpu

pnet_read

pnet_write

behavioral RTL/structural behavioral

read_frame

write_frame

netlist

primitives

• •



of Verilog files Normally compile the testbench first – Usually contains compiler directives – Provides additional information for the compiler/simulator Order of other files generally not important Hierarchical connections are automatically made Verilog allows different levels of abstraction anywhere in the hierarchy

Comments and Spacing // This is a „line‟ comment. Each line must begin with // // Comments end with a new line module halfadd (a, b, sum, carry) ; output sum, carry ; input a, b ; // End of line comment … /* This is a „block‟ comment. Text in a block comment can span many lines.*/ // Verilog is a free-format language // Additional spaces can be used to enhance readability assign sum =a ^ b; assign carry = a & b; // use indentation to aid readability and debugging always @ (a or b or sel) if (sel = =1) y = a; else y = b;

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Identifier Naming Rules • Names may consist of any alphnumeric character, including dollar sign ($) and underscore(_) • Names must start with a letter or an underscore • Verilog identifiers are case sensitive – Keywords must be lowercase

• These names do not refer to the same object – ABC,Abc,abc • Names can be of any length – Tool or methodology may restrict name lengths.

unit_32 structural bus_16_bite a$b unit@32 unit - 32 16_bit_bus

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Verilog Logic System and Data Types

Sandeepani www.sandeepani-vlsi.com

Aims and Topics • Aims – To introduce the Verilog logic value system and to understand the different data types and the rules covering their use.

• Topics – – – – – – –

Logic value system Data type classes Vectors and literal values Net data types and their use Choosing the correct data type Parameters Memory arrays

Sandeepani www.sandeepani-vlsi.com

4-Value Logic System in Verilog buf

0 buf

1

One,High,True,Logic High, Power, VDD, VCC, Positive Assertion

X

X,Unknown (bus contention), Uninitialized

Z

Hiz, High Impedance, Tri-State, Undriven, Unconnected, Disabled Driver (Unknown)

buf

bufifI

Zero, Low,False, Logic Low, Ground, VSS, Negative Assertion

Important The “unknown” logic value x is not the same as “don‟t care.”

Sandeepani www.sandeepani-vlsi.com

Data Types • Verilog objects communicate using variables • All variables have a type • There are three different classes of data type – Nets • Represent physical connection between structures and objects e.g. wire

– Registers • Represent abstract storage elements e.g.reg

– Parameters • Run-time constants

Sandeepani www.sandeepani-vlsi.com

Net Types • A Net type behaves like a wire driven by a logic gate • Various net types are available – Wire is the most commonly used – Nets not explicitly declared default to type wire



Net values changed with assign in continuous assignments and by modules or primitives in the design wire sel; wire [31:0] w1, w2 ; wand c; tri [15:0] busa ;

Net types:wire, tri supply1, supply0 wor, trior wand, triand trireg, tri0, tri1

// // // //

Scalar wire Two 32-bit wires with msb = bit 31 Scalar wired-AND net A 16-bit tri-state bus, msb = bit 15 module halfadd (a, b, sum, carry) ; input a, b; // default to wire output sum, carry ; // default to wire // change with assign assign sum = a ^ b; assign carry= a & b; endmodule

Sandeepani www.sandeepani-vlsi.com

Wire and assign a

nsela

sel

out

nsel

b selb

 wire declaration and assignment can be merged.  Remember – ports default to wire types  Note:~ is an inversion operator

Nets module mux (a, sel, b, out); input sel, b, a; output out ; wire nsela, selb, nsel ; assign nsel = ~sel; assign selb = sel & b ; assign nsela = nsel & a; assign out = nsela | selb ; endmodule

module mux (a, sel, b, out ); input sel, b, a ; output out ; wire nsel = ~sel; wire selb = sel & b; wire nsela = nsel & a ; assign out endmodule

= nsela | selb;

Sandeepani www.sandeepani-vlsi.com

Logic Conflict Resolution with Nets  If the same net is driven from multiple sources a conflict occurs  Net types have a resolution function to determine final value of target y declared as wire y ; tri y ;

a y ?

assign y = a ; assign y = b ;

b y declared as wand y ; triand y ;

y declared as wor y ; trior y ;

b b 0 1 x z a 0 1 x z a a 0 1 x z 0 0 x x 0 0 0 0 0 0 0 0 1 x 0 1 x 1 x 1 1 0 1 x 1 1 1 1 1 1 x x x x x x 0 xx x x x 1 x x z 0 1 x z z 0 1 x z z 01 x x Synthesis wire and tri are synthesisable, some synthesis tools support wor and wand b

Sandeepani www.sandeepani-vlsi.com

Register Types  Register types stores value until a new value is assigned  Various register types are available  reg is the most commonly used  Register values changes with procedural assignment

module mux (a, b, c, sel, op) ; input a, b, c, ; input sel ; output op ; reg op ;

always @ (a or b or sel) begin if (sel = = 1) op = a; Synthesis else reg and integer are synthesisable, but do not op = b; have to synthesis to a flip-flop in hardware end endmodule Register types:reg reg [3:0] vect ; // 4-bit unsigned vector reg [2:0] p, q ; // two 3-bit unsigned vector integer integer i ; // 32-bit signed integer real reg s ; // unsized reg defaults to 1-bit time time delay ;

// time value

Sandeepani www.sandeepani-vlsi.com

Register Assignment module mux ( a, b, c, sel, mux ) ;  Register types can only be updated from within a procedure  Procedures can only update register types  Registers and nets can be mixed on the right-hand-side of an assignment Error Net type assigned in procedure Error Register type assigned outside procedure

input a, b, c ; input sel ; output mux ; wire aandb, nmux ; reg mux, nota ; always @ (a or b or sel) if (sel = = 1) begin mux = a ; nmux = b ; end else begin mux = a ; nmux = b ; end assign nota = ~a; assign aandb = a & b ; …

Sandeepani www.sandeepani-vlsi.com

Choosing the Correct Data Type net/register atop btop

Input Port net a b

Output Port net/register net

net ytop

y Inout Port

net module top; wire ytop; reg atop, btop; initial begin atop = 1‟b0; btop = 1‟b0; end dut U1 (.a(atop), .y(ytop), . b(btop)); endmodule

module dut (y, a, b) ; output y; input a, b; assign y = a&b; endmodule

Sandeepani www.sandeepani-vlsi.com

Parameters • Parameters are used to declare run-time constants. • Can be used anywhere that you can use a literal. •Make code more readable • Parameters are local to the module in which they are defined. • Can be used to size local variable declarations • Including module ports • Must be declared before used

// parameter list parameter pl = 8, REAL_p = 2.039, X_WORD = 16‟bx ; module mux (a, b, sel, out) ; parameter WIDTH = 2; input [WIDTH –1:0] a; input [WIDTH – 1:0] b; input sel ; output [WIDTH – 1:0] out ; reg [WIDTH –1:0] out ; always @ (a or b or sel) if (sel) out = a; else out = b; endmodule

Overriding the Values of Parameters

• Constant values can be changed for each instantiation of module module muxs (abus, bbus, anib, bnib, opbus, opnib, opnib1, sel ); parameter NIB = 4: input [NIB-1:0] anib, bnib; input [7:0] abus, bbus; input sel;

module mux (a, b, sel, out); parameter WIDTH = 2; ….

output [NIB-1:0] opnib, opnib1; output [7:0] opbus ; // module instantiations for different sized muxes mux # (8) mux8 (.a(abus), .b(bbus), . Sel(sel), .out”(opbus) ); mux # (NIB) mux4 (.a(anib), .b(bnib), .sel(sel), .out(opnib) ); mux mux4a (.a(anib), .b(bnib), .sel(sel), .out(opnib1) ); defparam mux4a.width=4; endmodule

Example follows…..

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Generic Decoder module gen_dec (en,a,y);

module gen_dec_call (ena,enab,adda,addb,decadda,decaddb);

parameter sizein=3, sizeout=8;

input ena; input enb;

input en; input [sizein-1:0]a; output [sizeout-1:0]y; reg [sizeout-1:0]y; integer i; always @(en or a) begin if(!en) y=0; else if(a > sizeout-1 ) for (i=0;i<= sizeout-1;i=i+1) y[i]=1'bx; else for (i=0;i<= sizeout-1;i=i+1) if(a==i) y[i]=1; else y[i]=0; end endmodule

input [1:0]adda; input [1:0]addb; output [3:0]decadda; output [3:0]decaddb; gen_dec#(2,4) dec2_4(ena,adda,decadda); gen_dec #(3,8) dec3_8(enb,addb,decaddb); endmodule

Sandeepani www.sandeepani-vlsi.com

Two Dimensional Arrays • Verilog supports two-dimensional array of registers



reg [15:0 ] mem [0 : 1023] ;

// 1K x 16-bit 2-d array

integer int_arr [99 :0] ;

// Array of integers 100 deep

A array element is addressed by an index to the 2-d array -You can only reference one element of memory at a time

– Multiple words accesses require multiple statements – Single bit accesses require an intermediate variable reg [7:0] mem_array [0:255]; // memory array reg [7:0] mem_word; reg membit; mem_word = mem_array [5]; // access address 5 mem_word = mem_array [10]; // access address 10 membit = mem_word [7] ; // access bit 7 of address 10

Synthesis: Two-dimensional arrays generally not synthesisable

Sandeepani

Summary

www.sandeepani-vlsi.com

• A net type behaves like a real wire driven by a logic gate – Nets not explicitly declared default to type wire – Net values changed with assign statement or when driven by a module/primitive

• Register types stores value until a new value is assigned – Register types do not have to synthesise to a register hardware element – Procedural assignment can only be updated with a procedural assignment – When assigning integer to reg, sign information is disregarded • Registers and nets can be mixed on the right-hand-side of an assignment • Module ports are defined as wire by default – Inputs must be net types, but can be driven by nets or registers – Inouts must be net types and can only be driven by a net – Outputs can be net or a register types, but can only drive a net

Sandeepani www.sandeepani-vlsi.com

Verilog Operators

Sandeepani www.sandeepani-vlsi.com

Aims and Topics  Aims -Introduce the operators available in the Verilog language  Topics Operator Type

Symbol

arithmetic bit-wise logical reduction shift relational equality conditional concatenation replication

+-*/ % ~& ^~^ !&& & ^ ~ & ~ ~ ^ << >> < > <= >= == != === !== ?: {} {{ }}

Sandeepani

Arithmetic Operators module arithops ( ) ;

+ * / %

add substract multiply divide modulus

• Binary arithmetic is unsigned • Integer arithmetic is signed

Synthesis % not synthesisable / only synthesisable if dividend is a power of 2

www.sandeepani-vlsi.com

integer ans, int ; parameter FIVE = 5 ; reg [3:0] rega, regb, regc, num ; initial begin rega = 3 ; // 0011 regb = 4‟b1010 ; regc = 2; // 00010 int = -3 ; ans = FIVE * int; // ans = -15 ans = (int + 5) /2; // ans = 1 ans = FIVE / int ; // ans = -1 num = rega + regb; // num= 1101 num = regc + regb; // num= 1100 num = int; // num = 1101 num = regc % rega; // num = 0010 end endmodule

Sandeepani www.sandeepani-vlsi.com

Bit-Wise Operators ~ not & and or ^ xor ~ ^ xnor ^ ~ xnor • Bit-wise operators operate on vectors. • Operations are performed bit by bit on individual bits.

module bitwise ( ) ; reg [3:0] rega, regb, regc ; reg [3:0] num ;

initial begin rega = 4‟ b1001 ; regb = 4‟ b1010 ; regc = 4‟ b11x0 ; num = ~rega; // num num = rega & 0 ; // num num = rega ®b; // num num = rega | regb; // num num = regb & regc; // num num = regb | regc; // num end endmodule

= = = = = =

0110 0000 1000 1011 10x0 1110

Note: Unknown bits in an operand do not necessarily lead to unknown bits in the result

Sandeepani www.sandeepani-vlsi.com

Logical Operators module logical ( ); ! not && and or • Logical operators are an operand reduction, followed by single bit operation - Vectors containing any 1 reduce to 1‟b1 - Vectors containing all 0 reduce to 1‟b0 - Vectors containing any x or z with only 0 reduce to 1‟bx

parameter FIVE = 5; reg ans ; reg [3:0] rega, regb, regc ; initial begin rega = 4‟b0011; // reduces to 1 regb = 4‟b10xz; // reduces to 1 regc = 4‟b0z0x; // reduces to x ans = ! rega; // ans = 0 ans = rega && 0; // ans = 0 ans = rega | | 0; // ans = 1 ans = rega && FIVE; // ans = 1 ans = regb && rega ; // ans = 1 ans = regc | | 0; // ans = x end endmodule

Unary Reduction Operators & and or ^ xor ~& nand ~ nor ~ ^ xnor ^ ~ xnor • Reduction operators perform a bit-wise operation on all the bits of a single operand. • The result is always 1‟b1, 1‟b0 or 1bx.

Sandeepani www.sandeepani-vlsi.com

module reduction ( ) ; reg val ; reg [3:0] rega, regb;

initial begin rega = 4‟b0100; regb = 4‟b1111; val = & rega ; val = | rega ; val = & regb ; val = | regb ; val = ^ rega ; val = ^ regb ; val = ~ | rega ; val = ~ ®a; val = ^rega && regb; end endmodule

// val = 0 // val = 1 // val = 1 // val = 1 // val = 1 // val = 0 // val = 0 // val = 1 // val = 1

Sandeepani www.sandeepani-vlsi.com

Shift Operators > > shift right < < shift left • Shift operators perform left or right bit shifts on the operand. • Shift is logical •0 is used for extra bits • Shifts can be used to implement division or multiplication by powers of two

module shift ( ) ; reg [9:0] num ; reg [7:0] rega ; initial begin rega = 8‟b00001100;

num =rega >> 1; // num = 0000000110 num = rega >> 3; // num = 0000000001 num = rega << 5; // num = 0110000000 end endmodule

zeros added first, then shift by 5 to the left

Sandeepani www.sandeepani-vlsi.com

Relational Operators > greater than < less than >= greater than or equal <= less than or equal • The result is:• 1‟b1 if the condition is true • 1‟b0 if the condition is false • 1‟bx if the condition cannot be resolved

module relationals; reg [3:0] rega, regb, regc; reg val ; initial begin rega = 4‟b0011; regb = 4‟b1010; regc = 4‟b0x10; val = regc val = regb val = regb val = regb end endmodule

> rega ; < rega ; >= rega ; > regc ;

// // // //

val = x val = 0 val = 1 val = x

Sandeepani www.sandeepani-vlsi.com

Conditional Operator module tribuf (in, enable, out); ? : conditional in

out

always @ (enable or in) out = enable ? In : 1‟bz; endmodule

enable

… wire out3; reg out1, out2; always @ (a or b or sel) out1 = sel ? a : b ;

a b

input in, enable; output out; reg out;

out

sel Note: sometimes the if else construct may be more readable

always @ (a or b or sel) if (sel) out2 = a; else out2 = b; assign out3 = sel ? a : b; …

Sandeepani www.sandeepani-vlsi.com

Concatenation { } concatenation • Allows you to select bits from different vectors and join them into a new vector. • Used for bit reorganization and vector construction •e.g.rotates • Can used on either side of assignment

Important Literals used in concatenation must be sized

module concatenation; reg [7:0] rega, regb, regc, regd, new; reg [3:0] nib1, nib2; initial begin rega = 8‟ b00000011; regb = 8‟ b00000100; regc = 8‟ b00011000; regd = 8‟ b11100000; new = { regd [6:5], regc [4:3], regb[3:0]; // new = 8‟ b11_11_0100 new = {2‟ b11, regb[7:5], rega[4:3], 1‟ b1}; // new = 8‟ b11_000_00_1 new = {regd [4:0], regd[7:5]}; // rotate regd right 3 places // new = 8‟b00000_111 {nib1, nib2} = rega; // nib1 = 4‟ 0000, nib2 = 4‟ 0011 end endmodule

Replication { { } } replication Replication allows you to reproduce a sized variable a set number of times •Can be nested and used with concatenation • Syntax is:{ {} } Important Literals used in replication must be sized 4x rega concatenated with 2x regc [1:0] regc concatenated with 2x regb regc concatenated with 2x 1‟b1 and replicated 2 times

Sandeepani www.sandeepani-vlsi.com

module replicate ( ) ; reg rega; reg [1:0] regb; reg [3:0] regc; reg [7:0] bus; initial single bit rega begin replicated 8 times rega = 1‟ b1; regb = 2‟b11; regc = 4‟ b1001; bus = {8{rega}}; // bus = 11111111 bus = { {4{rega}}, {2{regc[1:0] }} }; // bus = 1111_01_01 bus = { regc, {2{regb}} }; // bus = 1001_11_11 bus = {2 {regc[2:1], {2{1‟b1}}} }; // bus = 00_1_1_00_1_1 end endmodule

Sandeepani www.sandeepani-vlsi.com

Operator Precedence • Do not rely on Operator Precedence – use parentheses Type of Operators Concatenation / Replication Inversion (Logical / Bitwise) Arithmetic Logical Shift Relational Equality Bit-wise / Reduction

Logical Conditional

Symbols {} {{ }} ! ~ * / % + << >> < <= > >= == != === !== & ~& ^ ^~ ~ && ?:

Highest

Precedence

Lowest

Sandeepani www.sandeepani-vlsi.com

Procedural Statements

Sandeepani www.sandeepani-vlsi.com

Aims and Topics • Aim – To introduce some of the most commonly used procedural statements

• Topics – Procedures – Procedural statements • if then else • case • loops

initial versus always Procedures • There are 2 types of procedural block

• always procedure executes repeatedly throughout the simulation • it is triggered by a change of value for any variable in the event list • initial procedure executes once at start of simulation • begin …end must be used for multiple statements within a block Synthesis Initial procedures cannot be synthesized

Sandeepani www.sandeepani-vlsi.com

… reg a, b, zor, zand; initial begin a = 1‟b1; b = 1‟b0; end always @ (a or b) begin if (a | b) event list zor = 1‟b1; else zor = 1‟b0; if (a & b) zand = 1‟b1; else zand = 1‟b0; end …

Sandeepani www.sandeepani-vlsi.com

Procedural Assignments • Assignments made inside

procedural blocks are called procedural assignments • All variables on the left-hand side must be register data-types, e.g. reg • Here carry is not declared, and defaults to a 1-bit wire.

Error carry is a net type-should be declared reg carry;

module fulladder (out, a, b, cin); input a, b, cin; output [1:0] out; reg sum; reg [1:0] out;

always @ (a or b or cin) begin sum = a ^ b ^ cin; carry = ((a & b) | ( cin & (a ^ b))); out = {carry, sum}; end endmodule

Sandeepani www.sandeepani-vlsi.com

Event Control

• always procedure executes when one or more variables in the event list change value Synthesis Include all signals read by the block in the event list for the generation of combinational logic

always @ (a or b or sel) begin if (sel = = 1) event list y = a; else y = b; end

always @ (posedge clk) // procedural statements

• Can also use negedge or posedge •Execute procedure on a specific edge always @ (negedge clk) of a variable // procedural statements • Used for modeling synchronous logic always @ (negedge clk or rst) Synthesis: cannot mix edge and level triggers in // not synthesisable … event list

Sandeepani www.sandeepani-vlsi.com

Procedural Blocks within Verilog module design; wire nsela; wire nsel = !sel; wire selb = sel & b; always @ (nsel or selb) out = nsel | selb;

Procedure

Procedure

assign nsela = nsel & a; always @ (a or b or sel) begin // procedural statements end

// continuous statements … endmodule

Procedure Procedure

Sandeepani www.sandeepani-vlsi.com

if Statement Example • if is a conditional statement • Each if condition is tested in sequence -Condition is boolean expression •The first valid test executes that branch •Conditions can overlap

module if_example (a, b, c, d, y); input [3:0] a, b, c, d; output [3:0] y; reg [3:0] y; always @ (a or b or c or d) if (d = = 4‟ b0000) y = a; else if (d <= 4‟b0101) y = b; else y = c; endmodule

d Synthesis if synthesis to mux structures

c b a

0101 d 0000 <= = 0 0 y 1 1 mux mux

Sandeepani www.sandeepani-vlsi.com

if Statement Syntax if (CONDITION) begin / / procedural statements end if (CONDITION) begin / / procedural statements end else begin / / procedural statements end if (CONDITION) begin / / procedural statements end else if (CONDITION) begin / / procedural statements end else begin / / procedural statements end

• Signal if statement execute procedural statements only if the condition is true.. • .. add an unconditional else to execute procedural statements when the if condition is false.. • …add else if to test further conditions if the first is false -Final else is optional and can be used to indicate default operation • Use begin and end to bound multiple procedural statements

Sandeepani

case Statement Example • case is a multiway conditional statement • case expression is evaluated and compared against each item in turn -Branch items can overlap -The first item match executes that branch • The optional default captures unspecified values •In this example, values containing x or z

www.sandeepani-vlsi.com

module case_example (a, b, c, d, y); input [3:0] a, b, c, d; output[3:0] y; reg [3:0] y; always @ (a or b or c or d) case (d) 0 : y = a; 1,2,3,4,5 : y = b; 6 : y = c; 7 : y = c: default : y = 4‟ b0000; endcase endmodule

Sandeepani www.sandeepani-vlsi.com

for Loop • Iterates around loop for a specified number of times • Loop variable must be declared • When loop executed: -Loop variable initialized -Loop statement(s) executed -Loop operation performed -When condition false, loop exits // for loop expansion tmp = 0 ^ a[0]; // =a[0] tmp = tmp ^ a[1]; tmp = tmp ^ a[2]; tmp = tmp ^ a[3]; Synthesis for loop with fixed limits is synthesisable

a[0] a[1] a[2] a[3]

module parity (a, odd); input [3:0] a; output odd; reg odd, tmp; integer i; always @ (a) begin tmp = 0; for (i = 0; i <= 3; i = i + 1) tmp = tmp ^ a[i]; odd = tmp; end endmodule tmp

Sandeepani www.sandeepani-vlsi.com

repeat and while Loops module multiplier (result, op_a, op_b); input [3:0] op_a, op_b; output [7:0] results; reg [7:0] results; reg [7:0] shift_opa; reg [3:0] shift_opb;

• repeat loops iterate by the number specified -Number can be literal, variable or expression • while loop iterates while the expression is true, or non-zero

always @ (op_a or op_b) begin … result = 0; while (count < 10) shift_opa = op_a; // zero extend left begin shift_opb = op_b; // statements repeat (4) count = count + 1; begin end if (shift_opb[0] ) … result = result + shift_opa; shift_opa = shift_opa << 1; // shift left shift_opb = shift_opb >> 1; // shift right end endmodule

Sandeepani www.sandeepani-vlsi.com

Loop Statement Syntax • for loop requires a loop variable declaration • while loop continues while the condition is true • repeat iterates the number of times defined by the expression • forever loops forever

// loop variable must be declared for (initial, condition, inc_dec) begin // statements end while (condition) begin // statements end

Synthesis -for loop synthesizable for fixed range. - repeat synthesizable for fixed repetitions - while generally not synthesizable - forever generally not synthesisable

Unsynthesizable loops used in testbenches and simulation models

repeat (expression) begin / / statements end forever begin // statements end

Sandeepani www.sandeepani-vlsi.com

Continuous and procedural statements

Objective: To explain difference between continuous and procedural statements

Sandeepani www.sandeepani-vlsi.com

Continuous Assignments They are: continuously driven order independent They: operate on net data type only & reside outside procedures Example: wire a; wire out; ……….. assign a=x+y; assign out=a+z;

x y z

+

a +

out

Sandeepani

Multiple Continuous Assignments Example: wire z; …. ….. assign z=a+b; assign z=c+d; … What would be value on signal z ?

a b c d

www.sandeepani-vlsi.com

+

z ?

+

Sandeepani

Multiple Continuous Assignments

www.sandeepani-vlsi.com

• Multiple assignments to single variable are “wired together” • If z is wire type ,then following table resolves value wire/tri | 0 1 x z ----------------------0 | 0 x x 0 1 | x 1 x 1 x | x x x x z | 0 1 x z • As per need one can use wand or wor types for resolution|

Sandeepani www.sandeepani-vlsi.com

Procedural Assignments •Procedure statements execute in sequence or triggered by event occurring on variable in event list • Variables are updated immediately •Procedures execute concurrently

Sandeepani www.sandeepani-vlsi.com

Procedural Assignments Example: module andor(a,b,z_or,z_and); input a,b; output z_or,z_and; reg z_or,z_and; always @(a or b) begin if(a | b) z_or=1; else procedural assignments z_and=0; if(a & b) z_and=1; else z_and=0; end endmodule

Sandeepani www.sandeepani-vlsi.com

Multiple Assignments in Procedure What happens when same variable is assigned in procedure? Ex: ……. reg z; ….. always @(a or b or c or d) begin c z=a+b; z z=c+d; d end Last statement overrides previous assignment.

Sandeepani www.sandeepani-vlsi.com

Example.. Code the following block:

a b sel

z

Sandeepani www.sandeepani-vlsi.com

Example.. 1) always@ (a or b or sel) 2) always@ (a or b or sel) begin begin z=b;//default assig. if(sel) if(sel) z=a; z=a; else end z=b; end •

Last statement takes effect

Sandeepani www.sandeepani-vlsi.com

Conditional Assignments •This can be used in either procedural or continuous assignments •Procedure containing single if can be replaced by continuous assignments Example: always @(a or b or c or sel) if (sel==0) z=a; else if(sel<= 4‟b1010) z=b; else z=c; endmodule alternate to above procedure is to use conditional operator

Sandeepani www.sandeepani-vlsi.com

Conditional Assignment.. always @(a or b or c or sel) z=(sel==0) ? a:((sel<=4‟b1010) ?b:c); …………

Using continuous assignment: ….. assign z=(sel==0) ? a:((sel<=4‟b1010) ?b:c);

Sandeepani www.sandeepani-vlsi.com

Avoid feedback loops What would happen if you use following code ?

assign z=z+x; Or always @(z or x) z=z+x;

Sandeepani www.sandeepani-vlsi.com

Avoid feedback loops

x

z

•Creates feedback loop with zero-delay. •Program shall go in infinite loop in simulation and simulation will lock.

Sandeepani www.sandeepani-vlsi.com

Review 1.What happens if multiple procedural assignment are

made to the same variable? 2. Is a conditional assignment statement continuous, procedural or both ? 3. Why should you not create combinational feedback loops? 4. Code the following hardware using i) a continuous assignment and ii) using a procedure a[3:0]

+ b[3:0] c[4:0] add

1 0

d[4:0]

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Procedural Statements and the Simulation Cycle

Objective: To explain capabilities of procedures and blocking non-blocking assignments Simulation cycle

Sandeepani www.sandeepani-vlsi.com

Contents

Blocking Procedural Assignment Non-blocking procedural assignment Simulation cycle Timing control Review

Sandeepani www.sandeepani-vlsi.com

Procedure and Event Control Example: 1. …… always @(a or b or c) begin:adding y=a+b; z=a+c; end

2. …… always @(posedge clk) if(clr) q <= 0; else q <= d;

•Procedures executes whenever any event occurs on variable •Procedures can be named

Sandeepani

Blocking Procedural Assignment Blocking assignment:=

Variable assignment is immediate -before the next statement is executed Can create problems with some code structures Example..

www.sandeepani-vlsi.com

Sandeepani

Example Will this segment of code Swap the upper and lower byte contents? …….. initial begin byte=8‟b00001111; #20; byte[3:0]=byte[7:4]; byte[7:4]=byte[3:0]; #20; ……

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Contents

Blocking Procedural Assignment Non-blocking procedural assignment Simulation cycle Timing control Review

Sandeepani www.sandeepani-vlsi.com

Non-Blocking Assignment

Non-blocking assignment:<= Variable update is scheduled -value is calculated and stored -Variable is updated at the end of time slice

Sandeepani www.sandeepani-vlsi.com

Example Will this segment of code Swap the upper and lower byte contents? …….. initial begin byte<=8‟b00001111; #20; byte[3:0]<=byte[7:4];//byte[3:0] scheduled to receive 4‟b0000 byte[7:4]<=byte[3:0];// byte[7:4] scheduled to receive 4‟b1111 #20; // procedure suspends, scheduled assignments updated and nibbles successfully swapped …… Yes !!!

Sandeepani www.sandeepani-vlsi.com

Contents

Blocking Procedural Assignment Non-blocking procedural assignment Simulation cycle Timing control Review

Sandeepani www.sandeepani-vlsi.com

Simulation cycle(1) ___ ___ Variable Event list a<=1 • •

___ ___ procedure schedule

Assume a,w,m,y all zero a changes from zero to one

module sim_ex(a,m,y,w); Input a; Output m,y,w; Reg m,y,w; Always@ (a or m) begin:p1 m<=a; y<=m; End start Always@ ( m) begin:p2 w<=m; End endmodule

variable at a:m:y:w=0

Sandeepani www.sandeepani-vlsi.com

Simulation cycle(2) ___ ___ ____ Variable Event list m<=1

____

procedure schedule p1

a updated from 1‟b0 to 1‟b1 Procedure p1 executes Update to m scheduled No change in the value of y

module sim_ex(a,m,y,w); Input a; Output m,y,w; Reg m,y,w; always@ (a or m) begin:p1 m<=a; y<=m; End Always@ ( m) begin:p2 w<=m; End endmodule

variable at start a:1,m:y:w:0

Sandeepani www.sandeepani-vlsi.com

Simulation cycle(3) module sim_ex(a,m,y,w); Input a; Output m,y,w; Reg m,y,w;

____ _____ ____ _____ Variable Event list m<=1

always@ (a or m) begin:p1 m<=a; y<=m; End

procedure schedule p1 p2

m changes value to 1‟b1 Procedure p1 placed on scheduler list Procedure p2 placed on scheduler list

always@ ( m) begin:p2 w<=m; End endmodule

variable at start a:1,m:1y:w:0

Sandeepani www.sandeepani-vlsi.com

Simulation cycle(4) ____ ____

Variable Event list y<=1

____ ____

procedure schedule

module sim_ex(a,m,y,w); input a; output m,y,w; Reg m,y,w; always@ (a or m) begin:p1 m<=a; y<=m; end always@ ( m)

W<=1 Procedure p1 and p2 execute(random) Update to y and w scheduled No change in value for m

variable values after one delta a:1,m:1y:w:0

begin:p2 w<=m; end endmodule

Sandeepani www.sandeepani-vlsi.com

Simulation cycle(5) ____ ____ ____

____

module sim_ex(a,m,y,w); Input a; Output m,y,w; Reg m,y,w; always@ (a or m) begin:p1 m<=a; y<=m; End always@ ( m)

Variable Event list

procedure schedule

y and w are updated to 1‟b1; no more procedures to be executed

variable values after two deltas a:1,m:1y:1w:1

begin:p2 w<=m; End endmodule

Sandeepani www.sandeepani-vlsi.com

Simulation cycle:summary Variable Event list a<=1

m<=1

Y<=1 W<=1

procedure schedule p1

p1 p2

variable values a:1,m:0 y:0,w:0

a:1,m:1 y:0,w:0

a:1,m:1 y:1,w:1

module sim_ex(a,m,y,w); Input a; Output m,y,w; Reg m,y,w; always@ (a or m) begin:p1 m<=a; y<=m; End always@ ( m) begin:p2 w<=m; End endmodule

Sandeepani

Delta cycle and simulation Time Multiple delta cycles at each point of simulation time

One can specify timing inside procedural blocks Following are three types of timing controls Edge-sensitive timing control:@ regular delay: # level sensitive :wait

Simulation time

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

More on blocking and non-blocking assignments

Objectives: Guidelines on usage of blocking and non-blocking assignments

Sandeepani www.sandeepani-vlsi.com

contents Blocking and non-blocking assignment-Review Usage in clocked procedures Usage in combinational procedures Mix usage

Sandeepani www.sandeepani-vlsi.com

Blocking assignment review Blocking assignment:= Variable update is immediate -before other statements are executed always @(posedge clk) if(sel) z=a; else z=b;

Sandeepani

Non-blocking assignment review Non-blocking assignment:<= Variable update is scheduled -after the procedure suspends ….. reg q; always @(posedge clk) q<=d; ..

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

contents Blocking and non-blocking assignment-Review Usage in clocked procedures Usage in combinational procedures Mix usage

Sandeepani www.sandeepani-vlsi.com

Blocking assignment in clocked procedures What is value of cvar in following segment of code? initial begin avar=1‟b1; bvar=1‟b1; end always @(posedge clk) bvar=avar+1‟b1; always @(posedge clk) cvar=bvar;

Sandeepani www.sandeepani-vlsi.com

Blocking assignment in clocked procedures Blocking assignment can lead to “race conditions” Specifically when:-variable written in one procedure and read in another -both procedures have same event list In example shown above: -both procedures execute on positive edge of clock -assignments to bvar and cvar are immediate -final value of cvar depends on which procedure is executed first

Sandeepani www.sandeepani-vlsi.com

Non-Blocking assignment in clocked procedures • Non=blocking assignment avoids race conditions • Example:both procedures execute on positive on positive edge of clock assignments to bvar and cvar are scheduled

initial begin avar=1‟b1; bvar=1‟b1; end always @(posedge clk) bvar<=avar+1‟b1; always @(posedge clk) cvar<=bvar; Use non-blocking assignment for synchronous logic

Sandeepani www.sandeepani-vlsi.com

Position dependent code always @(posedge clk)

begin b=a; c=b; d=c; end Using blocking signal assignment in clocked procedures can also result in position dependent code

always @(posedge clk)

begin d=c; c=b; b=a; end

Sandeepani www.sandeepani-vlsi.com

contents Blocking and non-blocking assignment-Review Usage in clocked procedures Usage in combinational procedures Mix usage

Sandeepani www.sandeepani-vlsi.com

Combinational logic always @ (a or b) begin m=a; n=b; p=m+n; end Use blocking assignment for combinational procedures

Sandeepani www.sandeepani-vlsi.com

Combinational logic always @(a or b or m or n) begin:p1 m<=a; n<=b; p<=m+n; end Variable event event list a<=1 b<=2 m<=1 n<=2 p<=3

procedure scheduler p1 p1

• Non-blocking assignment can be inefficient for combinational logic • Specifically when logic contains serial serial behavior or intermediate variables -intermediate variables must be added to event list -procedure will take several delta cycles to reach “steady state”

Sandeepani www.sandeepani-vlsi.com

Multiple assignments always @(a or b or c) begin m=a; n=b; p=m+n; m=c; q=m+n; end Multiple assignments should be either blocking or non-blocking

always @(a or b or c or m or n) begin m<=a; n<=b; p<=m+n; m<=c; q<=m+n; end Multiple assignments can be made to a variable within one procedure -last assignment wins for nonblocking

Sandeepani www.sandeepani-vlsi.com

contents Blocking and non-blocking assignment-Review Usage in clocked procedures Usage in combinational procedures Mix usage

Sandeepani www.sandeepani-vlsi.com

Mixed assignments always @(posedge clk) begin tempa=ip1; …… tempb=f(tempa); …… op1<= tempb; …… end

always @(posedge clk)

begin temp=a+b; q<=temp+c; end

Sandeepani www.sandeepani-vlsi.com

Mixed assignments •Blocking assignments can be used within clocked procedures for temporary variables • usage: - assign inputs to temporary variables with blocking assignment -perform algorithm with temporary variables and blocking assignment -assign temporary variables to outputs with nonblocking assignment

Sandeepani www.sandeepani-vlsi.com

Definition of RTL Code

Sandeepani www.sandeepani-vlsi.com

AIMS and Topics • AIM

To define that rule and coding guidelines for RTL code, and to give an overview of portability issues -

Topics -Combinational Procedures -Clocked procedures

Sandeepani www.sandeepani-vlsi.com

RTL Style Combinational Procedure always @ (a or b or c) begin

Clocked Procedure always @ (posedge clock)

Begin

... … … end

...

... end

Tip

Tip

blocking assignment

Non-blocking assignment (<=) should be used

(=) should be used

Sandeepani www.sandeepani-vlsi.com

Complete Event List • Even List for

combinational logic must contain all variables read within procedure What would the behavior be if sel was missing ?

always @ (a or b or sel) begin if (sel = = 1) y = a; else y = b; end

Sandeepani www.sandeepani-vlsi.com

Incomplete Event List Synthesis For combinational logic, include all variables read in event list,

always @ (a or b) … a

b sel y

always @ (a or b or sel) begin if (sel = = 1) y = a; else y = b; end

always @ (a or b or sel) … a

b sel y

Incomplete Assignments in Combinational Logic

• What is the value of b if ctrl = 0 ? • What hardware would be built it this is synthesized ? • How can you avoid this type of hardware ?

module incomplete (ctrl, a, b); input a, ctrl; output b; reg b; always @ (ctrl or a) if (ctrl) b = a; endmodule

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Avoiding Latches • Two ways to avoid latches:•Use default statement •Add else clause

module completel (ctrl, a, b); input a, ctrl; output b; reg b;

always @ (ctrl or a) begin b = 0; // default module complete2 (ctrl, a, b); if (ctrl) input a, ctrl; b = a; output b; end reg b; endmodule always @ (ctrl or a) begin if (ctrl) Question b = a; which do you think would be best for else a procedure with complex nested if b = 0; / / default end statements? endmodule

Sandeepani www.sandeepani-vlsi.com

Continuous Assignments • Continuous assignments drive values onto nets -Outputs update simultaneously with any input change -Combinational logic is implied module orand (out, a, b, c, d, e); input a, b, c, d, e; output out; assign out = e & (a b) & (c d) ; endmodule a b e

c d

out

Rules for the Synthesis of Combinational Logic

Sandeepani www.sandeepani-vlsi.com

• Complete event list • Default assignments to prevent latches • Use blocking assignments • Continuous assignment synthesizes to combinational logic • Avoid combinational feedback loops • (Functions synthesize to combinational logic) – Functions will be described later

Register Inference in Clocked Procedures module counter (count, clk); output [3:0] count; input clk; reg [3:0] count;

count

0

+ 4

9

<

4

www.sandeepani-vlsi.com

• Clocked procedures triggered on clock edge •Use only posedge/negedge in event list • Registers are inferred on all non-blocking assignments in synchronous procedures

always @ (posedge clk) if (count > = 9) count < = 0 ; else count < = count + 1; endmodule

1

Sandeepani

0 1

sel

4

clk

4

Question What is the issue with this counter description?

Sandeepani www.sandeepani-vlsi.com

Resetting Clocked Logic Synchronous Reset

Asynchronous Reset

module counter (count, clk, rst); output [3:0] count ; input clk, rst; reg [3:0] count ;

module counter (count, clk, rst); output [3:0] count; input clk, rst; rst [3:0] count;

always @ (posedge clk) if (rst) / / active high reset else if (count > = 9) count < = 4‟ b0 ; else count < = + 4‟ b1 ;

always @ (posedge clk or posedge rst) if (rst) // active high reset count < = 4 „ b0; else if (count < 9) count < = 4 „ b0; else count < = count + 4 „ b1; endmodule

endmodule

• if-else used to add reset to clocked procedure • if defines reset behavior • First else defines clocked behavior • For asynchronous resets, active edge of reset added to event list

Sandeepani www.sandeepani-vlsi.com

Clocked Procedure Templates always @ (posedge clk or negedge rst) if (!rst) begin // asynchronous reset behavior end else begin // all synchronous actions end

always @ (posedge clk) if (!rst) begin // synchronous reset behavior end else begin // all synchronous actions end always @ (posedge clk) begin // all synchronous actions end

• always procedure • Event list only contains:• posedge/negedge reset • posedge/negedge reset for asynchronous reset • Code must follow these templates

TIP Keep procedures with asynchronous resets separate from procedures with synchronous resets.

Sandeepani www.sandeepani-vlsi.com

Synchronous Feedback Inferrence • Incomplete assignment in clocked procedure implies synchronous feedback module dffn (q, d, clk, en); input d, clk, en; output q; reg q; always @ (posedge clk) if (en) q < = d; endmodule

d en clk

0 1

mux

q

Sandeepani www.sandeepani-vlsi.com

Clocked Procedure Assignment a

b

clk

Question How would you code this design in Verilog?

c

Sandeepani

Blocking and Non-blocking Assignment 1

3

always @ (posedge clk) begin c < = b; b < = a; end always @ (posedge clk) begin c = b; b = a; end

2

4

always @ (posedge clk) begin b < = a; a < = b; end

always @ (posedge clk) begin b = a; c = b; end

• Easier to use non-blocking assignment to infer registers in synchronous procedures • Order independent • Register inferred for each assignment

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

The Synthesis Process

Sandeepani www.sandeepani-vlsi.com

AIMS ANDS TOPICS * AIMS - To introduce synthesis process and look at its strenths and weaknesses * TOPICS - How a synthesis tool works - Synthesis based methodology - Synthesis strengths and weakness - Programmable Logic device synthesis issues - Language subsets

Sandeepani www.sandeepani-vlsi.com

clk

WHAT DOES SYNTHESIS DO? * Infers registers from cloked procedures * Builds optimized combinational logic * A new engineer task: - How much of it? - How well? - Do you trust it?

Verilog code Synthesis flow

Constraints File

Technology library Synthesis Engine

Sandeepani www.sandeepani-vlsi.com

* Verilog code is the important input - the quality of results depends mainly on the code * Technology Library is used to build the circuit from the verilog description * Constraints File drives the synthesis engine

area/Speed Curve Schematic

Gate Level Netlist

Area

How Synthesis works

Sandeepani www.sandeepani-vlsi.com

Verilog code

Constrains file Boolean

Parsing

Mapping

Technology Library

Gates Optimization

Gate Level Netlist

Schematic

Sandeepani www.sandeepani-vlsi.com

clk

Coding Styles Affect Results * Number of registers - Combinational logic optimised only, not register numbers or placement * Amount of combinational logic inbetween registers - Pipelining and logic timing mut be considered when code written * structure of .logic

Sandeepani

Translation Can Be Literal!

www.sandeepani-vlsi.com

* Synthesis tools generate logic directly from the structure of your code -Here == operator is redundant but may still appear in the synthesized netlist 011 d

always @ (posedge clk) if (d < 3) y <= a; else if (d > 3) y <=b; else if (d == 3) y <= c;

d

011

= >

?

0

c

1 mux

b

0 1mux

011

d < 0

1 mux

a ? Question What would be the input at “?“ clk Inferred hardware structure

y

What Synthesis Sometimes Can’t Do Well..

Sandeepani www.sandeepani-vlsi.com

* Clock trees - Usually require detailed, accurate net delay information * Complex clocking schemes - Synthesis tools prefer simple single clock synchronous designs * Memmory, IO pads, technology -specific cells - You will probably need to instantiate these by hand * Specific macro -cells * Always as well as you can - Although it can analyze hundreds of implementations in the time taken for designer to analyze one

Sandeepani www.sandeepani-vlsi.com

Programmable Logic Device Specific Issues * Different architectures for different technologies * Fixed architecture within a specific technology * Architecture specific „tricks„ for good utilization and speed * Code becomes technology specific * How your synthesis tool handles your technology

A Synthesis Methodology

change code

Change constraints file

constraints

tech library

synthesis

Sandeepani www.sandeepani-vlsi.com

netlist

n

y meets area/speed?

verilog rtl simulation

functional? y

gate simulation

n

testbench change code

compare golden results

results

Language Support

Sandeepani www.sandeepani-vlsi.com

* Synthesizeable Verilog is a subset of the full language * There is no standard for synthesizeable code * Diferent tool vendors have slightly different interpretations of what is synthesizeable

Synthesis Subset Tool1 Tool2 Tool3 Tool4 Tool5

Full Verilog Language

Sandeepani

Summary * RTL for synthesis * Logic and gate optimization * Coding style affects results * Synthesis tools support subsets of language style

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Verilog Coding Guidelines

Sandeepani www.sandeepani-vlsi.com

Blocking and nonblocking statements Coding guidelines Coding for Performanance(Examples)

Sandeepani

Blocking and non-blocking assignments

www.sandeepani-vlsi.com

• Guidelines – Use blocking assignments in always blocks that are written to generate combinational logic – Use nonblocking assignments in always blocks that are written to generate sequential logic

• Ignoring these guidelines can result in a mismatch between behavior of synthesized circuit and the pre-synthesis simulation results

Sandeepani www.sandeepani-vlsi.com

Comparison • Evaluation of blocking statements requires less simulator memory • Evaluation of Non blocking statements requires more simulator time

Sandeepani www.sandeepani-vlsi.com

Coding Guidelines

Sandeepani www.sandeepani-vlsi.com

Guideline 1 • To model combinational logic within an always block, use blocking statements

a

temp

out b c

always @(a or b or c) temp = a & b; out = c & temp; endmodule

Sandeepani www.sandeepani-vlsi.com

Guideline 2 • In order to model sequential logic, use non-blocking assignment statements

Sandeepani www.sandeepani-vlsi.com

Guideline 3 • In order to model latches, use nonblocking statements

Sandeepani www.sandeepani-vlsi.com

What‟s wrong with this block? always @(test or PC or AluOut) begin if (select) begin output = PC; end else begin output = AluOut; end end

Hint: Look at the sensitivity list.

Sandeepani www.sandeepani-vlsi.com

Sensitivity List • A signal that appears on the right-hand side of a combinational always block must appear in the sensitivity list of the always block. • The only exceptions here are signals that are also generated in the always block (are on the left-hand side). – Verilog only evaluates always blocks only when a signal in the sensitivity list changes.

always @(a or b or c) temp = a & b; out = c & temp; endmodule

Sandeepani www.sandeepani-vlsi.com

What‟s wrong with this block? always @(select or PC or AluOut or IR1 or add3) begin if (select == 2'h0) begin output1 = PC; PC output2 = add3 end else if (select == 2'h3) begin output1 = AluOut; output2= IR1; 2 end end select

IR1 add3 AluOut

Selector

output1

output2

Sandeepani

If/Case construct in Combinational always block

www.sandeepani-vlsi.com

• Each left-hand side signal must be assigned in every possible case. • If it is not assigned to in one of the cases, then you have "implied a latch" -- there is some set of inputs for which this gate does not take on a new value and therefore "holds" its old value. • No longer a combinational logic element!

Sandeepani www.sandeepani-vlsi.com

Correct implementation always @ (select or PC or AluOut or IR1 or add3 or output1 or output2) begin if (select == 2'h0) begin output1 = PC; output2 = add3 end else if (select == 2'h3) begin output1 = AluOut; output2= IR1; end else begin output1 = output1; output2 = output2; end end

Sandeepani www.sandeepani-vlsi.com

What‟s not good here? always @(posedge CLK) begin Q <= `TICK D; Z <= `TICK (a ^ b) & (sig1 | sig2); end

D

a b sig1 sig2

Q

Z

Sandeepani www.sandeepani-vlsi.com

More readable code wire nextZ; assign nextZ = (a ^ b) & (sig1 | sig2); always @(posedge CLK) begin Q <= `TICK D; Z <= `TICK nextZ; end

a b sig1 sig2

D

Q Z

nextz

Sandeepani www.sandeepani-vlsi.com

Add comments in your code • Others can read and understand your design • You can understand your design after 3 months when you may have to debug the design! • Make sure that you modify the comments if you are modifying the design! • If you are modifying someone else‟s code, add comments regarding what modification you made and the date of modification. • Do not delete old code; comment it. • Learn to write simple and helpful comments.

Sandeepani www.sandeepani-vlsi.com

Indentation • Indent your code. • Proper indentation makes your code easier to read and debug. • Indentation also forces you to write better code: levels of nesting will be in kept in check!

Sandeepani www.sandeepani-vlsi.com

`define statements • Do not use hardwired constants all over the place; instead, use meaningful names.

if (opcode == 6b`000010) then begin end else if (opcode = 6b`000011) then begin end

`define ADD 6b`000010 `define SUB 6b`000011 if (opcode == `ADD) then begin end else if (opcode = `SUB) then begin end

Sandeepani www.sandeepani-vlsi.com

Examples of coding style

Sandeepani www.sandeepani-vlsi.com

Priority Encoder module my_if (c, d, e, f, s, pout); input c, d, e, f; input [1:0] s; output pout; reg pout; always @ (s or c or d or e or f) begin : myif_pro if (s == 2'b 00) begin pout <= c; end else if (s == 2'b 01 ) begin pout <= d; end else if (s == 2'b 10 ) begin pout <= e; end else begin pout <= f; end end endmodule // module my_if

Sandeepani www.sandeepani-vlsi.com

Multiplexer

c d e f

s

module mux (c, d, e, f, s, muxout); input c, d, e, f; input [1:0] s; output muxout; reg muxout; always @ (s or c or d or e or f) begin : mux1 case (s) 2'b 00: begin muxout <= c; end 2'b 01: begin muxout <=d; end 2'b 10: begin muxout <= e; end default: begin muxout <= f; end endcase end endmodule // module mux

Sandeepani www.sandeepani-vlsi.com

Multiplexer vs Latch a y b

a

select

if (select) y = a; else y = b;

y

if (select) y = a;

Sandeepani

Register with Asynchronous Reset

www.sandeepani-vlsi.com

data

q

clk reset

module dff_async_reset (data, clk, reset, q); input data, clk, reset; output q; reg q; always @ (posedge clk or negedge reset) if (~reset) q = 1‟ b0 else q = data; endmodule

Sandeepani

Clock-triggered Flip-flop with Enable control

www.sandeepani-vlsi.com

d

q

clk en

clr

module ff_clk (d, en, clk, clr, q); input d, en, clk, clr; output q; reg q; always @ (clk or clr) begin if (clr == 1'b 0) begin q <= 1'b 0; end else if (clr & clk == 1'b 1 ) begin if (en == 1'b 1) begin q <= d; end end end endmodule / / module ff_clk

Sandeepani www.sandeepani-vlsi.com

Resource Sharing:I A +

B Mux sum C

D

if (select) sum <= A + B; else sum <= C + D;

+

select

We are sharing the multiplexer.

Sandeepani www.sandeepani-vlsi.com

Resource Sharing:II A mux

B select C

D

mux

+ sum

if (select) begin temp1 <= A; temp2 <= B; end else begin temp1 <= C; temp2 <= D; end sum <= temp1 + temp2;

select

We are sharing the adder.

Sandeepani www.sandeepani-vlsi.com

Resource Sharing:III vsum +

0

mux

Offset[0]

0

mux

+

mux

+

Offset[1]

0 Offset[2]

vsum = sum; for (i=0;i<3;i++) begin if (req[i]=1„b1) begin vsum <= vsum + offset[i]; end; end loop;

Sandeepani www.sandeepani-vlsi.com

Resource Sharing:IV mux vsum

R +

0 Offset[0] Offset[1]

mux

Offset[2]

Can we rewrite to code to generate hardware that looks like this?

Sandeepani www.sandeepani-vlsi.com

Code that forgets performance sum := start; for (i=0;i<2;i++) begin sum <= sum + inc[i]; end;

start inc[0]

+ + inc[1]

+ inc[2]

sum

Sandeepani www.sandeepani-vlsi.com

Performance-oriented coding

start inc[0]

sum = ((inc[2] + inc[1]) + ((inc[0] + start));

+ +

sum

inc[1]

+ inc[2]

Loop Unrolling performed by designer!

Sandeepani www.sandeepani-vlsi.com

Overchecking for conditions can increase hardware data_in

data_out always @ (posedge clk) begin if (req == 4'b1000) data_out <= data_in; end end

clk en

req

Sandeepani www.sandeepani-vlsi.com

Simplifying the code data_in

data_out

clk en req[3]

always @ (posedge clk) begin if (req(3) == 1'b1) data_out <= data_in; end end

Sandeepani www.sandeepani-vlsi.com

Optimization in case statements always @ (posedge clk) begin if (req) begin case (r) 5'b00001: c <= a(0); 5'b00011: c <= a(1); 5'b00101: c <= a(2); 5'b00111: c <= a(3); 5'b01001: c <= b(0); 5'b01011: c <= b(1); 5'b01101: c <= b(2); 5'b01111: c <= b(3); default: c <= 1'bx; end case end

Sandeepani

How can we obtain this hardware instead?

a[3:0] c

8-to-1 mux

DFF r[4]

b[3:0]

r[0]

clk r [3:1]

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Summary • Synthesis is still an evolving art – Unless you describe exactly what you want, the synthesizer will misunderstand you!

• Following a set of guidelines will help • Good coding styles will help you and the synthesis tool

Sandeepani www.sandeepani-vlsi.com

Finite State Machines

Sandeepani www.sandeepani-vlsi.com

Topics • • • •

FSM Basics Steps for FSM design Example design HDL code for FSM

Sandeepani www.sandeepani-vlsi.com

Any Sequential Logic Circuit is a State Machine • Single flip-flop has two states - `0`, `1` • A circuit with 2 flip-flops can have a maximum of 4 states. • n flip-flops can have 2n states.

Sandeepani www.sandeepani-vlsi.com

Flip Flip as an FSM

D

CLK

Q

Sandeepani www.sandeepani-vlsi.com

Simple Transition Sequence • Sequential circuits like counters and shift registers have a fixed transition sequence • Counters - 00000, 00001, 00010, 00011… each count is a state, total 25 • Shift Registers - 00001, 00010, 00100, each shift position is a state, total 5

Sandeepani

Complex trasitions

www.sandeepani-vlsi.com

Coin collection FSM TO 00p 25p 50p 75p 100p

Possible Possible Possible 00p

Possible Possible Possible 25p

Possible Possible 50p FROM

Possible 75p

100p

Sandeepani

What is an FSM?

www.sandeepani-vlsi.com

Design Specification Point of View • State machines are a means of specifying sequential circuits which are generally – complex in their transition sequence – and depend on several control inputs.

Sandeepani

What is an FSM?

www.sandeepani-vlsi.com

Digital Circuit Point of View • State machines are a group of flip-flops, whose group-state transition pattern (from one set of values to another ) is – generally unconventional – and depends on several control inputs

Sandeepani www.sandeepani-vlsi.com

FSM Structure

CONTROL INPUTS

ASYNC CONTROL

PORTS

NEXT STATE

CURRENT STATE

STATE REGISTER FLIP-FLOPS REGISTERED ACTION PORTS

CLOCK

COMB. LOGIC for NEXT STATE

COMBINATORIAL ACTION PORTS

CURRENT STATE

Sandeepani www.sandeepani-vlsi.com

FSM Design Steps • • • • •

Define the ports Define the states Define transitions and conditions Define the actions Write code for synthesis

Sandeepani

State Machine: State Diagram 01 = 1‟bo 01 =1 ‟bo

A

01 =1‟b0 02 =1‟b0

3‟b000

a= 1‟b1

b=1 ‟ b 1

C

3‟b011

B 3‟b001

01 = 1‟b1 02 = 1‟b1

b= 1‟b o

{a, b} = 2‟b11 a= 1‟b0

{a ,b}=2‟b01

D

a =1‟b1

3‟b010

01 = 1‟b0 02 = 1‟b0

E

3‟b110

01= 1‟b0 02= 1‟b1

www.sandeepani-vlsi.com

State Names (A,B,C,D,E,) State encoding: A=3‟ b000, B=3‟b001… Transition Conditions: {a ,b}=2‟b01 Output values: 01=1‟b0

Sandeepani

State Machine: Declarations and Clocked Procedure • Use parameters for state encoding • Reset strategy for state register • Partition into clocked procedure and combinational procedures

State register

Output Logic 01

a b

02

Next State Logic state Next_state

www.sandeepani-vlsi.com

module fsm (a, b, clock, reset, 01, 02); input a, b, clock, reset; output 01, 02 ; // parameter declarations (state encoding) parameter A = 3‟b000, B = 3‟b001, C = 3‟b011, D = 3‟b010, E = 3‟b110; // wire and reg declarations reg [2:0] state, next_state ; reg 01, 02 ; // clocked procedure always @(posedge clock or posedge reset) begin: STATEREGISTER if (reset) state < = A; else state < = next_state ; end …

Sandeepani

State Machine: Declarations and Clocked Procedure • Use parameters for state encoding • Reset strategy for state register • Partition into clocked procedure and combinational procedures

State register

Output Logic 01

a b

02

Next State Logic state Next_state

www.sandeepani-vlsi.com

module fsm (a, b, clock, reset, 01, 02); input a, b, clock, reset; output 01, 02 ; // parameter declarations (state encoding) parameter A = 3‟b000, B = 3‟b001, C = 3‟b011, D = 3‟b010, E = 3‟b110; // wire and reg declarations reg [2:0] state, next_state ; reg 01, 02 ; // clocked procedure always @(posedge clock or posedge reset) begin: STATEREGISTER if (reset) state < = A; else state < = next_state ; end …

State Machine: Combinational Procedures always @ (a or b or state) begin: NEXTSTATE next_state = state ; case (state) A : begin if (a) next_state = C; else if (b) next_state = B; end B: begin if (~b) next_state = A; else if ( { a,b} = = 2‟b01) next_state = D; end C: begin if (a) next_state = E; else if ( {a,b} = = 2‟b11) next_state = D; end D:next_state = A; E: if (~a) next_state = C; end // end next state logic

Sandeepani www.sandeepani-vlsi.com

always @ (state) begin: OUTPUTDECODE // DEFAULT ASSIGNMENTS 01 = 1‟b0 ; 02 = 1‟b0 ; case (state) B: begin 01 = 1‟b1; 02 = 1‟b1; end E: 02 = 1‟b1; end end // end output decode logic

 Next state and output decode combinational procedures could be merged  Next state and state register procedures could be merged

Sandeepani www.sandeepani-vlsi.com

If Synthesis module if_example (a, b, c, ctrl, op); input a, b, c; input [3:0] ctrl ; output op; reg op;

always @ (a or b or c or ctrl) if (ctrl) = = 4‟b0000) op = a; else if (ctrl < = 4‟b0100) op = b ; else op = c ; endmodule

Question Draw the architecture of hardware that this represents.

Sandeepani www.sandeepani-vlsi.com

If and Case Architectures if (ctrl = = 4‟b0) op = a ; else if (ctrl < = 4‟d4 ) op = b ; else op = c ; if synthesis c b a ctrl

o

op = a; op = b; op = c;

Question What hardware structure is created for a case statement?

1

<= 4

case (ctrl) 0: 0,1,2,3,4 : default: endcase

ctrl

= 0

0

1 op

Depends if case statement is parallel or not!

Sandeepani www.sandeepani-vlsi.com

Case Synthesis

• Case statement allowed to have overlapping choices – Choices prioritized in order of appearance

• Some synthesis tools infer priority encoder structure – Even for cases with no choice overlap

• Case with mutually exclusive choices can be built with non-prioritized logic case (ctrl) 0; 0, 1, 2, 3, 4 : default endmodule

op = a ; op = b ; op = c ;

case (ctrl) 0: op = a ; 1, 2, 3, 4 : op = b ; default : op = c ; endcase

Prioritized case synthesis ctrl c b a <=

0

1

4 ctrl

= 0

0

1 op

Sandeepani

Parallel Case Statement

www.sandeepani-vlsi.com



Case with mutually exclusive choices known as parallel case – Can be implemented with non-prioritized logic • Most synthesis tools can recognize parallel case – Others may need to be told case is parallel • Directives can be used to control synthesis – Embedded comments which are recognized by synthesis Important Never apply directive to a nonparallel case Tip: If your synthesis tool supports it, create parallel case by design not by directive

case (ctrl) 0: op = a ; 1, 2, 3, 4 : op = b ; default : op = c ; endcase case (ctrl) // rtl_synthesis parallel_case 0: op = a ; 1, 2, 3, 4 : op = b ; default op = c ; endcase

c

ctrl

b

a

< 5 ctrl

>

op

5

parallel case synthesis

Synthesis Directives

Sandeepani www.sandeepani-vlsi.com

• Most synthesis tools handle directives or programs • Directives are verilog comments, ignored by simulation but meaningful to synthesis – Aim is to control synthesis optimization from within the RTL code.

case (test) // rtl_synthesis parallel_case 2‟b00: op = 1 ; 2‟b01, 2‟b10: op = 2 ; 2‟b11: op = 3 ; default : // rtl_synthesis off $ display (“unknown test!”); // rtl_synthesis on endcase

$display writes a message to the simulator transcript window Caution Can lead to different RTL/Gate level functionality from Same design – use With caution!

Sandeepani

Casez Synthesis • casez is treated similar to

www.sandeepani-vlsi.com

always @ (pri_in) begin casez (pri_in) 4‟ b1??? : op = 3 ; 4‟ b01?? : op = 2 ; 4‟ b001? : op = 1 ; 4‟ b0001 : op = 0 ; default : op = 0 ; endcase end always @ (ctrl) begin {int0, int1, int2 } = 3‟ b000 casez (ctrl) 3‟ b?/1 : int0 = 1‟ b1 ; 3‟ b?1?: int1 = 1‟ b1 ; 3‟b1?? : int2 = 1‟ b1 ; endcase end

case by the synthesis tool • casez can be parallel or non-parallel – Parallel casez will synthesis to parallel logic – Non-parallel casez will synthesize to prioritized logic



Synthesis tool may need to be told casez is parallel

Important Make sure casez actually is parallel before using directives

Question Are these casez statements parallel or not?

Sandeepani www.sandeepani-vlsi.com

Full Case

• Case branches do not need to cover all values for case expression

// declarations for examples module case_1 (b, c, ctrl, op) ; input [3:0] b, c ; input [1:0] ctrl ; output [3:0] op ; reg [3:0] op always @ (ctrl or b or c) case (ctrl) 0, 1 : op = b ; 2 : op = c ; endcase

always @ c(ctrl or b or c) case (ctrl) 0, 1 : op = b ; 2 : op = c ; 3 : op = 0 ; endcase

– Can cause incomplete assignments in combinational code. -Will synthesze latches

• Full case (for synthesis) covers all binary values of case expression.

case not fulllatches inferred

– Ignoring x and z value combinations

default makes full case for synthesis and simulation Full case for synthesis

always @ (ctrl or b or c) case (ctrl) 0, 1: op = b ; 2: op = c ; default : op = 0 ; endcase

Sandeepani www.sandeepani-vlsi.com

Full Case Directive • always @ (ctrl or b or c) //rtl_synthesis full_case case (ctrl) 0, 1 : op = b ; 2, 3 : op = c ; endcase

• •

Caution Make sure case actually is full before using directives always @ (ctrl or b or c) begin op = c ; case (ctrl) 0, 1 : op = b ; 2 : op = c ; endcase end



Most synthesis tools can recognize full case – Others may need to be told case is full Can use synthesis directive to force full case What happens if directive applied to case description which is not full? – Assumes missing case values can be implemented as “don‟t care” – Can cause RTL to gate level simulation mismatches Full case issue avoided if default assignments used

Sandeepani www.sandeepani-vlsi.com

Case Directive Exceptions • A full case statement can still synthesize latches – Even if the full_case directive and default option are used

• Incomplete assignments can occur for any variable assigned to in a combinational procedure. – Default statements can prevent problems module select (a, b, sl ) ; input [1:0] sl ; output a, b ; req a, b ; always @ (sl) case (sl) // rtl_synthesis full_case 2‟ b00 : begin a = 0 ; b = 0 ; end 2‟ b01 : begin a = 1 ; b = 1 ; end 2‟ b10 : begin a = 0 ; b = 1 ; end 2‟ b11 : b = 1 ; default : begin a = „bx; b = „bx; end endcase endmodule

Question There is latch inferred from this code. What is the name of the latches variable and how can it be prevented?

Sandeepani www.sandeepani-vlsi.com

Initial Statements module counter (clk, q ) ; input clk ; output [ 3 : 0 ] q ; reg [3:0] q: initial q = 0 ; always @ (posedge clk) if (q > = 9) q < = 4 „ b0 ; else q <= q+1;

endmodule

module counter (clk, rst, q ) ; input clk, rat ; output [3 : 0] q ; reg [3 :0] q ; always @ (posedge clk) if (rst) q < = 4‟ b0; // synchronous reset else if (q >= 9) q < = 4‟ b0; else q<=q+1; endmodule

Question Synthesis What does this initial statement mean: Synthesizable equivalent-add 1.For simulation? reset 2.For synthesis?

Sandeepani www.sandeepani-vlsi.com

Summary • FSM is a systematic way of specifying any sequential logic • Ideally suited for complex sequential logic • Translating the problem in terms of discrete states is the “difficult” part • Define the FSM and generate the code

Sandeepani www.sandeepani-vlsi.com

Structural Modeling

Aims and Topics

Sandeepani www.sandeepani-vlsi.com

* Aims - Learn about the full capabilities of verilog for structural ,gate level modeling and modeling memories * Topics - Built in primitives - Modeling memories

Sandeepani

Structural Modeling

www.sandeepani-vlsi.com

* Pure structural model only contains instantiated modules, primitives and wire connections * Used for block diagrams, schematics, post synthesis netlist and ASIC/FPGA a nsela sel

b

out

nsel selb

module mux (a, sel, b, out); input a, sel, b; output out; wire nsela, selb, nsel; OR2 U32(.A(nsela), .B(selb), .Z(out) ); IV U33 (.A(sel), Z(nsel) ); AN2 U34 (.A(a), .B(nsel), .Z(nsela) ); AN2 U35 (.A(b), .B(sel), .z(selb) );

Conditional Primitives

Sandeepani www.sandeepani-vlsi.com

* Four different types of conditional primitives * Conditional primitives only have three pins: output, input and enable * Enabled and disabled by the enable pin - When disabled outputs are at high impedance Primitive Name bufif1 bufif0 notif1 notif0

Functionality Conditional buffer with logic 1 as enabling input Conditional buffer with logic 0 as enabling input Conditional inverter with logic 1 as enabling input Conditional inverter with logic 0 as enabling input

Sandeepani

Conditional Buffers bufif1

www.sandeepani-vlsi.com

bufif1

data

out

out

data

enable

enable

bufif1(out, data, enable) enable

bufif1(out, data, enable) enable

bufif1 0 data 1 x z

0 z z z z

1 0 1 x x

x L H x x

z L H x x

bufif0 0 1 x z

0 0 1 x x

1 z z z z

x L H x x

z L H x x

note : Verilog uses the symbols L and H to represent partially unknown logic values

Modeling a Memory Device

Sandeepani www.sandeepani-vlsi.com

A memory device must do two things : * Declare a memory of appropriate size * Provide some level of access to its contents, such as : - Read only - Read and Write - Write and Simultaneous read - Multiple reads , simultaneous to a single write - Multiple simultaneous reads and writes, with some method of ensuring consistency

Simple ROM Model „timescale 1ns / 10ps module myrom (read_data, addr, read_en_); input read_en_; input [3:0] addr; output [3:0] read_data; reg [3:0] read_data; reg [3:0] mem [0:15]; initial $readmemb (“my_rom_data“, mem); always @ (addr or read_en_) if (! read_en_) read_data = mem[addr]; endmodule

ROM data is stored in a separate file

Sandeepani www.sandeepani-vlsi.com

my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101

Simple RAM Model

Sandeepani www.sandeepani-vlsi.com

module mymem (data, addr, read, write); inout [3:0] data; input [3:0] addr; input read , write; 4 bit , 16 word array for reg [3:0] memory [0:15]; memory contents // read assign data = (read ? memory [addr] : 4’bz); // write always @ (posedge write) tr i- state controller memory[addr] = data; enabled by read endmodule rising edge triggered RAM write

Note :Simultaneous models for internal RAM/ROM usually supplied by technology vendor

Sandeepani

Scalable Memory device

www.sandeepani-vlsi.com

* Parameters can be used to scale memory models module scalable _ROM (mem_word, address); parameter addr_bits = 8; size of address bus parameter wordsize = 8; width of memory word parameter words = (1 << addr_bits); size of memory output [wordsize : 1] mem_word; input [addr_bits : 1] address; reg [wordsize : 1] mem [0 : words - 1]; // output one word of memory wire [wordsize : 1] mem_word = mem[address]; endmodule

output word

address bus memory declaration continuous assignment to output

Loading a Memory

Sandeepani www.sandeepani-vlsi.com

* ROM will need to be loaded with data * RAM may need to be initialzed * Memory can be pre - loaded via loops or from an external file // initialize memory via loop for (i = 0 ; i< memsize ; i = i+1) mema [i] = {wodsize {1 „b0}};

// load memory from a file $ readmemb (“mem_file . txt“, mema);

Using inout Ports

Sandeepani www.sandeepani-vlsi.com

module mymem (data , addr , read , write); inout [3 : 0] data; input [3 : 0] addr; input read, write; ............. assign data = (read ? memory[addr] : 4‟ bz); ................... * Bi - directional ports are declared with the inout keyword * You can not directly connect an inout port to a register * Your design should drive an inout port from only one direction at a time - To avoid bus contention - You must design logic around the inout port to ensure proper operation

Bidirectional Ports Using Primitives en_a_b

Sandeepani www.sandeepani-vlsi.com

b1

bus_a

bus_b b2

en_b_a

module bus_xcvr(bus_a , bus_b, en_a_b, en_b_a); input bus_a, bus_b; When en_a_b = 1, input en_a_b , en_b_a; primitive b1 is enabled bufif1 b1 (bus_b , bus_a , en_a_b); and the value on bus_a bufif1 b2 (bus_a , bus_b , en_b_a); is transferred to bus_b //structural module logic endmodule When en_b_a = 1, primitive b2 is enabled and the value on bus_b is transferred to bus_a

Bidirectional Ports Using Continuos Assignment en_a_b b1 bus_a

Sandeepani www.sandeepani-vlsi.com

bus_b b2

en_b_a

module bus_xcvr(bus_a , bus_b, en_a_b, en_b_a); input bus_a, bus_b; When en_b_a = 1, input en_a_b , en_b_a; this assignment drives assign bus_b = en_a_b ? bus_a : ‟bz; the value of bus_b assign bus_a = en_b_a ? bus_b : ‟bz; on to bus_a //structural module logic endmodule When en_a_b = 1, this assignment drives the value of bus_a on to bus_b

Modeling Memory Ports

Sandeepani www.sandeepani-vlsi.com

RAM cell

Test Bench rd

data bus wr module ram_cell (databus, rd, wr); input databus; input rd, wr; reg datareg; assign databus = rd ? datareg : „bz; always @ (negedge wr); datareg <= databus; endmodule

data reg

when rd = 1 the value of datareg is assigned to databus When wr deasserts the value of databus is writteb to datareg

Sandeepani www.sandeepani-vlsi.com

Gate level Modeling

Aims and Topics * Aims - Understand how to model simple delays for simulations and gate level models * Topics - Lumped delays - Distributed delays - Path delays - Specify timing blocks

Sandeepani www.sandeepani-vlsi.com

Sandeepani

Delay Modeling Types noror ASIC cell a b

c

n1

www.sandeepani-vlsi.com

1 Lump the entire delay at the last gate

net1

o1

out

3 Use a specify block to specify pin-to-pin delays for each path

2 distribute the delay across each gate Typical delay specification Delays can be modeled in three ways : delay from a to out =2 delay from b to out = 3 delay from c to out = 1

Lumped Delay

Sandeepani www.sandeepani-vlsi.com

* Lumped delays place entire delay on the last gate -Simple to implement - Does not allow for different path delays a b path delay as modeled a -> out is 3 out b -> out is 3 c #3 c -> out is 3 „timescale 1ns / 1ns module noror (out, a, b, c); output out; input a, b, c; nor n1 (net1, a, b); or #3 o1 (out, c, net1); endmodule

Distributed Delays

Sandeepani www.sandeepani-vlsi.com

* distributed delays divide delay over more than one gate - Allows different delays for different paths - Delays accumulate along the path a b

c

#2

#1

path delay as modeled a -> out is 3 out b -> out is 3 c -> out is 1

„timescale 1ns / 1ns module noror (out, a, b, c); output out; input a, b, c; nor #2 n1 (net1, a, b); or #1 o1 (out, c, net1); endmodule

Module Path Delays

Sandeepani www.sandeepani-vlsi.com

* Specify block allows individual path delay to be defined - Paths from the inputs to outputs of a module a b

c

n1

net1

o1

path delays a -> out is 2 out b -> out is 3 c -> out is 1

The Specify Block module noror (out, a, b, c); output out; input a, b, c; nor n1 (net1, a, b); or o1 (out, c, net1); specify (a => out) = 2; (b => out) = 3; (c => out) = 1; endspecify endmodule

Sandeepani www.sandeepani-vlsi.com

* Specify block defines module timing data - Separates timing information from functionality * Typical tasks for specify block: - Define module timing paths - Assign delays to those paths - Perform timing checks * Module parameters can not be used in a specify block - Specify blocks use a special “specify parameter“ (specparam) - See later .............

Specify Block Parameters Module noror (op. a, b, c); output op; input a, b, c; nor n1 (net1, a, b); or o1 (op, c, net1); specify

specparam aop = 2; bop = 3; cop = 1; (a => op) = aop; (b => op) = bop; (c => op) = cop; endspecify endmodule

Sandeepani www.sandeepani-vlsi.com

* Specparam declares parameters for specify block * Must be declared inside specify block - Only visible inside block * Cannot be over-ridden like parameters * Parameters cannot be used inside a specify block - Must use specparam

Accurate Delay Control

Sandeepani www.sandeepani-vlsi.com

*Rise, fall and turn-off delays can be specified for gates and module paths - Rise is transition to 1 - Fall is transition to 0 - Turn-off is transition to z and # (2, 3) (out, in1, in2, in3); // rise, fall bufif0 #(3, 3, 7) (out, in, ctrl); // rise, fall. turn-off spacify (in => out) = (1, 2); // rise, fall (a = > b) = (5, 4, 7); // rise, fall, turn-offs endspecify

* Minimum , typical and maximum values can be specified for each delay - Syntax - (minimum : typical : maximum) or # (3 . 2 : 4 . 0 : 6 . 3) o1 (out, in1, in2); // min : typ : max not # (1 : 2 : 3, 2 : 3 : 5) (o, in); // min : typ : max for rise, fall specify // min:typ:max for rise, fall and turn-off (b => y) = (2 : 3 : 4, 3 : 4 : 6, 4 : 5 : 8); endspecify

Parallel and Full Connection Module PathsSandeepani www.sandeepani-vlsi.com

* => represents parallel connection - Must be between ports must be of the same size * * > represents full connection - All listed inputs connect to all listed outputs Full module path Parallel module path q output q output input a input a bits b bits bits b qb bits qb 2 paths 4 paths Bit - to - bit connections Bit - to - vector connections Use => to define path Use *> to define path (a, b *> q, qb) = 15; (a, b => q, qb) =15; is equivalent to is equivalent to (a => q ) = 15; (a => q ) = 15; (b => q ) = 15; (b => qb ) =15; (a => qb ) = 15; (b => qb ) = 15;

State Dependent Path Delays

Sandeepani www.sandeepani-vlsi.com

* State dependent path delay are assigned to module path only if a specific condition is true - Note : not an if statement - no else is allowed.... module jexor (op, a, b); input a, b; output op; xor (op, a, b); specify if (a) (b => op) = (5 : 6 : 7); if (!a) (b => op) = (5 : 7 : 8); if (b) (a => op) = (4 : 5 : 7); if (!b) (a => op) = (5 : 7 : 9); endspecify endmodule

a

b

op

Sandeepani www.sandeepani-vlsi.com

User Defined Primitives

Sandeepani www.sandeepani-vlsi.com

AIMS AND TOPICS Aims * Learn how to build logic using user defined primitives

Topics * Understand verilog composite libraries * Understand functional modeling of ASIC libraries * Learn about the use of UDPs in ASIC library models

WHAT IS A UDP ?

Sandeepani www.sandeepani-vlsi.com

Verilog has over two dozen gate level primitives for modeling structural logic . In addition to these primitives Verilog has user defined primitives (UDPs) that extend the built in primitives by allowing you to define logic in tabular format. UDPs are useful for ASIC library cell design as well as small scale chip and medium scale chip design * You can use UDPs to augment the set of predefined primitive element s * UDPs are self contained , they do not instantiate other modules * UDPs can represent sequential as well as combinational elements * UDP behavior is described in a truth table * To use a UDP you instantiate like a built in primitive

FEATURES

Sandeepani www.sandeepani-vlsi.com

* UDPs can have only one output * UDPs can have 1 to 10 inputs * All ports must be scalar and no bi-directional ports are allowed * The Z logic value is not supported * The output port must be listed first in the port list * The UDP output terminal can be initialized to a known value at the start of simulation * UDP can not be synthesized

COMBINATIONAL EXAMPLE : 2 - 1 MULTIPLEXER Sandeepani The output port must be the This is the first port name of the primitive multiplexer (o, a, b, s); primitive output o; input a, b, s; table // a b s : o 0 ? 1 : 0; 1 ? 1 : 1; ? 0 0 : 0; ? 1 0 : 1; 0 0 x : 0; 1 1 x : 1; These entries endtable reduce pessimism endprimitive www.sandeepani-vlsi.com

* UDP definitions occur outside of a module * The output becomes x for any input combination not specified in table

COMBINATIONAL EXAMPLE : FULL ADDER

Cin A B

G4 G3

Cin A B

www.sandeepani-vlsi.com

Sum

G2

G1

Sandeepani

G5

Cout

U_ADDR2_S

Sum

U_ADDR2_C

Cout

You can implement the full adder with only two combinational UDPs cont........next...

Sandeepani www.sandeepani-vlsi.com

//FULL ADDER CARRY- OUT TERM primitive u_addr2_c (co, a, b, ci); output co; input a, b, ci; table a b ci : co 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtable endprimitive

//FULL ADDER SUM TERM primitive u_addr2_s (s, a, b, ci); output s; input a, b, ci; table //

a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

endtable endprimitive

ci : 0 : 1 : 0 : 1 : 0 : 1 : 0 : 1 :

s 0; 1; 1; 0; 1; 0; 0 1

Sandeepani

LEVEL - SENSITIVE SEQUENTIAL EXAMPLE : LATCH

primitive latch ( q, clock, data); output q; reg q; input clock, data; initial q = 1‟ b1; table // clock data current next // state state 0 1 : ? : 1; 0 0 : ? : 0; 1 ? : ? : - ; endtable endprimitive The ? is used to represent don‟t care conditions in the inputs and current state

www.sandeepani-vlsi.com

Note the use of a register for storage The output is initialized to 1‟ b1

Notice the additional field used to specify a next state

EDGE - SENSITIVE SEQUENTIAL EXAMPLE : D FLIP - FLOP primitive d_edge_ff ( q, clk, data ); output q; input clk, data; reg q table // clk dat state next : (01) 0 : ? : 0 ; (01) 1 : ? : 1 ; (0x) 1 : 1 : 1 ; (0x) 0 : 0 : 0 ; (x1) 0 : 0 : 0 ; (x1) 1 : 1 : 1 ; // ignore negative edge of clock (?0 ) ? : ? : - ; (1x) ? : ? : - ; // ignore data changes on steady clock ? (??) : ? : - ; endtable endprimitive

Sandeepani www.sandeepani-vlsi.com

SHORTHAND TO IMPROVE READABILITY

Sandeepani www.sandeepani-vlsi.com

Verilog has symbols that can be used in UDP table to improve readability Symbol

Interpretation

Explanation

b

0 or 1

Any known value

r

( 01)

0 -> transition

f

( 10 )

1 -> 0 transition

p

( 01) or ( 0x ) or ( x1) Any positive edge,including unknowns

n

( 10 ) or ( 1x ) or ( x0 ) Any negative edge,including unknowns

*

( ?? )

Any transition

SUMMARY

Sandeepani www.sandeepani-vlsi.com

* UDPs allow you to create your own primitives to extend those built in to Verilog - Behavior is defined using a table - UDPs are instantiated like built - in primitive * They are a compact, efficient method of describing logic functions - Both combinational and sequential behavior can be described - UDPs are self - contained - Many built - in primitives can be replaced by a single UDP * There are some restrictions on using UDPs, including :- There must be a separate UDP for every output - The Z value is not supported hence UDP ports can not be bi - directional - UDPs are not synthesisable

Sandeepani www.sandeepani-vlsi.com

Verification Overview

Sandeepani www.sandeepani-vlsi.com

Objectives After completing this module ,you will be able to..

•Understand verification flow •Testbench structure

•Different ways of generating vectors

Sandeepani www.sandeepani-vlsi.com

Outline Introduction Vector generation

Simulation tips summary

Sandeepani www.sandeepani-vlsi.com

Verification Flow System Specifications

TB

RTL

Test Pass

Yes

Sandeepani www.sandeepani-vlsi.com

Introduction Purpose of writing testbench: •Instantiate the hardware model under test

•Generate stimulus waveforms in the form of functional test vectors during simulation •Generate expected waveforms in the form of reference vector and compare with the output from RTL model •Pass or fail indication

Sandeepani www.sandeepani-vlsi.com

Introduction Testbench Structure

MODEL UNDER TEST Stimulus Output

Vectors

Vectors

WAVE FORM Reference Vectors Test vectors File

GENERATION

COMPARE RESULTS

Results Files

Sandeepani www.sandeepani-vlsi.com

Outline Introduction Vector generation

Simulation tips summary

Sandeepani www.sandeepani-vlsi.com

Vector generation

•Generate vectors “on-the-fly” •Read vectors from files •Writing vectors to a test file

Sandeepani www.sandeepani-vlsi.com

Vector generation Different ways of generating system waveforms a) Use continuous loops for repetitive signals b) Use assignments for signals with few transitions c) Use relative or absolute time generated signals d) Use loop constructs for repetitive signal patterns

Sandeepani www.sandeepani-vlsi.com

Vector generation

Reading test vectors from file

Writing vectors to a text file

Sandeepani www.sandeepani-vlsi.com

Outline Introduction Vector generation

Simulation tips summary

Sandeepani www.sandeepani-vlsi.com

Simulation tips Simulate Corner Cases only Use code coverage tools Use the triple equals Use the $display and $stop statements

Sandeepani www.sandeepani-vlsi.com

Summary

Verification flow Testbenches Simulation tips

Sandeepani www.sandeepani-vlsi.com

Verilog Testbenches

Sandeepani www.sandeepani-vlsi.com

Aims and Topics * Aims Learn coding styles and methods that are commonly used to create a test bench * Topics - Simulation behavior - Testbench organization - Stimulus - Clock generation

Sandeepani

Design Organization

www.sandeepani-vlsi.com

vendor libraries

include files simulator design files

file input: stimulus expects patterns

compilation

simulation

data clk read write

file output: stimulus results patterns

Sandeepani

Simulation of a Verilog Model initial avec = ---------

procedure

compilation

procedure

procedure

initialization procedure

x

x

x procedure procedure

l

o x

simulation procedure

procedure

www.sandeepani-vlsi.com

z

Testbench

Testbench Organization

stimulus

Design to verify

Testbench stimulus verify

results

Design to verify

Sandeepani www.sandeepani-vlsi.com

* Simple testbench - Just send data to desgin - No interaction - Few Processes * Sophisticated testbench - Models environment around designs - Talks to design - Evolves towards system model - self - checking

“In Line“ Stimulus module inline_tb; reg (7:0) data_bus, addr; reg reset; // instance of DUT initial begin reset = 1‟bo; data_bus = 8‟hoo; # 5 reset = 1‟b1; #15 reset = 1‟bo; #10 data_bus = 8‟h45; #15 addr = 8‟hf0; #40 data_bus = 8‟h0f; end endmodule

Sandeepani www.sandeepani-vlsi.com

* Variables can be listed only when their values change * Complex timing relationships are easy to define * A test bench can become very large for complex tests

Stimulus From Loops module loop_tb; reg clk; reg [7:0] stimulus; integer i; //instance of DUT //clock generation initial begin for(i = 0; i<256; i = i+1) @(negedge clk) stimulus = i; end endmodule

Sandeepani www.sandeepani-vlsi.com

* The same set of stimulus variables are modified in every iteration * Easy to enter * Compact Description * Timing relationships regular in nature * Best for stimulus:- Regular values - Set time period

**Important Do not forget to insert timin control in the loop

Sandeepani www.sandeepani-vlsi.com

Simple Delays

initial clk=0; always clk = ~clk; Will above code generate clk?

Sandeepani www.sandeepani-vlsi.com

Simple Delays

always #10 clk = ~clk;

#< value> provides simple time delay This is useful in providing timing for - Stimulus in testbenches - propagation delays in gate level simulation models

Summary

Sandeepani www.sandeepani-vlsi.com

* There are several Verilog constructs which are very useful in testbench construction e.g. * Several methods of applying stimulus have been examined:- In-line stimulus from an initial block - Stimulus from loop - Creating clocks

Sandeepani www.sandeepani-vlsi.com

System Control Objective:Describe some of the compiler directives , system tasks and system functions available in Verilog

Topics:

Text output Simulation control

Sandeepani www.sandeepani-vlsi.com

$display •

displays specified variables on execution -Example: reg[7:0]in_bus; ……… #10; $display(“At time %d in_bus is %h”,$time,in_bus) …… • Output: At time 10 in_bus is 1f

Sandeepani www.sandeepani-vlsi.com

$monitor -displays all values in the list each time any of them changes -$monitor($time, " A = %b B = %b CIN = %b SUM = %B CARRY = %b", A,B,CIN,SUM,CARRY);

Sandeepani www.sandeepani-vlsi.com

$monitor module TB_FULL_ADD; reg A, B, CIN; wire SUM, CARRY; FULL_ADD U1(A, B, CIN, SUM, CARRY); initial begin $monitor($time, " A = %b B = %b CIN = %b SUM = %B CARRY = %b", A,B,CIN,SUM,CARRY); A = 0; B = 0; CIN = 0; #5 A =1;B = 0; CIN = 0; #5 A =0;B = 1; CIN = 0; #5 A =1;B = 1; CIN = 0; #5 A =0;B = 0; CIN = 1; #5 A =1;B = 0; CIN = 1; #5 A =0;B = 1; CIN = 1; #5 A =1;B = 1; CIN = 1; #5 $finish; end

endmodule

Sandeepani www.sandeepani-vlsi.com

$monitor Monitor list for full adder test bench

0 a=0 b=0 CIN=0 SUM =0 CARRY=0 5 a=1 b=0 CIN=0 SUM =1 CARRY=0 10 a=0 b=1 CIN=0 SUM =1 CARRY=0 15 a=1 b=1 CIN=0 SUM =0 CARRY=1 20 a=0 b=0 CIN=1 SUM =1 CARRY=0 25 a=1 b=0 CIN=1 SUM =0 CARRY=1 30 a=0 b=1 CIN=1 SUM =0 CARRY=1 35 a=1 b=1 CIN=1 SUM =1 CARRY=1 $finish at simulation 40

Sandeepani www.sandeepani-vlsi.com

$monitor

$monitoron //switches monitor on $monitoroff //switches monitor off

Sandeepani www.sandeepani-vlsi.com

Simulation control simulation flow

#200 $stop;

simulation suspends at time 200

#1000 $finish;

simulation terminates at time 1000

Sandeepani www.sandeepani-vlsi.com

Compiler directives `include Example:file “global.txt”

//clock and simulator constants Parameter initial_clk=1; Parameter period=20; Parameter max_cycle=5; Parameter end_time=period*max_ cycle

Sandeepani www.sandeepani-vlsi.com

Compiler directives:Example Usage: Module clock_gen; `include “global.txt” always begin $monitor( $time,”\t clk=%d”,clk); clk=initial_clk; while ($time<end_time) begin #(period/2) clk=~clk ; end $display($time,”simulation ends”) $finish; End endmodule

Sandeepani www.sandeepani-vlsi.com

More compiler directives `define add16 reg[15:0]

`add16 input adress;

`timescale 10ns/1ns

#10 clk =~clk

10 time units =100ns

add16 can be interpreted as reg[15:0] interpreted as reg[15:0] input address 10ns is the time unit for the block and these are rounded off to a 1ns precision

Sandeepani www.sandeepani-vlsi.com

File outputs 32 channels available 32‟h000_0001

channel descriptor for standard output(bit 0 set)

32‟h000_0800

channel descriptor for 11th channel (bit 11 set)

Sandeepani www.sandeepani-vlsi.com

$fopen, $fclose $fopen integer chan_num1,chan_num2;

declaration of channel descriptors Chan_num1=$fopen(“file1.out”); Chan_num2=$fopen(“file2.out”); Chan_num1=32h0000_0002(bit 1 set) Chan_num2=32h0000_0004(bit 2 is set)

Sandeepani www.sandeepani-vlsi.com

Writing into file integer chan_num1; initial begin chan_num1=$fopen(“file1.out”); $fmonitor(chan_num1,$time,”add_in=%d,add_out=%b”, add_in,add_out); monitor results go to file1.out

Sandeepani www.sandeepani-vlsi.com

Writing into multiple file integer chan_num1,chan_num2,mdesc; initial begin chan_num1=$fopen(“file1.out”); chan_num2=$fopen(“file2.out”); mdesc= chan_num1 | chan_num2; $fmonitor(mdesc,$time,”add_in=%d,add_out=%b”, add_in,add_out);

monitor results are written to file1.out and file2.out Files can be closed using $fclose

Sandeepani www.sandeepani-vlsi.com

$readmemb and $readmemh module mem8x8; reg [0:7] mem8x8 [0:7]; integer chan_num1, i; initial begin $readmemb("init8x8.dat", mem8x8); chan_num1 = $fopen ("mem8x8.out"); for (i = 0; i < 8; i = i + 1) $fdisplay(chan_num1, "memory [%0d] = %b", i, mem8x8[i]); $fclose(chan_num1); end endmodule

Sandeepani www.sandeepani-vlsi.com

init8X8.dat @2 11111111 10101010 00000000 @6 Xxxxzzzz 1x1x1x1x

start address specified with @ consecutive data applies to consecutive address

Sandeepani www.sandeepani-vlsi.com

mem8x8.out memory[0]=xxxxxxxx memory[1]=xxxxxxxx memory[2]=11111111 memory[3]=10101010 memory[4]=00000000 memory[5]=xxxxxxxx memory[6]=xxxxzzzz memory[7]=1x1x1x1x

address 0,1 and 5 were not initialized (==x)

Sandeepani www.sandeepani-vlsi.com

Tasks and Functions

Sandeepani www.sandeepani-vlsi.com

Tasks and Functions • Subprograms -Encapsulate portions of repeated code -Sequential statements -Execute in sequence like „software‟

• Task - Zero or more input/outputs - Is a procedural statements • Function - Multiple inputs, single return value - Can only be used as part of assignment

Sandeepani www.sandeepani-vlsi.com

Task Declaration and call task zero_count;

(Task name)

input [7:0]in_bus; output [3:0] count; integer i;

begin count=0; #5; for (i=0;i<8;i=i+1) if(!in_bus[i]) count=count+1; end endtask

1.Task call is a procedural statement //input arguments //output arguments //Local variable

//assign outputs

Sandeepani www.sandeepani-vlsi.com

Task Declaration and call module zerotask(); reg[7:0] a_bus; reg clk; reg [3:0] a_count; reg a_zero; //task declaration initial begin clk=0; a_bus=8'b00011111; end always # 20 clk =~clk ;

Sandeepani www.sandeepani-vlsi.com

Task Declaration and call always @(posedge clk) begin zero_count (a_bus, a_count); if ( a_count == 4'b0010) a_zero=1'b1; else a_zero=1'b0; end endmodule

Sandeepani www.sandeepani-vlsi.com

Multiple Task calls • Tasks can be called from more than one location • Tasks are not duplicated like sub-routines - only one copy of tasks exists • Avoid simultaneous concurrent calls -Can cause conflict with task variables abd input/output arguments ,Example……

Sandeepani www.sandeepani-vlsi.com

Multiple Task calls task neg_edge; input [31:0] no_of_edges; begin repeat(no_of_edges) @(negedge clk); end endtask

Sandeepani www.sandeepani-vlsi.com

Multiple Task calls module multiple_task_calls; reg clk; reg p;

initial begin clk=1; p=0; end always #50 clk=~clk; initial begin neg_edge(4); p=1; end

Sandeepani www.sandeepani-vlsi.com

Multiple Task calls always @(posedge clk) begin neg_edge(10); p=0; end endmodule

Sandeepani www.sandeepani-vlsi.com

Task Calls from Different Modules module mytasks; task neg_edge; input [31:0] no_of_edges; begin repeat(no_of_edges) @(negedge clk); end endtask Task cpu_driver; …. ……. … endmodule

Sandeepani www.sandeepani-vlsi.com

Task Calls from Different Modules //test bench

module test_busif; reg clk; //clock generation ……. //instantiation of task module mytask m1 ( ) ; //creating stimulus.. Initial begin m1.neg_clocks(6); m1.cpu_driver(8‟h00); …… end endmodule

Sandeepani www.sandeepani-vlsi.com

Disabling tasks and named blocks • Tasks or named blocks can be disabled - Here in Ex.if CPU interrupt is detected the cpu_driver task is forced to exit -The CPU interrupt can then be sreviced - Does not prevent subsequent task calls • Named blocks are disabled in the same way • Example follows…..

Sandeepani

Disabling tasks and named blocks module test_busif; … always #20 clk=~clk; ….. initial begin: stimulus neg_clock(5); cpu_driver(8‟h00); cpu_driver(8‟hff); …… always @(posedge interrupt) begin disable cpu_driver; service_interupt; end endmodule

www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Task without timing controls • A Task normally contains timing…… • But without timing controls it executes in zero time • A task without timing control can be always be expressed as a function Example follows…..

Sandeepani www.sandeepani-vlsi.com

Task without timing controls task zero_count input [7:0]in_bus; output [3:0] count; integer i; begin count=0; for (i=0;i<8;i=i+1) if(!in_bus[i]) count=count+1; end endtask

function integer zero_count; input [7:0]in_bus; integer i; begin zero_count=0; for (i=0;i<8;i=i+1) if(!in_bus[i]) zero_count=zero_count+1; end endfunction

Sandeepani www.sandeepani-vlsi.com

Function Declaration function integer zero_count; input [7:0]in_bus; integer i; begin zero_count=0; for (i=0;i<8;i=i+1) if(!in_bus[i]) zero_count=zero_count+1; end endfunction

Sandeepani www.sandeepani-vlsi.com

function Call module zfunct (a_bus,b_bus,clk,azero,b_count); input[7:0] a_bus,b_bus; input clk; output azero, b_count; reg azero; Wire[3:0] b_count; //function declaration assign b_count=zero_count(b_bus); always @(posedge clk) if(zero_count(a_bus)==32‟0) azero=1‟b1; else azero=1‟b0 endmodule

Sandeepani

Functions

www.sandeepani-vlsi.com

•Function can enable other functions but not another task •Functions always execute in zero simulation time •Functions cannot include delays,timing or timing control statements

•Functions must have at least one input argument •Functions return a single value.they cannot have output or inout arguments

Sandeepani www.sandeepani-vlsi.com

Examples 1.Write a function to add two 4 bit numbers 2.Write task for the waveform specification given below: 3.Write task to count number of clock cycles 4.Write task to load time in alarm clock design

Sandeepani www.sandeepani-vlsi.com

Verilog PLI

Sandeepani www.sandeepani-vlsi.com

Outline Introduction PLI Interface TF/ACC Routines Creating PLI Applications

Summary

Sandeepani www.sandeepani-vlsi.com

Introduction • Verilog Programming Language Interface is one of the most powerful features of Verilog • PLI provides both H/S designers to interface their programs to commercial Verilog simulators

Sandeepani www.sandeepani-vlsi.com

Introduction Generations of PLI IEEE 1364 Verilog – TF / ACC routines.

PLI 1.0

1990

– VPI routines

PLI 2.0

1993

Introduction Capabilities of Verilog PLI

• Access to programming language libraries • Simulation analysis……

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Outline Introduction PLI Interface TF/ACC Routines Creating PLI Applications Summary

Sandeepani www.sandeepani-vlsi.com

PLI Interface User Design Representation

Invokes UserDefined System Task

And Stimulus Pass data Verilog Compilation

Internal design Representation (Data Structures)

Access Internal structures

User Defined System Task #1 User-Defined System Task #2 User-Defined System Task #3 Invokes UserPLI Library defined C Routines routine User-Defined C routine # 1 User-Defined C routine # 2 User-Defined C routine #3

Simulation

Simulation Output

PLI Library Routines to do Miscellaneous Operations

Sandeepani www.sandeepani-vlsi.com

Objects in Verilog •

Module instances, ports, pin-to-pin paths, intermodule paths



Top-level modules



Primitive instances, terminals

• Nets, registers, parameters, specparams • Integer,time and real variables

• Timing checks & Named events

Sandeepani www.sandeepani-vlsi.com

Conceptual Internal Representation a Module

Sandeepani www.sandeepani-vlsi.com

Example Example: 2-to-1 Multiplexer

Sandeepani www.sandeepani-vlsi.com

Sandeepani www.sandeepani-vlsi.com

Internal Data Representation of 2-to-1 Multiplexer

Sandeepani www.sandeepani-vlsi.com

Outline Introduction PLI Interface TF/ACC Routines Creating PLI Applications Summary

Sandeepani www.sandeepani-vlsi.com

TF/ACC Routines Role of Access and Utility Routine

Sandeepani www.sandeepani-vlsi.com

Outline Introduction PLI Interface TF/ACC Routines Creating PLI Applications

Summary

Sandeepani www.sandeepani-vlsi.com

General steps to create PLI applications 1. Define system task / function 2. Write C language routine 3. Register system task/function name and associate C language routine with Verilog simulator 4. Compile C source file which contains PLI application & link object files into Verilog simulator.

Some useful tf routines

Sandeepani www.sandeepani-vlsi.com

•int tf_nump()-Returns number of arguments in system task

•int tf_typep(n)- Returns constants that reps.data type

•viod tf_error()-Prints error massage & causes simulation to abort

Sandeepani www.sandeepani-vlsi.com

Some useful ACC Routines •handle acc_handle_tfarg(n)-Returns pointer to system t/f handle •int acc_fetch_type(object)- Returns constant that identifies type of argument •char *acc_fetch_fullname(object)-Returns fulltype property of object

•char *acc_fetch_value(object,format_str,value)-Return value of verilog object

Sandeepani www.sandeepani-vlsi.com

PLI application example • $show_value Uses PLI to access specific activity within a Verilog simulator, by listing the name and current value of net • This system task $show_value illustrates using PLI to allow a C routine to read current logic values within a Verilog simulation

Sandeepani www.sandeepani-vlsi.com

Step I module test; reg a, b, ci; wire sum, co; ... initial begin ... $show_value (sum); end endmodule

Sandeepani www.sandeepani-vlsi.com

Step II Two user-defined C routines will be associated with $show_value: • A C routine to verify that $show_value has the correct type of arguments • A C routine to print the name and logic value of the signal

Sandeepani www.sandeepani-vlsi.com

Writing a checktf routine for $show_value # include “veriuser.h” library */ # include “acc_user.h” library */ Int ShowVal_checktf( ) { int arg_type; handle arg_handle;

/* IEEE 1364 PLI TF routine /* IEEE 1364 PLI ACC routine

if (tf_nump( ) != 1) tf_error (“$show_value must have 1 argument.”); else if (tf_typep(1) == TF_NULLPARAM) tf_error (“$show_value arg cannot be null.”); …contd

Sandeepani www.sandeepani-vlsi.com

Writing a checktf routine for $show_value else { arg_handle = acc_handle_tfarg(1); arg_type = acc_fetch_type(arg_handle); if (! (arg_type == accNet || arg_type == accReg) ) tf_error (“$show_value arg must be a net or reg.”); } return (0); }

Sandeepani www.sandeepani-vlsi.com

Writing a calltf routine for $show_value # include “veriuser.h” # include “acc_user.h” int ShowValCalltf( ) { handle arg_handle; arg_handle = acc_handle_tfarg(1); io_printf (“Signal %s has the value %s \n”, acc_fetch_fullname(arg_handle), acc_fetch_value(arg_handle, “%b”, null) ); return (0); }

Sandeepani www.sandeepani-vlsi.com

Step III : Registering the system task/function Interface mechanism • The type of application which is a system task or system function • The system task or system function name • The name of the calltf routine and other C routines associated with the system task/function. • Other information about the system task/function required by simulator

Sandeepani www.sandeepani-vlsi.com

The default standard veriusertfs array s_tfcell veriusertfs [ ] = { { type, user_data, checktf_app, sizetf_app, calltf_app, mistf_app, “tf_name”, 1, 0, 0 }, { type, user_data, checktf_app, sizetf_app, calltf_app, misctf_app, “tf_name”, 1, 0, 0 }, ...

{ 0 }, /* first field in final array cell is 0 */ };

Sandeepani www.sandeepani-vlsi.com

S-tfcell structure definition is: typedef struct t_tfcell { short type;

function */ short data; int (*checktf) ( ); int (*sizetf) ( ); int (*calltf) ( ); int (*misctf) ( ); char *tfname; int forwref; char *tfveritool; char *tferrmessage; } s_tfcell, *p_tfcell;

/* one of the constants: usertask, user function, user real /* data passed to use routine */ /* pointer to the checktf routine */ /* pointer to the sizetf routine */ /* pointer to the calltf routine */ /* pointer to the misctf routine */ /* name of the system task/function */ /* usually set to 1 */ /* usually ignored */ /* usually ignored */

Sandeepani www.sandeepani-vlsi.com

Example veriusertfs array for registering TF/ACC applications /* prototypes for the PLI application routines */ extern int Showval_checktf( ), pow_sizetf( ); extern int pow_checktf( ), pow_sizetf( ), pow_calltf( ), pow_misctf( ); /* the veriusertfs array */ s_tfcell veriusertfs [ ] = { { usertask, 0, ShowVal_checktf

/* type of PLI routine */ /* user_data value */ /* checktf routine */

Sandeepani www.sandeepani-vlsi.com

Interfacing PLI Application Example veriusertfs array for registering TF/ACC applications

}, {

0,

/* sizetf routine */

ShowVal_calltf, 0, “$show_value”, 1

/* calltf routine */ /* misctf routine */ /* system task/function name */ /* forward reference = true */ /* type of PLI routine */ /* user_data value */ /* checktf routine */ /* sizetf routine */ /* calltf routine */

Sandeepani www.sandeepani-vlsi.com

Example veriusertfs array for registering TF/ACC applications

/* misctf routine */ /*system task/function

};

name 1 },

/* forward reference = true

{0}

/*** final entry must be 0

Sandeepani www.sandeepani-vlsi.com

Interfacing PLI Application Compiling and linking PLI applications cl –c –I <simulator path>\include link -dll –export:veriusertfs <simulator path>\ Win32\mtipli.lib

Sandeepani www.sandeepani-vlsi.com

A test case for $show_value `timescale 1ns / 1ns module test; reg a, b, ci, clk; wire sum, co; addbit i1 (a, b, ci, sum, co); initial begin a = 0; b = 0; ci = 0; #10 a = 1; …contd

Sandeepani www.sandeepani-vlsi.com

$show_value(sum); $show_value(co); $show_value(i1.n3); #10 $stop; $finish; end Endmodule

Sandeepani www.sandeepani-vlsi.com

Output from running the $show_value test case Compiling source file “show_value_test.v” Highest level modules: Test

Signal test.sum has the value 1 Signal test.co has the value 0 Signal test.11.n3 has the value 0 L32 “show_value_test.v”: $stop at simulation time 20

Sandeepani www.sandeepani-vlsi.com

Thank You

Sandeepani www.sandeepani-vlsi.com

Verilog Sample Design

Sandeepani www.sandeepani-vlsi.com

Aims and Topics • Aims – To review basic Verilog concepts and code structures – To explore a real life example

• Topics – – – – –

FIFO (First-in First-out) design specification Implementation Module declarations Functional code Testbench design and implementation

FIFO Specification

Sandeepani www.sandeepani-vlsi.com

• FIFO design is a register block at the end of a data path • FIFO is synchronous – Data is read and written on rising edge of clock – Asynchronously resetable

• When write enable is high, data is written into FIFO and stored • When read enable is high, data is read from FIFO – In the same order that it was written

• Both enable lines are not allowed to be active in the same clock cycle – If this occurs, both read and write operations are suppressed

• When the FIFO is full, set f_full high and ignore write operations • When the FIFO is empty, set f_empty high and ignore read operations • FIFO should be parameterisable for data width and FIFO

Sandeepani www.sandeepani-vlsi.com

FIFO Implementation  Use register array for FIFO contents  Array accessed by write and read pointers Status of FIFO derived  from pointer addresses  FIFO full  FIFO empty

0 1

2 3 .

three wr_ptr

.

.

.

. .

n FIFO width

rd_ptr

rd_ptr

.

FIFO length

Read pointer follows write and accesses data in same order as written

wr_ptr FIFO write: assign data to current write pointer & increment wr_ptr

Sandeepani www.sandeepani-vlsi.com

FIFO Model Structure module fifo (data_in, data_out, clock, reset, wr_en, rd_en, f_full, f_empty); // parameter declarations // input declarations // output declarations // register declarations // internal variable declarations // functional code // clocked procedures // combinational procedures endmodule

Sandeepani www.sandeepani-vlsi.com

Design Constants • Parameters used to 0 1 2 3 . . . . . . LENGTH-1 define data and 0 address width 1 •Must be declared 2 before input/output . . ports • Values can be changed WIDTH-1 in module instantiation rd_ptr[ADDRESS_WIDTH-1 : 0] module fifo (data_in, …… // parameter declarations parameter WIDTH = 8; parameter ADDRESS_WIDTH = 5; parameter LENGTH = (1 << ADDRESS_WIDTH ); … // 16 location fifo of 16 bit data fifo #(16,4) fifo16x16. (…

Sandeepani www.sandeepani-vlsi.com

FIFO I/O module fifo (data_in, data_out, clock, reset, wr_en, rd_en, f_full, f_empty // parameter declarations parameter WIDTH = 8; parameter ADDRESS_WIDTH 5; parameter LENGTH = (1 << ADDRESS_WIDTH ); // input declarations input [WIDTH-1:0] data_in; input clock, reset; input wr_n, rd_en;

data_in

data_out WIDTH

wr_en // output declarations output f_full; output f_empty; output [WIDTH-1:0] data_out;

rd_en

reset // register declarations // internal variable declarations // functional code endmodule

clock

fifo

WIDTH f_full f_empty

Sandeepani

Register and Internal Variable Declarations module fifo……. // parameter declarations parameter WIDTH = 8; parameter ADDRESS_WIDTH = 5; parameter LENGTH = (1 << ADDRESS_WIDTH); // input and output declarations // FIFO array declaration reg [WIDTH – 1:0] fiforeg [LENGTH – 1:0]; // pointer declarations reg [ADDRESS_WIDTH – 1:0] wr_ptr; reg [ADDRESS_WIDTH – 1:0] rd_ptr;

wr_ptr rd_ptr

www.sandeepani-vlsi.com

fiforeg 0 1 2 3 . . . . . . .

. . . . . . . . . .

// integer needed with for loops integer I;

LENGTH-1.

[WIDTH –1 :0] // functional code. endmodule

FIFO Functional Code

Sandeepani www.sandeepani-vlsi.com

always @ (posedge clock or posedge reset) if (reset) • Clocked procedure begin rd_ptr < = {ADDRESS_WIDTH {1‟b0}}; describes functionally wr_ptr < = {ADDRESS_WIDTH {1‟b0}}; for:•Reset for (I = 0; I < LENGTH; I = I + 1) •Pointer updates fiforeg[1] < = {WIDTH {1;B0}}; •Writing to FIFO array end else Clocked procedure begin Uses non-blocking if (rd_en && (!wr_en) && (!f_empty)) assignment rd_ptr < = rd_ptr + 1; if ((rd_en) && wr_en && (if_full)) begin fiforeg[wr_ptr] < = data_in; wr_ptr < = wr_ptr + 1 ; end end

read operation: increment read pointer write operation: write data at current pointer and update pointer

Sandeepani www.sandeepani-vlsi.com

FIFO Outputs

Module fifo ……

If write pointer cather read pointer FIFO full

/ / declarations / / clocked procedure / / full and empty pointers assign and empty pointers assign f_full = ( ( rd_ptr – wr_ptr) = = 5‟b000001); assign data_out= fiforeg[rd_ptr]; End module • Outputs are combinational

If read pointer catchers write pointer, FIFO empty

Sandeepani www.sandeepani-vlsi.com

Testbench

• Instantiates and connects Design Under Test (DUT) •Applys stimuli to input data and control ports •Monitors output ports to check for correct behavior for given stimuli

•Monitors output ports to check for correct behaviour for given stimuli - may be done via waveform display in simulator

Sandeepani www.sandeepani-vlsi.com

DUT Instantiation

module fifo_tb;

• fifo is the reference name of the

/ / Data type declaration

module under test

/ / FIFO instantiation fifo # (WIDTH, ADDRESS_WIDTH) dut ( .data_in (data_in) .data_out (data_out), .clock

(clock)

.reset

(reset)

.wr_en

(rd_en)

.f_full

(f_full),

.f_empty

(f_empty)

/ / Apply stimuls endmodule

•dut is the name of this instance •FIFO parameters are reassigned in the instantiation •Named port connection used to link FIFO ports to local variables -Syntax .port (variable) •Local variables and parameters must be defined

Question Why are there no ports for the test fixture ?

Sandeepani www.sandeepani-vlsi.com

Testbench Declarations module fifo_tb Parameter WIDTH =8; Parameter ADDRESS_WIDTH = 5: Parameter PERIOD = 10;

/ / input declarations

reg [WIDTH-1:0] data; reg clock, wr_en, rd_en, reset;

/ / output declarations

wire f_full; Wire f_empty; wire endmodule

Sandeepani www.sandeepani-vlsi.com

Describing Stimulus initial begain

Initial clock = 1‟b0; Always # PERIOD clock = - clock,

data = { WIDTH {1‟b0}}; {wr_en, rd_en} = 2‟b00; $monitor (data_out,, f_full,,,f_empty

Any tune these signals change, display their stable values in the standard output

reset=1‟b0; #2;

read from an empty fifo to check the empty flag

reset = 1‟b1;

#5; reset =1‟b0;

Fill FIFO and then write to check full flag

@(negedge clock) ; rd_en = 1‟b0; wr_en = 1‟b1;

read two words to check advancing read pointer

for (i = 0, i <35; i = i + 1) begin @(negedge clock); data = 255 – i;

end

halt simulation

Sandeepani www.sandeepani-vlsi.com

Describing Stimulus

rd_en = 1‟b1; wr_en = 1‟b0; repeat (2) @(negedge clock); $stop;

end

Sandeepani www.sandeepani-vlsi.com

Review 1.How can you change the value of parameter ? 2. What are basic fundamental blocks of test fixture ? 3.Using a parameter, write code that creates a clock stimulus.

Related Documents

Sandeepani Verilog
February 2021 1
Verilog
February 2021 6
Verilog
February 2021 3
Design Through Verilog
January 2021 1
Codigos Ejemplos Verilog
February 2021 1

More Documents from "rAM"

Sandeepani Verilog
February 2021 1
Plate Mill Tolerance
January 2021 1
Gr-ii-team 11-2018
March 2021 0
Vastu Sutra In Lal Kitab
February 2021 0
Mmc Question Bank
January 2021 1