/// LSU EE 4702-1 Spring 2001 Midterm Exam Verilog Code
/// Code used in exam, for exam, and solutions.
/// Exam: http://www.ee.lsu.edu/v/2001/mt.pdf
/// Solution: http://www.ee.lsu.edu/v/2001/mt_sol.pdf
///
/// Problem 1
///
module monitor(eq_time, siga, sigb, clk);
input siga, sigb, clk;
output eq_time;
wire [31:0] siga, sigb;
wire clk;
reg [31:0] eq_time;
reg [31:0] next_count;
always @( siga or sigb ) if( siga != sigb ) next_count = 0;
always @( posedge clk )
begin
eq_time = next_count;
if( siga == sigb ) next_count = next_count + 1;
end
endmodule
module demo_monitor();
wire [31:0] et;
reg [31:0] a, b;
reg clk;
monitor m(et,a,b,clk);
initial clk = 0;
always #10 clk = ~clk;
initial begin
a = 0;
b = 1;
#25;
a = 1;
#40;
b = 2;
#4;
b = 1;
#50;
a = 3;
#25;
b = 7;
#25;
a = 7;
#50;
$stop;
end
endmodule
// Timing Diagram:
///
/// Problem 2a
///
module timing_stuff();
reg clk, clk3;
reg clk2a, clk2b, clk2c, clk2d;
initial begin
clk = 0; clk2a = 0; clk2b = 0; clk2c = 0; clk2d = 0; clk3 = 0;
#50 $stop;
end
always #5 clk = ~clk;
always @( posedge clk ) clk2a = ~clk2a;
always #12 @( posedge clk ) clk2b = ~clk2b;
always @( posedge clk ) #12 clk2c = ~clk2c;
always @( posedge clk ) clk2d <= #12 ~clk2d;
always @( posedge clk ) @( posedge clk ) clk3 = ~clk3;
endmodule // timing_stuff
// Solution:
///
/// Problem 2b
///
module timing();
integer a, b, c, d;
initial begin
a = 0;
b = 10;
c = 20;
d <= #0 3;
d = 30;
d <= #1 300;
d <= #2 3000;
#1;
b = 100;
c <= 200;
a <= #5 b + c;
#1;
b = 1000;
c <= 2000;
#10;
end
endmodule
// Solution:
///
/// Problem 3a
///
module count_match_1(count,symbol,targ);
input symbol, targ;
output count;
reg [31:0] count;
wire [31:0] symbol,targ;
always wait( symbol == targ ) count = count + 1;
// Infinite loop when symbol == targ. (Simulator freezes.)
// Possible correct code:
always begin
wait( symbol == targ ) count = count + 1;
wait( symbol != targ );
end
endmodule
module count_match_3(count,symbol,targ);
input symbol, targ;
output count;
reg [31:0] count;
wire [31:0] symbol,targ;
always #10 if( symbol == targ ) count = count + 1;
// Might miss changes in symbol, will overcount if symbol doesn't change.
// Not easy to fix without changing problem.
endmodule
module count_match_4(count,symbol,targ);
input symbol, targ;
output count;
reg [31:0] count;
wire [31:0] symbol,targ;
always @( symbol == targ ) count = count + 1;
// Counts twice, when symbol becomes equal and when it becomes unequal.
// Possible fix:
always @( posedge symbol == targ ) count = count + 1;
endmodule
///
/// Problem 3b
///
module adder1(x,a,b);
input a, b;
output x;
wire [31:0] a, b;
wire [31:0] x = a + b;
endmodule
module adder2(x,a);
input a;
output x;
parameter b = 0;
wire [31:0] a;
wire [31:0] x = a + b;
endmodule
// Line below (define) is part of solution.
`define b 7
module adder3(x,a);
input a;
output x;
wire [31:0] a;
wire [31:0] x = a + `b;
endmodule
module use_adders(x_1,x_2,x_3,a);
input a;
output x_1, x_2, x_3; // Each output should be a + 7
// Solution below:
wire [31:0] x_1, x_2, x_3, a;
adder1 a1(x_1,a,32'd7);
adder2 #(7) a2(x_1,a);
adder3 a3(x_1,a);
endmodule
///
/// Problem 3c
///
module prob3c();
reg [5:0] a, b, c, r;
initial begin
a = 6'b101010;
c = 6'bx1x0x1;
r = & a; // 0
r = | a; // 1
r = ^ a; // 1
r = & c; // 0
r = | c; // 1
r = ^ c; // x
end
endmodule
///
/// Problem 3d
///
module prob3d();
reg [5:0] x, y, foo, bar;
initial begin
x = 0;
y = 1;
foo = 7;
bar = 'bx;
if( foo > bar ) x = x + 1; else y = y + 1;
case( foo > bar )
1: x = x + 1;
default: y = y + 1;
endcase
end
endmodule
///
/// Problem 3e
///
`define incr(a) a=a+1
// ...
module prob3e();
integer i, j, k, x, y;
// Sample uses of macro.
initial begin
// Increment in for loop must be an assignment.
for(i=0; i<10; `incr(i)) x = x + y;
for(j=0; j<10; `incr(j)) begin foo(j); k = k + x; end
end
endmodule
///
/// Problem 4
///
module yet_another_symbol_counter(fives, nines, c);
input c;
output fives, nines;
wire [7:0] c;
reg [31:0] fives, nines;
initial fork
begin
fives = 0;
nines = 0;
end
#50 fork:A
repeat( 42 ) @( c ) if( c == 5 ) fives = fives + 1;
#100 disable A;
join
#70 fork:B
forever @( c ) if( c == 9 ) nines = nines + 1;
#200 disable B;
join
join
// fives: Counts from 50 to 150 cycles, first 42 symbols checked.
// nines: Counts from 70 to 270, all signals checked.
endmodule