```ECEN475 Introduction to VLSI System Design
Verilog HDL
ECEN 475
3.1
HDLs
 Hardware Description Languages
 Widely used in logic design
 Verilog and VHDL
 Describe hardware using code
 Document logic functions
 Simulate logic before building
 Synthesize code into gates and layout
 Requires a library of standard cells
ECEN 475
2.2
Taste of Verilog
Module name
Module ports
module Add_half ( sum, c_out, a, b );
input
a, b;
Declaration of port
modes
output
sum, c_out;
wire
c_out_bar;
Declaration of internal
signal
xor (sum, a, b);
nand (c_out_bar, a, b);
not (c_out, c_out_bar);
endmodule
Verilog keywords
ECEN 475
Instantiation of primitive
gates
a
b
sum
c_out_bar
c_out
2.3
Taste of Verilog
module Add_full ( sum, c_out, a, b, c_in );
input
a, b, c_in;
output
sum, c_out;
OR (c_out, c1, c2);
endmodule
ECEN 475
2.4
Behavioral Description
module Add_half ( sum, c_out, a, b );
input
a, b;
output
sum, c_out;
a
reg sum, c_out;
always @ ( a or b )
b
begin
sum = a ^ b;
// Exclusive or
c_out = a & b;
// And
end
endmodule
ECEN 475
sum
c_out
2.5
Continuous Assignment
module Add_half ( sum, c_out, a, b );
input
a, b;
output
sum, c_out;
assign sum = a ^ b;
// Exclusive or
assign c_out = a & b; // And
endmodule
ECEN 475
2.6
Example of Flip-flop
module Flip_flop ( q, data_in, clk, rst );
input
data_in, clk, rst;
output
q;
reg q;
always @ ( posedge clk )
begin
if ( rst == 1) q = 0;
else q = data_in;
end
endmodule
ECEN 475
rst
data_in
q
clk
Declaration of synchronous behavior
Procedural statement
2.7
Gate Delay
 and (yout, x1, x2);
// default, zero gate
delay
 and #3 (yout, x1, x2); // 3 units delay for all
transitions
 and #(2,3) G1(yout, x1, x2); // rising, falling delay
 and #(2,3) G1(yout, x1, x2), G2(yout2, x3, x4);
// Multiple instances
ECEN 475
2.8
Time Scales
 Time scale directive: ‘ timescale <time_unit>/<time_precision>
 time_unit -> physical unit of measure, time scale of delay
 time_precision -> time resolution/minimum step size during
simulation
 time_unit  time_precision
ECEN 475
Unit/precision Delay
specification
Simulator time Delay value in
step
simulation
1ns / 100ps
#4
0.1ns
4.0ns
100ns / ns
#4
1ns
400ns
10ns / 100ps
#4.629
0.1ns
46.3ns
2.9
Net Delay
……
wire #2 y_tran;
and #3 (y_tran, x1, x2);
buf #1 (buf_out, y_tran);
and #3 (y_inertial, x1, x2);
……
x1
2
4
6
8
10
2
4
6
8
10
2
4
6
8
10
2
4
6
8
10
2
4
6
8
10
x2
y_inertial
x1
y_tran
x2
buf_out
y_tran
y_inertial
buf_out
ECEN 475
2.10
Structural vs. Behavioral Descriptions
module my_module(…);
…
assign …; // continuous assignment
and (…); // instantiation of primitive
adder_16 M(…); // instantiation of module
always @(…)
begin … end
initial
begin … end
endmodule
ECEN 475
Structural, no order
Behavior, in order in each procedure
2.11
Behavioral Statements
initial | always
single_statement; |
begin
block_of_statements;
end
 initial
 Activated from tsim = 0
 Executed once
 Initialize a simulation
 always
 Activated from tsim = 0
 Executed cyclically
 Continue till simulation
terminates
ECEN 475
2.12
Example of Behavioral Statement
module clock1 ( clk );
parameter half_cycle = 50;
parameter max_time = 1000;
output clk;
reg clk;
initial
clk = 0;
always
begin
#half_cycle clk = ~clk;
end
initial
#max_time \$finish;
endmodule
ECEN 475
clk
50
100 150 200
tsim
2.13
Assignment
 Continuous assignment
 Values are assigned to net variables due to some
input variable changes
 “assign …=… “
 Procedural assignment
 Values are assigned to register variables when
certain statement is executed in a behavioral
description
 Procedural assignment, “=“
ECEN 475
2.14
Example
module mux4_PCA(a, b, c, d, select, y_out);
input a, b, c, d; input [1:0] select;
output y_out; reg y_out;
always @(select or a or b or c or d)
begin
Value of ‘a’ is assigned to
if (select == 0) y_out=a;
y_out at this time
else if (select == 1) y_out=b;
else if (select == 2) y_out=c;
else if (select == 3) y_out=d;
else y_out=1’bx;
end
endmodule
ECEN 475
2.15
Blocking and Non-blocking Assignment
initial
begin
a = 1;
b = 0;
a = b; // a = 0;
b = a; // b = 0;
end
initial
begin
a = 1;
b = 0;
a <= b; // a = 0;
b <= a; // b = 1;
end
ECEN 475
 Blocking assignment “=“
 Statement order matters
 A statement has to be executed
before next statement
 Non-blocking assignment “<=“
 Concurrent assignment
 If there are multiple non-
blocking assignments to same
variable in same behavior,
latter overwrites previous
2.16
Delay Control Operator (#)
initial
begin
#0 in1 = 0; in2 = 1;
#10 in3 = 1;
#40 in4 = 0; in5 = 1;
#60 in3 = 0;
end
ECEN 475
2.17
Event Control Operator (@)
…
@ ( eventA or eventB ) begin
…
 Event -> identifier or expression
 When “@” is reached
 Activity flow is suspended
end
 The event is monitored
 Other processes keep going
 posedge: 0->1, 0->x, x->1
 negedge: 1->0, 1->x, x->0
ECEN 475
2.18
Intra-assignment Delay: Blocking Assignment
// B = 0 at time 0
// B = 1 at time 4
…
#5 A = B; // A = 1
C = D;
…
A = #5 B; // A = 0
C = D;
…
A = @(enable) B;
C = D;
…
A = @(named_event) B;
C= D;
…
ECEN 475
 If timing control operator(#,@)
on LHS
 Blocking delay
 RHS evaluated at (#,@)
 Assignment at (#,@)
 If timing control operator(#,@)
on RHS
 Intra-assignment delay
 RHS evaluated immediately
 Assignment at (#,@)
2.19
Activity Flow Control ( if … else )
if ( A == B ) P = d;
if ( B < C );
if ( a >= b )
begin
…
end
if ( A < B ) P = d;
else P = k;
 Syntax: if ( expression )
statement [ else statement ]
 Value of expression
 0, x or z => false
 Non-zero number => true
if ( A > B ) P = d;
else if ( A < B ) P = k;
else P = Q;
ECEN 475
2.20
Conditional Operator ( ? … : )
always @ ( posedge clock )
yout = ( sel ) ? a + b : a – b;
Conditional operator can be applied in
• either continuous assignments
• or behavioral descriptions
ECEN 475
2.21
The case Statement
module mux4 ( a, b, c, d, select, yout );
input a, b, c, d;
input [1:0] select;
output yout;
reg yout;
always @( a or b or c or d or select )
begin
case ( select )
0: yout = a;
1: yout = b;
2: yout = c;
3: yout = d;
default yout = 1`bx;
endcase
endmodule
ECEN 475
 Case items are examined in
order
 Exact match between case
expression and case item
 casez – treats “z” as don’t
cares
 casex – treats both “x” and
“z” as don’t cares
2.22
Switch Level NAND Gate
module nand_2 ( Y, A, B );
output Y;
input A, B;
supply0 GND;
supply1 PWR;
wire w;
pmos ( Y, PWR, A );
pmos ( Y, PWR, B );
nmos ( Y, w, A );
nmos ( w, GND, B );
endmodule
ECEN 475
Vdd
B
A
Y
A
B
2.23
```