Beruflich Dokumente
Kultur Dokumente
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Whats 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 Lunch1.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 FSMs
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
Hardware behavior
Serial (sequential) Concurrent (parallel)
b
c
Tpd D Q
s
r Behavior
Tsetup Thold Tclk-q
Tnet
Timing
Sandeepani
www.sandeepani-vlsi.com
Levels of Abstraction
Behavioral algorithmic
Register Transfer Level Verilog Gate level -structural -netlist Logic synthesis
Sandeepani
www.sandeepani-vlsi.com
2
4 data 4 op
4
clk
SLI
D Q
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(1b0), .CP(clk), .Q(op[3] ) );
Sandeepani
www.sandeepani-vlsi.com
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
Testbench behavioral
Design RTL
Compare
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
Results
Expected results
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Contents
Verilog objects Verilog connection model Hierarchy Rules and regulations
Sandeepani
www.sandeepani-vlsi.com
module
Describes interface and behavior Modules 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 endmodule = a^b = a&b
halfadd
a
Important to Remember : Verilog is case sensitive for identifiers keywords must be in lowercase
sum
+
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
a b
U1
n_sum n_carry1
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 module port mapped to 1 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
n_sum n_carry1 U1
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
module halfadd (a, b, sum, carry) ; output sum, carry ; input a, b ; endmodule
Caution
Less readable and more error-prone than named port connection
Sandeepani
www.sandeepani-vlsi.com
1 y
b
sel
0
initial begin a = 1; b = 0; end
initial procedure Executes once at start of simulation Used for initialisation, testbenches
Synthesis
initial blocks are not synthesisable
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
Procedure Procedure
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
Library name ->directory name
a_clk.v
WORK
PRIMS MY_WORK PROJ
Sandeepani
www.sandeepani-vlsi.com
design
structural
cpu
pnet_read
pnet_write
read_frame
netlist
write_frame
primitives
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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.
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
0
buf buf
Zero, Low,False, Logic Low, Ground, VSS, Negative Assertion One,High,True,Logic High, Power, VDD, VCC, Positive Assertion X,Unknown (bus contention), Uninitialized
X
bufifI
Important The unknown logic value x is not the same as dont 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 like a wire driven by a logic gate A Net type behaves
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 ; // // // // 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
Net types:wire, tri supply1, supply0 wor, trior wand, triand trireg, tri0, tri1
Sandeepani
www.sandeepani-vlsi.com
b
selb 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
wire declaration and assignment can be merged. Remember ports default to wire types Note:~ is an inversion operator
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
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
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
Sandeepani
www.sandeepani-vlsi.com
net ytop
net
module top; wire ytop; reg atop, btop; initial begin atop = 1b0; btop = 1b0; end dut U1 (.a(atop), .y(ytop), . b(btop)); 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 = 16bx ;
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
Sandeepani
www.sandeepani-vlsi.com
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
Generic Decoder
module gen_dec (en,a,y); parameter sizein=3, sizeout=8;
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
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
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
Sandeepani
+ * / %
www.sandeepani-vlsi.com
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 ;
Note: Unknown bits in an operand do not necessarily lead to unknown bits in the result
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
initial begin rega = 4b0100; regb = 4b1111; 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 = 8b00001100;
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: 1b1 if the condition is true
1b0 if the condition is false 1bx if the condition cannot be resolved
Sandeepani
www.sandeepani-vlsi.com
enable
a b sel
Note: sometimes the if else construct may be more readable
out
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
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 = 8b00000_111 {nib1, nib2} = rega; // nib1 = 4 0000, nib2 = 4 0011 end endmodule
Important
Literals used in concatenation must be sized
Replication
{ { } } replication Replication allows you to reproduce a sized variable a set number of times Can be nested and used with concatenation Syntax is:{ <repetitions> {<variable>} } 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 1b1 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 = 2b11; 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{1b1}}} }; // 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 Symbols {} {{ }} ! ~ * / % + << >> < <= > >= == != === !== & ~& ^ ^~ ~ && ?: Highest
Precedence
Logical Conditional
Lowest
Sandeepani
www.sandeepani-vlsi.com
Procedural Statements
Sandeepani
www.sandeepani-vlsi.com
Topics
Procedures Procedural statements
if then else case loops
Sandeepani
www.sandeepani-vlsi.com
reg a, b, zor, zand; initial begin a = 1b1; b = 1b0; end always @ (a or b) begin if (a | b) event list zor = 1b1; else zor = 1b0; if (a & b) zand = 1b1; else zand = 1b0; end
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
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.
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
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
Procedure
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 <= 4b0101) y = b; else y = c; endmodule
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
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
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
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
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
Sandeepani
www.sandeepani-vlsi.com
Synthesis -for loop synthesizable for fixed range. - repeat synthesizable for fixed repetitions - while generally not synthesizable - forever generally not synthesisable
Sandeepani
www.sandeepani-vlsi.com
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
www.sandeepani-vlsi.com
a b c d
+
? +
Sandeepani
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
Sandeepani
www.sandeepani-vlsi.com
Example..
Code the following block:
a
b sel
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<= 4b1010) 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<=4b1010) ?b:c);
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
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
Procedures executes whenever any event occurs on variable Procedures can be named
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
Example
Will this segment of code Swap the upper and lower byte contents? .. initial begin byte=8b00001111; #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<=8b00001111; #20; byte[3:0]<=byte[7:4];//byte[3:0] scheduled to receive 4b0000 byte[7:4]<=byte[3:0];// byte[7:4] scheduled to receive 4b1111 #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
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
____
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
procedure schedule p1
a updated from 1b0 to 1b1 Procedure p1 executes 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 always@ ( m) begin:p2 w<=m; End endmodule
m changes value to 1b1 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; end always@ ( m)
procedure schedule
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle(5)
____ ____ ____
Variable Event list
____
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)
procedure schedule
begin:p2 w<=m; End endmodule
Sandeepani
www.sandeepani-vlsi.com
Simulation cycle:summary
Variable Event list a<=1 procedure schedule p1 variable values a:1,m:0 y:0,w:0
m<=1
p1 p2
a:1,m:1 y:0,w:0
Y<=1 W<=1
a:1,m:1 y:1,w:1
Sandeepani
www.sandeepani-vlsi.com
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
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
Sandeepani
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
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
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
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)
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
Sandeepani
www.sandeepani-vlsi.com
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 ... end ...
Clocked Procedure
always @ (posedge clock)
Begin
...
end Tip Non-blocking assignment (<=) should be used
Sandeepani
www.sandeepani-vlsi.com
combinational logic must contain all variables read within procedure What would the behavior be if sel was missing ?
Sandeepani
www.sandeepani-vlsi.com
always @ (a or b) a
always @ (a or b or sel)
a
b
sel y
b
sel y
Sandeepani
www.sandeepani-vlsi.com
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
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
out
c d
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
Sandeepani
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
count
4
+
4
0 1
sel
<
clk
Sandeepani
www.sandeepani-vlsi.com
Asynchronous Reset
module counter (count, clk, rst); output [3:0] count; input clk, rst; rst [3:0] count; 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
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
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
d en clk
0 1
mux
Sandeepani
www.sandeepani-vlsi.com
clk
Sandeepani
www.sandeepani-vlsi.com
Easier to use non-blocking assignment to infer registers in synchronous procedures Order independent Register inferred for each assignment
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
clk
Sandeepani
www.sandeepani-vlsi.com
Constraints File
* 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
Area
Sandeepani
www.sandeepani-vlsi.com
Verilog code
Parsing
Technology Library
Gates
Optimization
Schematic
Sandeepani
www.sandeepani-vlsi.com
clk
Sandeepani
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 d < 0 1 mux y 011
?
c b
0
1 mux 0 1mux
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
change code
A Synthesis Methodology
Change constraints file
netlist
Sandeepani
www.sandeepani-vlsi.com
constraints
tech library
synthesis
verilog
rtl simulation 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
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
always @(a or b or c) temp = a & b; out = c & temp; endmodule
temp
out
b 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 nonblocking statements
Sandeepani
www.sandeepani-vlsi.com
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.
Sandeepani
www.sandeepani-vlsi.com
Selector
output1
output2
Sandeepani
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
a b sig1 sig2
Sandeepani
www.sandeepani-vlsi.com
a b sig1 sig2
Sandeepani
www.sandeepani-vlsi.com
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
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
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
c d e f
Sandeepani
www.sandeepani-vlsi.com
Multiplexer vs Latch
a y b
if (select) y = a; else y = b;
select
if (select) y = a;
Sandeepani
www.sandeepani-vlsi.com
data
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
clk reset
Sandeepani
www.sandeepani-vlsi.com
clk en clr
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:I
A + if (select) sum <= A + B; else sum <= C + D;
B
Mux sum C +
select
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:II
A mux
B
select C + sum
mux select
if (select) begin temp1 <= A; temp2 <= B; end else begin temp1 <= C; temp2 <= D; end sum <= temp1 + temp2;
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:III
vsum +
mux 0
Offset[0]
0 Offset[1]
mux
vsum = sum; for (i=0;i<3;i++) begin if (req[i]=1b1) begin vsum <= vsum + offset[i]; end; end loop;
0 Offset[2]
mux
Sandeepani
www.sandeepani-vlsi.com
Resource Sharing:IV
mux vsum
R
+
mux
0
Offset[0] Offset[1] Offset[2]
Sandeepani
www.sandeepani-vlsi.com
start inc[0]
sum
Sandeepani
www.sandeepani-vlsi.com
Performance-oriented coding
start inc[0]
+
+
inc[1]
sum
+
inc[2]
Sandeepani
www.sandeepani-vlsi.com
clk en
always @ (posedge clk) begin if (req == 4'b1000) data_out <= data_in; end end
req
Sandeepani
www.sandeepani-vlsi.com
clk en req[3]
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
a[3:0]
8-to-1 mux
c DFF
r[4] r[0]
b[3: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
Sandeepani
www.sandeepani-vlsi.com
Topics
FSM Basics Steps for FSM design Example design HDL code for FSM
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
CLK
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
Complex trasitions
Coin collection FSM
TO 00p 25p 50p 75p 100p Possible Possible Possible 00p
www.sandeepani-vlsi.com
Possible 75p
100p
Sandeepani
What is an FSM?
Design Specification Point of View
www.sandeepani-vlsi.com
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?
Digital Circuit Point of View
www.sandeepani-vlsi.com
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
COMBINATORIAL ACTION PORTS CURRENT STATE COMB. LOGIC for NEXT STATE NEXT STATE CURRENT STATE
CONTROL INPUTS
PORTS
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
A
3b000
b=1 b 1
a= 1b1
01 =1b0 02 =1b0
B
3b001
3b011
b= 1b o
01 = 1b1 02 = 1b1
{a ,b}=2b01
a =1b1
State Names (A,B,C,D,E,) State encoding: A=3 b000, B=3b001 Transition Conditions: {a ,b}=2b01 Output values: 01=1b0
01 = 1b0 02 = 1b0
3b110
Sandeepani
www.sandeepani-vlsi.com
State register
Output Logic 01 02
a b
Next State Logic state Next_state
module fsm (a, b, clock, reset, 01, 02); input a, b, clock, reset; output 01, 02 ; // parameter declarations (state encoding) parameter A = 3b000, B = 3b001, C = 3b011, D = 3b010, E = 3b110; // 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
www.sandeepani-vlsi.com
State register
Output Logic 01 02
a b
Next State Logic state Next_state
module fsm (a, b, clock, reset, 01, 02); input a, b, clock, reset; output 01, 02 ; // parameter declarations (state encoding) parameter A = 3b000, B = 3b001, C = 3b011, D = 3b010, E = 3b110; // 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
www.sandeepani-vlsi.com
always @ (state) begin: OUTPUTDECODE // DEFAULT ASSIGNMENTS 01 = 1b0 ; 02 = 1b0 ; case (state) B: begin 01 = 1b1; 02 = 1b1; end E: 02 = 1b1; 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;
Sandeepani
www.sandeepani-vlsi.com
o
ctrl
<=
4
Question What hardware structure is created for a case statement? 1 op Depends if case statement is parallel or not!
=
0
Sandeepani
www.sandeepani-vlsi.com
Case Synthesis
=
0
1 op
Sandeepani
www.sandeepani-vlsi.com
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
ctrl
c <
5 ctrl
>
5
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 2b00: op = 1 ; 2b01, 2b10: op = 2 ; 2b11: 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
www.sandeepani-vlsi.com
Question
Are these casez statements parallel or not?
Sandeepani
www.sandeepani-vlsi.com
Full Case
// 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
Case branches do not need to cover all values for case expression
Can cause incomplete assignments in combinational code. -Will synthesze latches
Full case (for synthesis) covers all binary values of case expression.
Ignoring x and z value combinations
always @ (ctrl or b or c) case (ctrl) 0, 1: op = b ; 2: op = c ; default : op = 0 ; endcase
default makes full case for synthesis and simulation Full case for synthesis
Sandeepani
www.sandeepani-vlsi.com
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 dont care Can cause RTL to gate level simulation mismatches Full case issue avoided if default assignments used
Sandeepani
www.sandeepani-vlsi.com
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;
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
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
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
* 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
www.sandeepani-vlsi.com
nsel
selb
out 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
Conditional Buffers
bufif1
data out data
Sandeepani
www.sandeepani-vlsi.com
bufif1
out
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
enable
bufif1(out, data, enable) enable 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
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
Sandeepani
www.sandeepani-vlsi.com
my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101
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] : 4bz); // 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
www.sandeepani-vlsi.com
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
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}};
Sandeepani
www.sandeepani-vlsi.com
* 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
Sandeepani
www.sandeepani-vlsi.com
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
www.sandeepani-vlsi.com
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
www.sandeepani-vlsi.com
RAM cell
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
o1
out
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
* distributed delays divide delay over more than one gate - Allows different delays for different paths - Delays accumulate along the path a b #2
Sandeepani
www.sandeepani-vlsi.com
#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
Sandeepani
www.sandeepani-vlsi.com
o1
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 .............
Sandeepani
www.sandeepani-vlsi.com
specparam aop = 2; bop = 3; cop = 1; (a => op) = aop; (b => op) = bop; (c => op) = cop; endspecify endmodule
* 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
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
* => 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;
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
op
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
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
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
Sandeepani
www.sandeepani-vlsi.com
Cin A B
G1
G2 G4
Sum
G5
G3
Cout
Cin A B
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 ci : 0 : 1 : 0 : 1 : 0 : 1 : 0 : 1 : s 0; 1; 1; 0; 1; 0; 0 1
endtable endprimitive
Sandeepani
www.sandeepani-vlsi.com
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 dont care conditions in the inputs and current 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
Sandeepani
www.sandeepani-vlsi.com
Verilog has symbols that can be used in UDP table to improve readability
Symbol Interpretation Explanation
b
r
0 or 1
( 01)
f
p
( 10 )
1 -> 0 transition
n
*
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..
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
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
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
Sandeepani
www.sandeepani-vlsi.com
Verilog Testbenches
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
Design Organization
include files simulator design files
data clk read write
www.sandeepani-vlsi.com
vendor libraries
compilation
simulation
Sandeepani
www.sandeepani-vlsi.com
compilation
procedure
initialization
procedure
procedure
x
procedure procedure
o x
procedure
l
procedure
simulation
Testbench
Testbench Organization
Design to verify
Sandeepani
www.sandeepani-vlsi.com
stimulus
* 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
Testbench
stimulus verify Design to verify
results
In Line Stimulus
module inline_tb; reg (7:0) data_bus, addr; reg reset; // instance of DUT initial begin reset = 1bo; data_bus = 8hoo; # 5 reset = 1b1; #15 reset = 1bo; #10 data_bus = 8h45; #15 addr = 8hf0; #40 data_bus = 8h0f; 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
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
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
#< 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:
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
Sandeepani
www.sandeepani-vlsi.com
Simulation control
simulation flow
#200 $stop;
#1000 $finish;
Sandeepani
www.sandeepani-vlsi.com
Compiler directives
`include <file name> 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
`timescale 10ns/1ns
Sandeepani
www.sandeepani-vlsi.com
File outputs
32 channels available
32h000_0001 32h000_0800 channel descriptor for standard output(bit 0 set) channel descriptor for 11th channel (bit 11 set)
Sandeepani
www.sandeepani-vlsi.com
$fopen, $fclose
$fopen integer chan_num1,chan_num2;
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
//assign outputs
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
module test_busif; reg clk; //clock generation . //instantiation of task module mytask m1 ( ) ; //creating stimulus.. Initial begin m1.neg_clocks(6); m1.cpu_driver(8h00); end endmodule
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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)==320) azero=1b1; else azero=1b0 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
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. VPI routines PLI 1.0 PLI 2.0 1990 1993
Introduction
Capabilities of Verilog PLI
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 And Stimulus
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
Sandeepani
www.sandeepani-vlsi.com
Objects in Verilog
Module instances, ports, pin-to-pin paths, intermodule paths Top-level modules Primitive instances, terminals
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Example
Example: 2-to-1 Multiplexer
Sandeepani
www.sandeepani-vlsi.com
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
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
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
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
Sandeepani
www.sandeepani-vlsi.com
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
Sandeepani
www.sandeepani-vlsi.com
function */ short data; int (*checktf) ( ); int (*sizetf) ( ); int (*calltf) ( ); int (*misctf) ( ); char *tfname; int forwref; char *tfveritool; char *tferrmessage; } s_tfcell, *p_tfcell;
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
/* sizetf routine */
/* 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
{0}
};
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
Sandeepani
www.sandeepani-vlsi.com
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
Sandeepani
www.sandeepani-vlsi.com
Topics
FIFO (First-in First-out) design specification Implementation Module declarations Functional code Testbench design and implementation
FIFO Specification
Data is read and written on rising edge of clock Asynchronously resetable
Sandeepani
www.sandeepani-vlsi.com
FIFO design is a register block at the end of a data path FIFO is synchronous 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 . . .
rd_ptr 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
rd_ptr
wr_ptr
three
Sandeepani
www.sandeepani-vlsi.com
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; // output declarations output f_full; output f_empty; output [WIDTH-1:0] data_out; // register declarations // internal variable declarations // functional code endmodule data_in WIDTH wr_en rd_en fifo data_out WIDTH f_full f_empty
reset clock
Sandeepani
www.sandeepani-vlsi.com
wr_ptr rd_ptr . . . . . . . . . .
LENGTH-1.
Sandeepani
www.sandeepani-vlsi.com
always @ (posedge clock or posedge reset) if (reset) Clocked procedure begin rd_ptr < = {ADDRESS_WIDTH {1b0}}; describes functionally wr_ptr < = {ADDRESS_WIDTH {1b0}}; 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
Module fifo
/ / declarations / / clocked procedure / / full and empty pointers assign and empty pointers
assign f_full = ( ( rd_ptr wr_ptr) = = 5b000001); 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;
Sandeepani
www.sandeepani-vlsi.com
Testbench Declarations
module fifo_tb Parameter WIDTH =8; Parameter ADDRESS_WIDTH = 5: Parameter PERIOD = 10;
/ / input declarations
/ / output declarations
wire f_full;
Wire f_empty; wire endmodule
Sandeepani
www.sandeepani-vlsi.com
Describing Stimulus
initial begain data = { WIDTH {1b0}}; {wr_en, rd_en} = 2b00; $monitor (data_out,, f_full,,,f_empty reset=1b0; #2; reset = 1b1; read from an empty fifo to check the empty flag Any tune these signals change, display their stable values in the standard output Initial clock = 1b0; Always # PERIOD clock = - clock,
#5;
reset =1b0; @(negedge clock) ; rd_en = 1b0; wr_en = 1b1; for (i = 0, i <35; i = i + 1) begin @(negedge clock); data = 255 i; halt simulation read two words to check advancing read pointer Fill FIFO and then write to check full flag
end
Sandeepani
www.sandeepani-vlsi.com
Describing Stimulus
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.