Workshop Topics - Outline
Workshop 1 - Introduction
Workshop 2 - module instantiation
Workshop 3 - Lexical conventions
Workshop 4 - Value Logic System
Workshop 5 - Data types A
Workshop 6 - Data types B
Workshop 7 - Operators
Workshop 8 - Signed arithmetic
Workshop 9 - Behavioral modeling A
Workshop 10 - Behavioral modeling B
Workshop 11 - Behavioral modeling C
Workshop 12 - Data flow modeling
Workshop 13 - Coding Styles
1
Structural Hierarchy Description Style
Module Port/Variable/Data Declarations
Direct instantiation and connections of modules from a
separate calling module
- From the structural hierarchy of the design
A module may be declared anywhere in a design
relative to where it is called
Signals in the higher “calling” module, are connected to
signals in the lower “called” module by either:
- Named association
- Positional association
2
Module Port/Variable/Data Declarations
Combined Variable Declaration and Initialization -
Variables can be initialized when they are declared:
reg clock = 0 ; // Replaces reg clock ; initial clock = 0 ;
Combined Port/Data Declaration and Initialization:
output reg [7:0] sum = 0 ; // can be written as sum = 8’b0 ;
output reg co = 0 ;
// can be written as co = 1’b0 ;
Combined ANSI C Style Port Declaration and Initialization:
module adder(output reg [7:0] sum = 0, output reg co = 0,
input [7:0] a, b, input ci) ;
3
Module interconnections: Ports
Within a Verilog system model, module interconnections
occur at two levels:
Peer to peer: modules interconnect with each other:
Module A
Module B
Hierarchical: one module incorporates the other:
Module A
Module B
4
Module Ports
Ports provide interface for the module to communicate
with its environment.
Declaration:
<Port direction> <width> <port_name> ;
Port direction can be input, output or inout (bi-directional).
Example:
// Traditional Verilog Syntax
module my_module (in_port, inout_port, output_port) ;
input [4:0] in_port ;
// 5bits input port
inout inout_port ;
// single bit bi-directional port
output wire (or reg) [14:0] out_port ; // 15bits output port
endmodule
// ANSI C Style Port Declarations Syntax
module my_ module(input [4:0] in_port, inout inout_port,
output wire (or reg) [14:0] out_port) ;
endmodule
5
Port Specifications
An input port specifies an internal name for a vector or
scalar, driven by external entity.
An output port specifies an internal name for a vector or
scalar, driven by internal entity, available external to the
module.
An inout bi-directional port specifies an internal name for
a vector or scalar driven either by an internal or external
entity.
Input or inout port cannot be declared as of type register.
Port is always considered as net, unless declared
elsewhere as reg (only for output port)
6
Correct Port Connection
net
inout
net
reg or net
net
input
reg or net
output
module
7
net
Module Instantiation - Port connections
Ports of the instances could be connected by name or by
order list.
For small # of ports, connect by order list, else, by name.
module fa_tb ;
reg [3:0] A, B ;
reg CIN ;
wire [3:0] SUM ;
wire COUT ;
module FA4 (sum, cout, a, b, cin) ;
output wire [3:0] sum ;
output wire cout ;
input [3:0] a, b ;
input cin ;
// Instantiate/connect by Positional association (order list):
FA4 fa_byorder (SUM, COUT, A, B, CIN) ;
// Instantiate/connect by Named association (port name):
FA4 fa_byname (.cout(COUT), .sum(SUM),.b(B), .cin(CIN), .a(A));
endmodule
8
| endmodule
Test Bench and UUT Instantiation
Module Test Bench incorporates, hierarchically, the
Unit Under Test (UUT) module
Stimuli
registers
9
Unit Under Test
Monitor
inputs
wires
wires
outputs
wires, regs
D_FF Test Bench
`include “D_FF.v"
// include the UUT Verilog file for simulator parsing
`timescale 1ns / 100ps /* compiler directive.
sets simulation’s time unit and precision */
module D_FF_tb () ;
reg Clk, Nrst, D ;
// Stimuli signals
wire Q ;
// Monitor signal
D_FF UUT(Clk, Nrst, D, Q) ; // instantiation of the D_FF (UUT)
initial
begin
Clk = 1'b0 ; Nrst = 1'b0 ; D = 1'b0 ; // System monitoring function
$monitor($time,"Clk=%b, Nrst=%b, D=%b, Q=%b",Clk, Nrst, D, Q) ;
end
always #1 Clk = ~Clk ; // Clock declaration, toggle clock every half-cycle
initial
begin
#2 Nrst = 1'b1 ;
// Out of reset
#2 D = 1'b1 ;
#2 $finish ;
// System function - end simulation run
end
endmodule
10
D_FF Simulation results
11
4bit Counter
`timescale 1ns / 100ps // result evaluated every 1ns, 100ps resolution
module cntr_4b (clk, nrst, dout) ; // module name and ports list
input clk, nrst ;
output reg [3:0] dout ;
// input ports - clock and active-low reset
// counter output port
always @ (posedge clk or negedge nrst)
// if "or negedge nrst" deleted - synchronous reset
begin
if (!nrst)
// Asynchronous reset
dout = 4'b0 ;
else
// Out of reset - normal operation
dout = dout + 1 ; // if -1, down counter
end
endmodule
12
4bit Counter Test Bench
`include “cntr_4b.v“
// include the UUT Verilog file for simulator parsing
`timescale 1ns / 100ps
module cntr_4b_tb ;
reg Clk, Nrst ;
// System Clock and active-low Reset Stimuli signals
wire [3:0] Dout ;
// Counter Output Monitor
cntr_4b UUT (Clk, Nrst, Dout) ; // instantiation of the 4bits Counter
initial
begin
Clk = 1'b0 ; Nrst = 1'b0 ;
// System monitoring function
$monitor($time, "Clk=%b, Nrst=%b, Dout=%h", Clk, Nrst, Dout) ;
end
always #1 Clk = ~Clk ; // Clock declaration. Clock cycle time = 2nSec
initial
begin
#2 Nrst = 1'b1 ; // Out of reset
#35 $finish ;
// System function - end simulation run
end
endmodule
13
4bit Counter Simulation results
14