Professional Documents
Culture Documents
Sandeepani Verilog
Sandeepani Verilog
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
- 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 Structure
Verilog Supports:-
• Structure a q
– Physical (netlist & hierarchy)
– Software (subprogram) b s
• Hardware behavior
– Serial (sequential)
c r Behavior
– Concurrent (parallel)
Tpd Tsetup
• Timing D Q Thold
• Abstraction levels Tclk-q
Tnet
clk
Timing
Sandeepani
www.sandeepani-vlsi.com
Levels of Abstraction
Behavioral
algorithmic
f
Register
Transfer Level
Verilog Logic synthesis
Gate level
-structural
-netlist
Physical
-silicon
Layout / place
-Switch
& Route
Sandeepani
www.sandeepani-vlsi.com
Applications
Verilog language is used by:
• Contents
– Verilog objects
– Verilog connection model
– Hierarchy
– Rules and regulations
Sandeepani
www.sandeepani-vlsi.com
module
• Describes interface and module halfadd (a, b, sum, carry);
behavior
output sum, carry;
• Module’s communicate input a, b;
through ports
– Port names listed in assign sum = a^b
parentheses after the
assign carry = a&b
module name.
• Ports can be defined as
endmodule
input, or inout (bidirectional)
• ^is the exclusive or operator
• & is an logical and operator halfadd
a sum
Important to Remember :
Verilog is case sensitive for +
identifiers keywords must be b
in lowercase
carry
Sandeepani
www.sandeepani-vlsi.com
Representing Hierarchy
Create hierarchy by
Instantiating module fulladd
Connecting module ports to a n_sum
local ports or nets sum
U1 U2
Local nets need to be
b n_carry2
declared
halfadd halfadd
The or construct is a “built cin
in” gate primitive carry
n_carry1
module fulladd (a, b, cin, sum, carry);
input a, b, cin; Local nets of type
output sum, carry; wire
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
Event List
“or” is a keyword used in event
• always procedure lists
executes when one or
more variables in the always @ (a or b or sel)
begin
event list change if (sel = = 1)
value y=a; event list
else
• An event is a change y=b;
in logic value end
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
a_clk.v
Referred to by library name
Simulator startup file
WORK specifies mapping
Library name ->directory
name
PRIMS MY_WORK PROJ Compile into “WORK”
WORK mapped to specific
library name
Sandeepani
www.sandeepani-vlsi.com
Design Compilation
• Design compiled from a list
of Verilog files
tb_one • Normally compile the
testbench testbench first
– Usually contains compiler
directives
design – Provides additional
structural information for the
compiler/simulator
• Order of other files generally
cpu pnet_read pnet_write not important
behavioral RTL/structural behavioral • Hierarchical connections are
automatically made
• Verilog allows different levels
read_frame write_frame of abstraction anywhere in
netlist primitives the hierarchy
Sandeepani
Comments and Spacing www.sandeepani-vlsi.com
bufifI
Z Hiz, High Impedance, Tri-State,
Undriven, Unconnected,
Disabled Driver (Unknown)
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
Nets
module mux (a, sel, b, out); module mux (a, sel, b, out );
input sel, b, a; input sel, b, a ;
output out ; output out ;
wire nsela, selb, nsel ; wire nsel = ~sel;
assign nsel = ~sel; wire selb = sel & b;
assign selb = sel & b ; wire nsela = nsel & a ;
assign nsela = nsel & a;
assign out = nsela | selb ; assign out = nsela | selb;
endmodule endmodule
Sandeepani
www.sandeepani-vlsi.com
Register Assignment
module mux ( a, b, c, sel, mux ) ;
input a, b, c ;
Register types can only be input sel ;
updated from within a procedure output mux ;
Procedures can only update wire aandb, nmux ;
register types reg mux, nota ;
Registers and nets can be mixed
always @ (a or b or sel)
on the right-hand-side of an
if (sel = = 1)
assignment begin
mux = a ;
nmux = b ;
Error
end
Net type assigned
else
in procedure begin
mux = a ;
Error nmux = b ;
Register type end
assigned outside assign nota = ~a;
procedure assign aandb = a & b ;
…
Sandeepani
www.sandeepani-vlsi.com
net
module top;
wire ytop;
reg atop, btop; module dut (y, a, b) ;
initial output y;
begin input a, b;
atop = 1’b0;
btop = 1’b0; assign y = a&b;
end endmodule
dut U1 (.a(atop), .y(ytop), . b(btop));
endmodule
Sandeepani
www.sandeepani-vlsi.com
Parameters
• Parameters are used to declare // parameter list
run-time constants. parameter pl = 8,
• Can be used anywhere that you REAL_p = 2.039,
can use a literal. X_WORD = 16’bx ;
•Make code more
readable module mux (a, b, sel, out) ;
• Parameters are local to the
parameter WIDTH = 2;
module in which they are
defined. input [WIDTH –1:0] a;
• Can be used to size local input [WIDTH – 1:0] b;
variable declarations input sel ;
• Including module ports output [WIDTH – 1:0] out ;
• Must be declared before used reg [WIDTH –1:0] out ;
always @ (a or b or sel)
if (sel)
out = a;
else
out = b;
endmodule
Sandeepani
Overriding the Values of www.sandeepani-vlsi.com
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; module mux (a, b, sel, out);
input [7:0] abus, bbus;
input sel; 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) );
Generic Decoder
module gen_dec (en,a,y); module gen_dec_call (ena,enab,adda,addb,decadda,decaddb);
Summary
• 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
arithmetic +-*/ %
bit-wise ~& ^~^
logical !&&
reduction & ^ ~ & ~ ~ ^
shift << >>
relational < > <= >=
equality == != === !==
conditional ?:
concatenation {}
replication {{ }}
Sandeepani
www.sandeepani-vlsi.com
Arithmetic Operators
module arithops ( ) ;
+ add integer ans, int ;
- substract parameter FIVE = 5 ;
* multiply reg [3:0] rega, regb, regc, num ;
/ divide initial
% modulus begin
rega = 3 ; // 0011
regb = 4’b1010 ;
• Binary arithmetic is regc = 2; // 00010
unsigned int = -3 ;
• Integer arithmetic is
ans = FIVE * int; // ans = -15
signed ans = (int + 5) /2; // ans = 1
ans = FIVE / int ; // ans = -1
Synthesis num = rega + regb; // num= 1101
num = regc + regb; // num= 1100
% not synthesisable num = int; // num = 1101
/ only synthesisable if dividend num = regc % rega; // num = 0010
is a power of 2 end
endmodule
Sandeepani
www.sandeepani-vlsi.com
Bit-Wise Operators
module bitwise ( ) ;
~ not reg [3:0] rega, regb, regc ;
& and reg [3:0] num ;
or
initial
^ xor begin
~ ^ xnor rega = 4’ b1001 ;
^ ~ xnor regb = 4’ b1010 ;
regc = 4’ b11x0 ;
Note: Unknown bits in an operand do not necessarily lead to unknown bits in the result
Sandeepani
www.sandeepani-vlsi.com
module reduction ( ) ;
& and reg val ;
or reg [3:0] rega, regb;
^ xor initial
~& nand begin
~ nor rega = 4’b0100;
regb = 4’b1111;
~ ^ xnor
^ ~ xnor val = & rega ; // val = 0
val = | rega ; // val = 1
val = & regb ; // val = 1
val = | regb ; // val = 1
• Reduction operators val = ^ rega ; // val = 1
perform a bit-wise val = ^ regb ; // val = 0
val = ~ | rega ; // val = 0
operation on all the bits val = ~ ®a; // val = 1
of a single operand. val = ^rega && regb; // val = 1
• The result is always end
endmodule
1’b1, 1’b0 or 1bx.
Sandeepani
www.sandeepani-vlsi.com
Shift Operators
module shift ( ) ;
> > shift right reg [9:0] num ;
< < shift left reg [7:0] rega ;
initial
• Shift operators perform begin
rega = 8’b00001100;
left or right bit shifts on
the operand. num =rega >> 1; // num = 0000000110
• Shift is logical num = rega >> 3; // num = 0000000001
•0 is used for extra bits num = rega << 5; // num = 0110000000
• Shifts can be used to
end
implement division or
multiplication by powers endmodule zeros added first,
of two then shift by 5 to the
left
Sandeepani
www.sandeepani-vlsi.com
Relational Operators
> greater than module relationals;
reg [3:0] rega, regb, regc;
< less than reg val ;
>= greater than or equal
<= less than or equal initial
begin
• The result is:- rega = 4’b0011;
regb = 4’b1010;
• 1’b1 if the condition is true regc = 4’b0x10;
• 1’b0 if the condition is false
• 1’bx if the condition cannot val = regc > rega ; // val = x
be resolved val = regb < rega ; // val = 0
val = regb >= rega ; // val = 1
val = regb > regc ; // val = x
end
endmodule
Sandeepani
www.sandeepani-vlsi.com
Conditional Operator
module tribuf (in, enable, out);
? : conditional input in, enable;
output out;
reg out;
in out
always @ (enable or in)
out = enable ? In : 1’bz;
endmodule
enable
…
wire out3;
reg out1, out2;
always @ (a or b or sel)
a out1 = sel ? a : b ;
out
b always @ (a or b or sel)
if (sel)
out2 = a;
sel else
Note: sometimes the if else construct out2 = b;
may be more readable assign out3 = sel ? a : b;
…
Sandeepani
www.sandeepani-vlsi.com
Concatenation
module concatenation;
{ } concatenation reg [7:0] rega, regb, regc, regd, new;
• Allows you to select reg [3:0] nib1, nib2;
bits from different initial
vectors and join them begin
rega = 8’ b00000011;
into a new vector. regb = 8’ b00000100;
• Used for bit regc = 8’ b00011000;
regd = 8’ b11100000;
reorganization and new = { regd [6:5], regc [4:3], regb[3:0];
vector construction // new = 8’ b11_11_0100
new = {2’ b11, regb[7:5], rega[4:3], 1’ b1};
•e.g.rotates // new = 8’ b11_000_00_1
• Can used on either new = {regd [4:0], regd[7:5]};
// rotate regd right 3 places
side of assignment // new = 8’b00000_111
module replicate ( ) ;
{ { } } replication reg rega;
Replication allows you to reg [1:0] regb;
reproduce a sized variable a reg [3:0] regc;
set number of times reg [7:0] bus;
•Can be nested and used initial single bit rega
begin replicated 8 times
with concatenation
rega = 1’ b1;
• Syntax is:-
regb = 2’b11;
{ <repetitions> {<variable>} } regc = 4’ b1001;
bus = {8{rega}};
Important // bus = 11111111
Literals used in replication must be sized bus = { {4{rega}}, {2{regc[1:0] }} };
// bus = 1111_01_01
4x rega concatenated bus = { regc, {2{regb}} };
with 2x regc [1:0] // bus = 1001_11_11
bus = {2 {regc[2:1], {2{1’b1}}} };
regc concatenated
// bus = 00_1_1_00_1_1
with 2x regb
end
regc concatenated with 2x endmodule
1’b1 and replicated 2 times
Sandeepani
www.sandeepani-vlsi.com
Operator Precedence
• Do not rely on Operator Precedence – use parentheses
Conditional ?: Lowest
Sandeepani
www.sandeepani-vlsi.com
Procedural Statements
Sandeepani
www.sandeepani-vlsi.com
Procedures …
reg a, b, zor, zand;
• There are 2 types of procedural block
• always procedure executes initial
repeatedly throughout the simulation begin
a = 1’b1;
• it is triggered by a change of value b = 1’b0;
for any variable in the event list end
• initial procedure executes once at
always @ (a or b)
start of simulation begin
if (a | b) event list
• begin …end must be used for zor = 1’b1;
else
multiple statements within a block zor = 1’b0;
if (a & b)
Synthesis zand = 1’b1;
else
Initial procedures cannot be synthesized zand = 1’b0;
end
…
Sandeepani
www.sandeepani-vlsi.com
Procedural Assignments
module fulladder (out, a, b, cin);
• Assignments made inside input a, b, cin;
procedural blocks are called output [1:0] out;
procedural assignments
reg sum;
• All variables on the reg [1:0] out;
left-hand side must be
always @ (a or b or cin)
register data-types, e.g. reg begin
• Here carry is not declared, sum = a ^ b ^ cin;
and defaults to a 1-bit wire. carry = ((a & b) | ( cin & (a ^ b)));
out = {carry, sum};
Error end
carry is a net type-should be endmodule
declared reg carry;
Sandeepani
www.sandeepani-vlsi.com
Event Control
• always procedure executes when always @ (a or b or sel)
one or more variables in the begin
event list change value if (sel = = 1)
y = a; event list
Synthesis else
y = b;
Include all signals read by the block end
in the event list for the generation
of combinational logic
always @ (posedge clk)
• Can also use negedge or posedge // procedural statements
•Execute procedure on a specific edge always @ (negedge clk)
of a variable // procedural statements
• Used for modeling synchronous logic
Synthesis: always @ (negedge clk or rst)
cannot mix edge and level triggers in // not synthesisable
…
event list
Sandeepani
www.sandeepani-vlsi.com
if Statement Example
• if is a conditional module if_example (a, b, c, d, y);
input [3:0] a, b, c, d;
statement output [3:0] y;
• Each if condition is reg [3:0] y;
tested in sequence
always @ (a or b or c or d)
-Condition is boolean if (d = = 4’ b0000)
expression y = a;
•The first valid test else if (d <= 4’b0101)
y = b;
executes that branch else
•Conditions can overlap y = c;
endmodule
d 0101 d 0000
<=
Synthesis =
if synthesis to mux structures c 0 0
b 1 1 y
a mux
mux
Sandeepani
www.sandeepani-vlsi.com
if Statement Syntax
if (CONDITION) begin
/ / procedural statements • Signal if statement execute
end procedural statements only if
if (CONDITION) begin
the condition is true..
/ / procedural statements • .. add an unconditional else
end to execute procedural statements
else begin
when the if condition is false..
/ / procedural statements
end • …add else if to test further
conditions if the first is false
if (CONDITION) begin -Final else is optional and
/ / procedural statements can be used to indicate
end
else if (CONDITION) begin default operation
/ / procedural statements • Use begin and end to bound
end multiple procedural statements
else begin
/ / procedural statements
end
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; x
wire out; a
y +
……….. out
assign a=x+y; +
z
assign out=a+z;
Sandeepani
Multiple Continuous
www.sandeepani-vlsi.com
Assignments
Example:
wire z;
…. a
….. b + z
assign z=a+b; c ?
assign z=c+d; +
d
…
What would be value on signal z ?
Sandeepani
Multiple Continuous
www.sandeepani-vlsi.com
Assignments
• 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
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
Example..
a z
b
sel
Sandeepani
www.sandeepani-vlsi.com
Example..
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..
assign z=z+x;
Or
always @(z or x)
z=z+x;
Sandeepani
www.sandeepani-vlsi.com
x
z
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]
+ 1 d[4:0]
b[3:0] 0
c[4:0]
add
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle
Sandeepani
www.sandeepani-vlsi.com
Contents
Blocking assignment:=
Example..
Sandeepani
Example
www.sandeepani-vlsi.com
……..
initial
begin
byte=8’b00001111;
#20;
byte[3:0]=byte[7:4];
byte[7:4]=byte[3:0];
#20;
……
Sandeepani
www.sandeepani-vlsi.com
Contents
Non-Blocking Assignment
Non-blocking assignment:<=
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
Simulation cycle(1)
module sim_ex(a,m,y,w);
Input a;
___ ___ Output m,y,w;
___ ___ Reg m,y,w;
Always@ (a or m)
Variable procedure begin:p1
Event list schedule m<=a;
a<=1 y<=m;
End variable at
start
• Assume a,w,m,y all zero
Always@ ( m) a:m:y:w=0
• a changes from zero to one
begin:p2
w<=m;
End
endmodule
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle(2)
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;
Variable procedure End variable at start
a:1,m:y:w:0
Event list schedule Always@ ( m)
m<=1 p1 begin:p2
a updated from 1’b0 to 1’b1 w<=m;
End
Procedure p1 executes endmodule
Update to m scheduled
No change in the value of y
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;
____ always@ (a or m)
_____ begin:p1
m<=a;
____ y<=m;
End variable at start
_____ a:1,m:1y:w:0
Variable procedure always@ ( m)
begin:p2
Event list schedule w<=m;
m<=1 p1 End
endmodule
m changes value to 1’b1 p2
Procedure p1 placed on scheduler list
Procedure p2 placed on scheduler list
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle(4)
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;
Variable procedure end
Event list schedule
y<=1 always@ ( m) variable values
W<=1 after one delta
Procedure p1 and p2 execute(random) a:1,m:1y:w:0
Update to y and w scheduled begin:p2
No change in value for m 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;
always@ (a or m)
____ begin:p1
m<=a;
____ End
y<=m;
always@ ( m) variable
values after
Variable procedure two deltas
begin:p2
executed
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle:summary
Variable procedure variable
Event list schedule values
a<=1 p1 a:1,m:0 module sim_ex(a,m,y,w);
y:0,w:0 Input a;
Output m,y,w;
Reg m,y,w;
m<=1 p1 a:1,m:1
p2 y:0,w:0 always@ (a or m)
begin:p1
m<=a;
Y<=1 a:1,m:1 y<=m;
W<=1 End
y:1,w:1 always@ ( m)
begin:p2
w<=m;
End
endmodule
Sandeepani
Delta cycle and simulation
www.sandeepani-vlsi.com
Time
Multiple delta cycles at each point of simulation time
Simulation time
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
contents
review
Non-blocking assignment:<=
Variable update is scheduled
-after the procedure suspends
…..
reg q;
always @(posedge clk)
q<=d;
..
Sandeepani
www.sandeepani-vlsi.com
contents
initial
begin
avar=1’b1;
bvar=1’b1;
end
always @(posedge clk)
bvar=avar+1’b1;
contents
Combinational logic
always @ (a or b)
begin
m=a;
n=b;
p=m+n;
end
Combinational logic
always @(a or b or m or n) • Non-blocking assignment can
begin:p1 be inefficient for combinational
m<=a; logic
n<=b; • Specifically when logic
p<=m+n; contains serial serial behavior
end or intermediate variables
Variable event procedure -intermediate variables must
event list scheduler be added to event list
a<=1 p1
-procedure will take several
b<=2
delta cycles to reach “steady
m<=1 p1
state”
n<=2
p<=3
Sandeepani
www.sandeepani-vlsi.com
Multiple assignments
always @(a or b or c) always @(a or b or c or m or n)
begin begin
m<=a;
m=a; n<=b;
n=b; p<=m+n;
p=m+n; m<=c;
m=c; q<=m+n;
q=m+n; end
Multiple assignments can be made to
end a variable within one procedure
Multiple assignments should be either -last assignment wins for non-
blocking or non-blocking blocking
Sandeepani
www.sandeepani-vlsi.com
contents
Mixed assignments
always @(posedge clk) always @(posedge clk)
begin begin
tempa=ip1;
…… temp=a+b;
tempb=f(tempa); q<=temp+c;
……
op1<= tempb;
end
……
end
Sandeepani
www.sandeepani-vlsi.com
Mixed assignments
• AIM
Topics
-Combinational Procedures
-Clocked procedures
Sandeepani
www.sandeepani-vlsi.com
RTL Style
Combinational Procedure Clocked Procedure
always @ (a or b or c)
always @ (posedge clock)
begin
Begin
...
…
...
…
...
end
end
Tip Tip
always @ (a or b or sel)
• Even List for
begin
combinational logic must
if (sel = = 1)
contain all variables read
y = a;
within procedure
else
y = b;
What would the behavior end
be if sel was missing ?
Sandeepani
www.sandeepani-vlsi.com
b
b
sel sel
y
y
Sandeepani
Incomplete Assignments in Combinational www.sandeepani-vlsi.com
Logic
Avoiding Latches
module completel (ctrl, a, b);
input a, ctrl;
• Two ways to output b;
avoid latches:- reg b;
•Use default
always @ (ctrl or a)
statement begin
•Add else b = 0; // default
if (ctrl) module complete2 (ctrl, a, b);
clause input a, ctrl;
b = a;
end output b;
endmodule reg b;
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
statements? end
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;
a
b
e out
c
d
Sandeepani
Rules for the Synthesis of www.sandeepani-vlsi.com
Combinational Logic
• 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
Sandeepani
Register Inference in Clocked www.sandeepani-vlsi.com
Procedures
module counter (count, clk);
output [3:0] count;
• Clocked procedures triggered on
input clk; clock edge
reg [3:0] count; •Use only posedge/negedge in
event list
always @ (posedge clk)
if (count > = 9)
• Registers are inferred on all
count < = 0 ; non-blocking assignments in
else synchronous procedures
count < = count + 1;
endmodule
0 count Question
1 0
+ 1 4
4 What is the issue with
4
4
sel this counter description?
<
9 clk
Sandeepani
www.sandeepani-vlsi.com
endmodule
Sandeepani
www.sandeepani-vlsi.com
a b c
clk
Question
How would you code this design in Verilog?
Sandeepani
Blocking and Non-blocking
www.sandeepani-vlsi.com
Assignment
1 always @ (posedge clk) 2 always @ (posedge clk)
begin begin
c < = b; b < = a;
b < = a; a < = b;
end end
* 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
area/Speed Curve
Schematic
Verilog code
Constrains file
Boolean Parsing
Mapping
Technology Gates
Library
Optimization
Gate Level Netlist
Schematic
Sandeepani
www.sandeepani-vlsi.com
clk
? Question a
What would be the input at “?“
clk
Inferred hardware structure
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
synthesis y
meets area/speed?
verilog
functional?
y gate
rtl
simulation
simulation n
testbench
change code
compare
golden results results
Language Support Sandeepani
www.sandeepani-vlsi.com
Synthesis Subset
Full Verilog Language
Tool1
Tool2
Tool3
Tool4
Tool5
Sandeepani
Summary
www.sandeepani-vlsi.com
assignments
• 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 always
temp @(a or b or c)
out temp = a & b;
b out = c & temp;
endmodule
c
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 non-
blocking statements
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
output1 output2
Sandeepani
If/Case construct in
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
D Q
a
b Z
sig1
sig2
Sandeepani
www.sandeepani-vlsi.com
Q
a D
b
sig1 Z
sig2 nextz
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.
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
Multiplexer vs Latch
a
if (select)
y
y = a;
b else
y = b;
a y
if (select)
y = a;
select
Sandeepani
Register with Asynchronous
www.sandeepani-vlsi.com
Reset
module dff_async_reset (data, clk, reset, q);
input data, clk, reset;
output q; reg q;
always @ (posedge clk or negedge reset)
data q if (~reset)
q = 1’ b0
else
q = data;
endmodule
clk
reset
Sandeepani
Clock-triggered Flip-flop with
www.sandeepani-vlsi.com
Enable control
Resource Sharing:I
if (select)
+
sum <= A + B;
B else
Mux sum <= C + D;
sum
C
+
D select
We are sharing the multiplexer.
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:II
A
if (select) begin
temp1 <= A;
mux
temp2 <= B;
B end
select + else begin
sum
temp1 <= C;
C temp2 <= D;
mux end
sum <= temp1 + temp2;
D select
Resource Sharing:III
vsum
+
0 vsum = sum;
mux
for (i=0;i<3;i++)
Offset[0]
begin
if (req[i]=1‘b1) begin
0
vsum <= vsum + offset[i];
mux + end;
Offset[1] end loop;
0
mux +
Offset[2]
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:IV
mux
vsum R
0 +
Offset[0]
mux
Offset[1]
Offset[2]
sum := start;
for (i=0;i<2;i++)
start
begin
sum <= sum + inc[i];
inc[0] + end;
+
inc[1]
+
sum
inc[2]
Sandeepani
www.sandeepani-vlsi.com
Performance-oriented coding
+
inc[1] sum
+
inc[2] Loop Unrolling performed by designer!
Sandeepani
www.sandeepani-vlsi.com
data_in data_out
req
Sandeepani
www.sandeepani-vlsi.com
data_in data_out
req[3]
Sandeepani
www.sandeepani-vlsi.com
hardware instead?
a[3:0]
c
8-to-1 mux
DFF
r[4]
b[3:0]
r[0]
clk
r [3:1]
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
Topics
• FSM Basics
• Steps for FSM design
• Example design
• HDL code for FSM
Sandeepani
www.sandeepani-vlsi.com
D Q
CLK
Sandeepani
www.sandeepani-vlsi.com
Complex trasitions
Coin collection FSM
TO
00p
25p Possible
50p Possible Possible
75p Possible Possible
100p Possible Possible Possible Possible
00p 25p 50p 75p 100p
FROM
Sandeepani
www.sandeepani-vlsi.com
What is an FSM?
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
www.sandeepani-vlsi.com
What is an FSM?
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
ACTION PORTS
COMBINATORIAL
CURRENT
STATE CURRENT
COMB. STATE
LOGIC NEXT
for STATE
CONTROL
NEXT
INPUTS
STATE STATE
REGISTER
FLIP-FLOPS
ACTION PORTS
REGISTERED
CLOCK
ASYNC
CONTROL
PORTS
Sandeepani
www.sandeepani-vlsi.com
01 = 1’b0 E
3’b110
02 = 1’b0
01= 1’b0
02= 1’b1
Sandeepani
www.sandeepani-vlsi.com
Procedures
always @ (a or b or state) always @ (state)
begin: NEXTSTATE begin: OUTPUTDECODE
next_state = state ; // DEFAULT ASSIGNMENTS
case (state)
01 = 1’b0 ;
A : begin 02 = 1’b0 ;
if (a) next_state = C; case (state)
else if (b) next_state = B; B: begin
end 01 = 1’b1;
B: begin 02 = 1’b1;
if (~b) next_state = A; end
else if ( { a,b} = = 2’b01) next_state = D; E: 02 = 1’b1;
end end
C: begin end // end output decode logic
if (a) next_state = E;
else if ( {a,b} = = 2’b11) next_state = D;
Next state and output decode
end
D:next_state = A;
combinational procedures
E: if (~a) next_state = C; could be merged
end // end next state logic 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; Question
else if (ctrl < = 4’b0100) Draw the architecture of
op = b ; hardware that this
else represents.
op = c ;
endmodule
Sandeepani
www.sandeepani-vlsi.com
ctrl Question
o 1
<= What hardware structure is created
4 for a case statement?
ctrl
0 1 Depends if case statement is
=
parallel or not!
0 op
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; op = a ;
Prioritized case synthesis
0, 1, 2, 3, 4 : op = b ; ctrl c b a
default op = c ;
endmodule <= 0 1
case (ctrl) 4
0: op = a ; ctrl
1, 2, 3, 4 : op = b ;
default : op = c ; = 0 1
endcase
op
0
Sandeepani
Parallel Case Statement www.sandeepani-vlsi.com
Initial Statements
module counter (clk, rst, q ) ;
module counter (clk, q ) ;
input clk ; input clk, rat ;
output [ 3 : 0 ] q ; output [3 : 0] q ;
reg [3:0] q: reg [3 :0] q ;
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
Sandeepani
Aims and Topics 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
sel out
nsel
module mux (a, sel, b, out);
selb input a, sel, b;
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) );
Sandeepani
Conditional Primitives www.sandeepani-vlsi.com
bufif1
bufif1
data out
data out
enable enable
my_rom_data
‘timescale 1ns / 10ps 0000
module myrom (read_data, addr, read_en_); 0101
input read_en_; 1100
input [3:0] addr; 0011
output [3:0] read_data; 1101
reg [3:0] read_data; 0010
reg [3:0] mem [0:15]; 0011
1111
initial 1000
$readmemb (“my_rom_data“, mem); 1001
always @ (addr or read_en_) 1000
if (! read_en_) 0001
read_data = mem[addr]; 1101
endmodule 1010
0001
ROM data is stored in a separate file 1101
Sandeepani
Simple RAM Model www.sandeepani-vlsi.com
en_a_b
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
Sandeepani
Bidirectional Ports Using Continuos Assignment www.sandeepani-vlsi.com
en_a_b
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_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
Sandeepani
Modeling Memory Ports www.sandeepani-vlsi.com
data
bus data
reg
wr
module ram_cell (databus, rd, wr); when rd = 1 the value
input databus; of datareg is assigned
input rd, wr; to databus
reg datareg;
* Aims
- Understand how to model simple delays for
simulations and gate level models
* Topics
- Lumped delays
- Distributed delays
- Path delays
- Specify timing blocks
Sandeepani
Delay Modeling Types www.sandeepani-vlsi.com
c o1 out
*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
Topics
* Understand verilog composite libraries
* Understand functional modeling of ASIC libraries
* Learn about the use of UDPs in ASIC library models
Sandeepani
WHAT IS A UDP ? 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
Sandeepani
FEATURES www.sandeepani-vlsi.com
Cin
A G1
G2 Sum
B
G4
G5 Cout
G3
Cin
A U_ADDR2_S Sum
B
U_ADDR2_C Cout
You can implement the full adder with only two combinational UDPs
cont........next...
Sandeepani
www.sandeepani-vlsi.com
Verilog has symbols that can be used in UDP table to improve readability
f ( 10 ) 1 -> 0 transition
* ( ?? ) Any transition
Sandeepani
SUMMARY 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
•Testbench structure
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
Introduction
Testbench Structure
WAVE FORM
Reference Vectors COMPARE Results Files
Test vectors
File GENERATION RESULTS
Sandeepani
www.sandeepani-vlsi.com
Outline
Introduction
Vector generation
Simulation tips
summary
Sandeepani
www.sandeepani-vlsi.com
Vector generation
Vector generation
Different ways of generating system waveforms
Vector generation
Outline
Introduction
Vector generation
Simulation tips
summary
Sandeepani
www.sandeepani-vlsi.com
Simulation tips
Summary
Verification flow
Testbenches
Simulation tips
Sandeepani
www.sandeepani-vlsi.com
Verilog Testbenches
Sandeepani
www.sandeepani-vlsi.com
vendor
include libraries
files
simulator
design data
files compilation clk
read
write
initial procedure
avec = compilation procedure
-----
-----
procedure
initialization
procedure
x
x
x
procedure
procedure
o
l x
simulation
procedure
procedure
z
Sandeepani
Testbench
Testbench Organization www.sandeepani-vlsi.com
* Simple testbench
Design - Just send data to desgin
stimulus to verify - No interaction
- Few Processes
* Sophisticated testbench
- Models environment
Testbench around designs
- Talks to design
stimulus - Evolves towards
Design
verify system model
to verify - self - checking
results
Sandeepani
“In Line“ Stimulus www.sandeepani-vlsi.com
module inline_tb;
reg (7:0) data_bus, addr; * Variables can be listed
reg reset; only when their values
// instance of DUT change
initial * Complex timing
begin relationships are easy
reset = 1’bo; to define
data_bus = 8’hoo; * A test bench can
# 5 reset = 1’b1; become very large for
#15 reset = 1’bo; complex tests
#10 data_bus = 8’h45;
#15 addr = 8’hf0;
#40 data_bus = 8’h0f;
end
endmodule
Sandeepani
Stimulus From Loops www.sandeepani-vlsi.com
Simple Delays
initial clk=0;
always clk = ~clk;
Simple Delays
System Control
Objective:Describe some of the compiler directives ,
system tasks and system functions
available in Verilog
$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
module TB_FULL_ADD;
reg A, B, CIN;
wire 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
Simulation control
simulation flow
Compiler directives
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
File outputs
32 channels available
$fopen, $fclose
$fopen
integer chan_num1,chan_num2;
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
integer chan_num1;
initial
begin
chan_num1=$fopen(“file1.out”);
$fmonitor(chan_num1,$time,”add_in=%d,add_out=%b”,
add_in,add_out);
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 start address specified with @
11111111 consecutive data applies to consecutive
10101010 address
00000000
@6
Xxxxzzzz
1x1x1x1x
Sandeepani
www.sandeepani-vlsi.com
mem8x8.out
memory[0]=xxxxxxxx
memory[1]=xxxxxxxx address 0,1 and 5 were not
memory[2]=11111111 initialized (==x)
memory[3]=10101010
memory[4]=00000000
memory[5]=xxxxxxxx
memory[6]=xxxxzzzz
memory[7]=1x1x1x1x
Sandeepani
www.sandeepani-vlsi.com
• 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
begin
count=0;
#5;
for (i=0;i<8;i=i+1)
if(!in_bus[i])
count=count+1; //assign outputs
end
endtask
Sandeepani
www.sandeepani-vlsi.com
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
initial begin
clk=1;
p=0;
end
always #50 clk=~clk;
initial
begin
neg_edge(4);
p=1;
end
Sandeepani
www.sandeepani-vlsi.com
end
endmodule
Sandeepani
www.sandeepani-vlsi.com
• Example follows…..
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
Examples
Verilog PLI
Sandeepani
www.sandeepani-vlsi.com
Outline
Introduction
PLI Interface
TF/ACC Routines
Summary
Sandeepani
www.sandeepani-vlsi.com
Introduction
• Verilog Programming Language Interface is
one of the most powerful features of Verilog
Introduction
Generations of PLI
Introduction
www.sandeepani-vlsi.com
Outline
Introduction
PLI Interface
TF/ACC Routines
Summary
Sandeepani
www.sandeepani-vlsi.com
User Defined
PLI Interface Invokes User-
Defined System
System Task #1
User-Defined
Task System Task #2
User Design Representation
And Stimulus User-Defined
System Task #3
Pass Invokes
data User-
PLI Library
Verilog Compilation defined C
Routines
routine
User-Defined
Access C routine # 1
Internal
Internal design structures
Representation User-Defined
(Data Structures) C routine # 2
User-Defined
C routine #3
Simulation
PLI Library
Routines to do
Miscellaneous
Simulation Output
Operations
Sandeepani
www.sandeepani-vlsi.com
Objects in Verilog
• Module instances, ports, pin-to-pin paths, intermodule paths
• Top-level modules
Example
Example: 2-to-1 Multiplexer
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Outline
Introduction
PLI Interface
TF/ACC Routines
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
Summary
Sandeepani
www.sandeepani-vlsi.com
•char *acc_fetch_value(object,format_str,value)-Return
value of verilog object
Sandeepani
www.sandeepani-vlsi.com
• $show_value
Uses PLI to access specific activity within a Verilog
simulator, by listing the name and current value of
net
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:
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
# 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
Interface mechanism
/* misctf routine */
/*system task/function
name
1 /* forward reference = true
},
$show_value(sum);
$show_value(co);
$show_value(i1.n3);
#10 $stop;
$finish;
end
Endmodule
Sandeepani
www.sandeepani-vlsi.com
Thank You
Sandeepani
www.sandeepani-vlsi.com
rd_ptr wr_ptr
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 );
…
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 );
Declarations
module fifo……. wr_ptr
// parameter declarations rd_ptr fiforeg
parameter WIDTH = 8;
parameter ADDRESS_WIDTH = 5; 0
parameter LENGTH = (1 << ADDRESS_WIDTH); . 1
. 2
// input and output declarations . 3
. .
// 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; . .
. .
// integer needed with for loops LENGTH-1.
integer I;
[WIDTH –1 :0]
// functional code.
endmodule
Sandeepani
FIFO Functional Code www.sandeepani-vlsi.com
FIFO Outputs
Testbench
DUT Instantiation
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 Initial clock = 1’b0;
begain Always # PERIOD clock = - clock,
data = { WIDTH {1’b0}};
{wr_en, rd_en} = 2’b00;
Any tune these signals change, display their stable
$monitor (data_out,, f_full,,,f_empty 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;
read two words to check advancing read pointer
wr_en = 1’b1;
for (i = 0, i <35; i = i + 1)
begin
@(negedge clock);
data = 255 – i; halt simulation
end
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