Verilog 1
Verilog 1
MODULE ORG(Y,A,B);
INPUT A,B;
OUTPUT Y;
OR A1(Y,A,B);
ENDMODULE
NOT GATE
MODULE NOTG(Y,X);
INPUT X;
OUTPUT Y;
NOT A2(Y,X);
ENDMODULE
NAND GATE
MODULE NANDG(Y,A,B);
INPUT A,B;
OUTPUT Y;
NAND A3(Y,A,B);
ENDMODULE
NORGATE
MODULE NORG(Y,A,B);
INPUT A,B;
OUTPUT Y;
NOR A4(Y,A,B);
ENDMODULE
HALF ADDER
MODULE HAG(S,C,A,B);
INPUT A,B;
OUTPUT S,C;
XOR X1(S,A,B);
AND X2(C,A,B);
ENDMODULE
FULL ADDER
MODULE FAG(S,C,A,B,CIN); W1
INPUT A,B,CIN;
OUTPUT S,C;
WIRE [3:1]W;
XOR X1(W[1],A,B);
AND X2(W[2],A,B);
XOR X3(S,W[1],CIN); W3
AND X4(W[3],CIN,W[1]);
OR X5(C,W[2],W[3]); W2
ENDMODULE
TEST BENCH OF HALFADDER
• TEST BENCH FULL ADDER
MODULE HAG_TB; MODULE FAG_TB;
REG A,B; REG A,B,CIN;
WIRE S,C;
WIRE S,C;
HAG H1(S,C,A,B);
INITIAL FAG H1(S,C,A,B,CIN);
REPEAT(100) INITIAL
BEGIN
REPEAT(100)
A=$RANDOM;
B=$RANDOM; BEGIN
#100; A=$RANDOM;
END
B=$RANDOM;
ENDMODULE
CIN=$RANDOM;
#100;
END
ENDMODULE
HALF SUBSTRACTOR
MODULE HSG(D,BOR,A,B);
INPUT A,B;
OUTPUT D,BOR;
WIRE W1;
XOR X1(D,A,B);
NOT X2(W1,A);
AND X3(BOR,W1,B);
ENDMODULE
FULL SUBSTRACTOR
MODULE FSG(D,BOR,A,B,BIN);
INPUT A,B,BIN;
OUTPUT D,BOR;
W1
WIRE [5:1]W;
XOR X1(W[1],A,B); W5
NOT X5(W[2],A); W2 W3
AND X2(W[4],W[2],B);
XOR X3(D,W[1],BIN);
NOT X6(W[3],W[1]); W4
AND X4(W[5],BIN,W[1]);
OR X5(BOR,W[4],W[5]);
ENDMODULE
TEST BENCH OF HALFADDER
• TEST BENCH FULL ADDER
MODULE HSG_TB; MODULE FSG_TB;
REG A,B; REG A,B,BIN;
WIRE S,C;
WIRE D,BOR;
HSG H1(D,BOR,A,B);
INITIAL FSG H1(D,BOR,A,B,BIN);
REPEAT(100) INITIAL
BEGIN
REPEAT(100)
A=$RANDOM;
B=$RANDOM; BEGIN
#100; A=$RANDOM;
END
B=$RANDOM;
ENDMODULE
BIN=$RANDOM;
#100;
END
ENDMODULE
MULTIPLEXER 2:1
MODULE MUX21(Y,I,S);
INPUT [1:0]I;
INPUT S;
OUTPUT Y;
WIRE [3:1]W; W3
NOT A1(W[1],S);
AND A2(W[2],I[0],W[1]);
AND A3(W[3],I[1],S);
OR A4(Y,W[2],W[3]); W1 W2
ENDMODULE
TEST BENCH OF HALFADDER
• TEST BENCH FULL ADDER
MODULE HAG_TB; MODULE FAG_TB;
REG A,B; REG A,B,CIN;
WIRE S,C;
WIRE S,C;
HAG H1(S,C,A,B);
INITIAL FAG H1(S,C,A,B,CIN);
REPEAT(100) INITIAL
BEGIN
REPEAT(100)
A=$RANDOM;
B=$RANDOM; BEGIN
#100; A=$RANDOM;
END
B=$RANDOM;
ENDMODULE
CIN=$RANDOM;
#100;
END
ENDMODULE
MULTIPLEXER 4:1
MODULE MUX41(Y,I,S); W3
INPUT [3:0]I;
INPUT [1:0]S;
OUTPUT Y;
W4
WIRE [6:1]W;
NOT A1(W[1],S[0]);
NOT A2(W[2],S[1]);
W5
AND A3(W[3],I[0],W[1],W[2]);
AND A4(W[4],I[1],W[1],S[1]);
AND A5 (W[5],I[2],S[0],W[2]);
AND A6 (W[6],I[3],S[0],S[1]); W6
OR A7(Y,W[6],W[5],W[4],W[3]);
ENDMODULE W2
W1
DECODER 3:8
MODULE DEC38(D,A,B,C);
INPUT A,B,C;
OUTPUT [7:0]D;
WIRE [3:1]W;
NOT A1(W[1],A);
NOT A2(W[2],B);
NOT A3(W[3],C);
AND A4(D[0],W[1],W[2],W[3]);
AND A5(D[1],W[1],W[2],C);
AND A6(D[2],W[1],B,W[3]);
AND A7(D[3],W[1],B,C);
AND A8(D[4],A,W[2],W[3]);
AND A9(D[5],A,W[2],C);
AND A10(D[6],A,B,W[3]);
AND A11(D[7],A,B,C);
ENDMODULE
ENCODER 4:2
MODULE ENC42(X,Y,D2,D3,D1);
INPUT D2,D3,D1;
OUTPUT X,Y;
WIRE [3:1]W;
Module Instances
Syntax
X3 X2 X1
ADDER/SUBSTRACTOR
CARRY LOOK AHEAD GENERATOR
MULTIPLEXER 2:1
MODULE MUX2(Y,I,S);
INPUT [1:0]I;
INPUT S;
OUTPUT Y;
WIRE [3:1]W;
W3
NOT A1(W[1],S);
AND A2(W[2],I[0],W[1]);
AND A3(W[3],I[1],S);
OR A4(Y,W[2],W[3]); W2
ENDMODULE
W1
MULTIPLEXER 4:1 USING MUX2
MODULE MUX4(F,S,I); W1
INPUT [3:0]I;
INPUT [1:0]S; W2
OUTPUT F;
WIRE [2:1]W;
MUX2 M1(W[1],I[3:2],S[1]);
MUX2 M3(W[2],I[1:0],S[1]);
MUX2 M4(F,W[2:1],S[0]);
ENDMODULE
Multiplexer 4:1
Multiplexer 4:1
Test bench for4:1 mux
Test bench for mux4:1
Test Bench mux 4:1
4 bit parallel adder
Test bench 4 bit parallel adder
Test bench 4 bit parallel adder
GATE DELAYS
GATE DELAYS
GATE DELAYS
DATA FLOW MODELLING
Continuous Assignments
• A continuous assignment is the most basic statement in dataflow modeling, used
to drive a value onto a net. This assignment replaces gates in the description of the
circuit and describes the circuit at a higher level of abstraction. The assignment
statement starts with the keyword assign.
// Continuous assign. out is a net. i1 and i2 are nets.
assign out = i1 & i2;
// Continuous assign for vector nets. addr is a 16-bit vector net
// addr1 and addr2 are 16-bit vector registers.
assign addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0];
// Concatenation. Left-hand side is a concatenation of a scalar
// net and a vector net.
assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
Implicit Continuous Assignment
Instead of declaring a net and then writing a continuous assignment on the
net, Verilog provides a shortcut by which a continuous assignment can be
placed on a net when it is declared. There can be only one implicit declaration
assignment per net because a net is declared only once.
//Regular continuous assignment
wire out;
assign out = in1 & in2;
//Same effect is achieved by an implicit continuous assignment
wire out = in1 & in2;
• Implicit Net Declaration
If a signal name is used to the left of the continuous assignment, an implicit
net declaration will be inferred for that signal name. If the net is connected to
a module port, the width of the inferred net is equal to the width of the
module port.
// Continuous assign. out is a net.
wire i1, i2;
assign out = i1 & i2;
Delays in Data Flow Modelling
• Regular Assignment Delay
• Implicit Continuous Assignment Delay
• Net Declaration Delay
MODULE HAG(S,C,A,B);
INPUT A,B;
OUTPUT S,C;
XOR X1(S,A,B);
AND X2(C,A,B);
ENDMODULE
FULL ADDER
MODULE FAG(S,C,A,B,CIN); W1
INPUT A,B,CIN;
OUTPUT S,C;
WIRE [3:1]W;
XOR X1(W[1],A,B);
AND X2(W[2],A,B);
XOR X3(S,W[1],CIN); W3
AND X4(W[3],CIN,W[1]);
OR X5(C,W[2],W[3]); W2
ENDMODULE
HALF SUBSTRACTOR
MODULE HSG(D,BOR,A,B);
INPUT A,B;
OUTPUT D,BOR;
WIRE W1;
XOR X1(D,A,B);
NOT X2(W1,A);
AND X3(BOR,W1,B);
ENDMODULE
FULL SUBSTRACTOR
MODULE FSG(D,BOR,A,B,BIN);
INPUT A,B,BIN;
OUTPUT D,BOR;
W1
WIRE [5:1]W;
XOR X1(W[1],A,B); W5
NOT X5(W[2],A); W2 W3
AND X2(W[4],W[2],B);
XOR X3(D,W[1],BIN);
NOT X6(W[3],W[1]); W4
AND X4(W[5],BIN,W[1]);
OR X5(BOR,W[4],W[5]);
ENDMODULE
MULTIPLEXER 2:1
MODULE MUX21(Y,I,S);
INPUT [1:0]I;
INPUT S;
OUTPUT Y;
WIRE [3:1]W; W3
NOT A1(W[1],S);
AND A2(W[2],I[0],W[1]);
AND A3(W[3],I[1],S);
OR A4(Y,W[2],W[3]); W1 W2
ENDMODULE
MULTIPLEXER 4:1
MODULE MUX41(Y,I,S); W3
INPUT [3:0]I;
INPUT [1:0]S;
OUTPUT Y;
W4
WIRE [6:1]W;
NOT A1(W[1],S[0]);
NOT A2(W[2],S[1]);
W5
AND A3(W[3],I[0],W[1],W[2]);
AND A4(W[4],I[1],W[1],S[1]);
AND A5 (W[5],I[2],S[0],W[2]);
AND A6 (W[6],I[3],S[0],S[1]); W6
OR A7(Y,W[6],W[5],W[4],W[3]);
ENDMODULE W2
W1
DECODER 3:8
MODULE DEC38(D,A,B,C);
INPUT A,B,C;
OUTPUT [7:0]D;
WIRE [3:1]W;
NOT A1(W[1],A);
NOT A2(W[2],B);
NOT A3(W[3],C);
AND A4(D[0],W[1],W[2],W[3]);
AND A5(D[1],W[1],W[2],C);
AND A6(D[2],W[1],B,W[3]);
AND A7(D[3],W[1],B,C);
AND A8(D[4],A,W[2],W[3]);
AND A9(D[5],A,W[2],C);
AND A10(D[6],A,B,W[3]);
AND A11(D[7],A,B,C);
ENDMODULE
ENCODER 4:2
MODULE ENC42(X,Y,D2,D3,D1);
INPUT D2,D3,D1;
OUTPUT X,Y;
WIRE [3:1]W;
MULTIPLEXER 2:1
MODULE MUX2(Y,I,S);
INPUT [1:0]I;
INPUT S;
OUTPUT Y;
WIRE [3:1]W;
W3
NOT A1(W[1],S);
AND A2(W[2],I[0],W[1]);
AND A3(W[3],I[1],S);
OR A4(Y,W[2],W[3]); W2
ENDMODULE
W1
BEHAVIOUR MODELLING
INITIAL STATEMENT
ALWAYS STATEMENT
INTRA ASSGNMENT DELAY
EVENT BASED TIMING CONTROL
Use of @* Operator
CONDITIONAL STATEMENTS
DFLIP FLOP
• endmodule
Traffic Signal Controller
`define TRUE 1'b1
`define FALSE 1'b0
`define Y2RDELAY 3 //Yellow to red delay
`define R2GDELAY 2 //Red to green delay
module sig_control (hwy, cntry, X, clock, clear);
output [1:0] hwy, cntry;
reg [1:0] hwy, cntry;
input X;
input clock, clear;
parameter RED = 2'd0,
YELLOW = 2'd1,
GREEN = 2'd2;
parameter S0 = 3'd0, //GREEN RED
S1 = 3'd1, //YELLOW RED
S2 = 3'd2, //RED RED
S3 = 3'd3, //RED GREEN
S4 = 3'd4; //RED YELLOW
reg [2:0] state;
reg [2:0] next_state;
always @(posedge clock)
if (clear)
state <= S0; //Controller starts in S0 state
else
state <= next_state; //State change
always @(state)
begin
hwy = GREEN; //Default Light Assignment for Highway
cntry = RED; //Default Light Assignment for Country light
case(state)
S0: ; // No change, use default
S1: hwy = YELLOW;
S2: hwy = RED;
S3: begin
hwy = RED;
cntry = GREEN;
end
S4: begin
hwy = RED;
cntry = `YELLOW;
end
endcase
end
always @(state or X)
begin
case (state)
S0: if(X)
next_state = S1;
else
next_state = S0;
S1: begin //delay some positive edges of clock
Repeat(`Y2RDELAY) @(posedge clock) ;
next_state = S2;
end
S2: begin //delay some positive edges of clock
repeat(`R2GDELAY) @(posedge clock);
next_state = S3;
end
S3: if(X)
next_state = S3;
else
next_state = S4;
S4: begin //delay some positive edges of clock
repeat(`Y2RDELAY) @(posedge clock) ;
next_state = S0;
end
default: next_state = S0;
endcase
end
endmodule
Test bench for traffic light
module stimulus;
wire [1:0] MAIN_SIG, CNTRY_SIG;
reg CAR_ON_CNTRY_RD;
reg CLOCK, CLEAR;
sig_control SC(MAIN_SIG, CNTRY_SIG, CAR_ON_CNTRY_RD, CLOCK, CLEAR);
initial
$monitor($time, " Main Sig = %b Country Sig = %b Car_on_cntry = %b",
MAIN_SIG, CNTRY_SIG, CAR_ON_CNTRY_RD);
initial
begin
CLOCK = `FALSE;
forever #5 CLOCK = ~CLOCK;
End
initial
begin
CLEAR = `TRUE;
repeat (5) @(negedge CLOCK);
CLEAR = `FALSE;
End
initial
begin
CAR_ON_CNTRY_RD = `FALSE;
repeat(20)@(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
repeat(10)@(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
repeat(20)@(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
repeat(10)@(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
repeat(20)@(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
repeat(10)@(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
repeat(10)@(negedge CLOCK); $stop;
end
endmodule
• module mux81for(i,s,o);
• input [7:0] i;
• input [2:0] s;
• output o;
• reg o;
• integer k;
• always @(I or s)
• for(k=0;k<8;k=k+1)
• if(k==s)
• o=i[k];
• else
• o=1’b0;
• endmodule
module bcd2_seg(a,b,c,d,o1);
input a,b,c,d;
output [6:0]o1;
reg [6:0]o1;
always @ (a or b or c or d )
case({a,b,c,d})
4'b0000:o1=7'b1111110;
4'b0001:o1=7'b0110000;
4'b0010:o1=7'b1101101;
4'b0011:o1=7'b1111001;
4'b0100:o1=7'b0110011;
4'b0101:o1=7'b0011011;
4'b0110:o1=7'b0011111;
4'b0111:o1=7'b1110000;
4'b1000:o1=7'b1111111;
4'b1001:o1=7'b1110011;
4'b1010:o1=7'b1110111;
4'b1011:o1=7'b0011111;
4'b1100:o1=7'b1000011;
4'b1101:o1=7'b0111101;
4'b1110:o1=7'b0001111;
4'b1111:o1=7'b1001111;
default :o1=7'b0000000;
endcase
module bcd2_seg_tb();
reg a,b,c,d,lt,rbi;
reg bi;
wire [6:0]o1;
bcd2_seg x1(lt,rbi,bi,a,b,c,d,o1);
initial
begin
lt=1'b1;bi=1'b1;
# 150 lt=1'b0;
end
initial
begin
{rbi,a,b,c,d}=5'b10000;
# 10 {rbi,a,b,c,d}=5'bx0001;
# 10 {rbi,a,b,c,d}=5'bx0010;
# 10 {rbi,a,b,c,d}=5'bx0011;
# 10 {rbi,a,b,c,d}=5'bx0100;
# 10 {rbi,a,b,c,d}=5'bx0101;
# 10 {rbi,a,b,c,d}=5'bx0110;
# 10 {rbi,a,b,c,d}=5'bx0111;
# 10 {rbi,a,b,c,d}=5'bx1000;
# 10 {rbi,a,b,c,d}=5'bx1001;
# 10 {rbi,a,b,c,d}=5'bx1010;
# 10 {rbi,a,b,c,d}=5'bx1011;
# 10 {rbi,a,b,c,d}=5'bx1100;
# 10 {rbi,a,b,c,d}=5'bx1101;
# 10 {rbi,a,b,c,d}=5'bx1110;
# 10 {rbi,a,b,c,d}=5'bx1111;
# 10 {rbi,a,b,c,d}=5'bx1011; //for lt=0;
# 10 {rbi,a,b,c,d}=5'bx1100;
end
endmodule
module mag_id_comp(a,b,g1,g0,gre,eq,lt);
input [7:0]a,b;
input g1,g0;
output gre,eq,lt;
reg gre,eq,lt;
always @ (a or b or g1 or g0)
begin
if(g1==1'b0|g0==1'b0)
begin
if(a>b)
begin
gre=1'b1;
eq=1'b0;
lt=1'b0;
end
else if(a==b)
begin
gre=1'b0;
eq=1'b1;
lt=1'b0;
end
else
begin
gre=1'b0;
eq=1'b0;
lt=1'b1;
end
else
begin
gre=1'b1;
eq=1'b1;
lt=1'b1;
end
end
endmodule
Test Bench for comparator
module mag_id_comp_tb();
reg [7:0]a,b;
reg g1,g0;
wire gre,eq;
integer i,j;
mag_id_comp x1(a,b,g1,g0,gre,eq);
initial
begin
repeat(3)
begin
for(i=0;i<=1;i=i+1)
begin
for(j=0;j<=1;j=j+1)
begin
g0=j;
g1=i;
# 10;
end
end
end
end
initial
fork
a=8'b10101010;
b=8'b01010101;
# 40 a=8'b01100110;
# 40 b=8'b01100110;
# 80 a=8'b00011110;
# 80 b=8'b01111000;
join
endmodule
BLOCK TYPES
Nested blocks
//Nested blocks
initial
begin
x = 1'b0;
fork
#5 y = 1'b1;
#10 z = {x, y};
join
#20 w = {y, x};
end
Generate Blocks
Generate statements are particularly convenient when the same
operation or module instance is repeated for multiple bits of a
vector, or when certain Verilog code is conditionally included
based on parameter definitions.
endmodule