/// Example of how not to use functions.
// For LSU EE 4702-1, Spring 2001
// This is how it SHOULD be done:
//
// Output COUNT is number of times since last RESET that SYMBOL is
// equal to TARGET on positive edge of CLK.
//
module match_count(count,reset,symbol,target,clk);
output count;
input reset, symbol, target, clk;
reg [9:0] count;
wire reset;
wire [7:0] symbol, target;
wire clk;
always @( posedge clk )
case ( 1 )
reset : count <= 0;
symbol === target : count <= count + 1;
default : count <= count;
endcase
endmodule // match_count
module test_match_count_module();
reg clk;
reg [7:0] symbol;
reg reset;
wire [9:0] s1count;
match_count mc1(s1count,reset,symbol,8'd1,clk);
wire [9:0] s2count;
match_count mc2(s2count,reset,symbol,8'd2,clk);
initial
begin:I
integer j;
reset = 1;
clk = 0;
#1;
clk = 1;
#1;
clk = 0;
reset = 0;
#1;
for(j=0;j<8;j=j+1)
begin
#1;
clk = 1;
#1;
symbol = {6'b0,j[1:0]};
#1;
clk = 0;
$display("Input is %d, count of 1's is %d",symbol,s1count);
$display("Input is %d, count of 2's is %d",symbol,s2count);
end
end
endmodule
/// WARNING: The following example will show how NOT to use functions.
module test_match_count_function();
// WARNING: This is an example of how NOT to use functions.
function [9:0] match_count;
input reset;
input [7:0] item,target;
integer c; // Static duration. (Its value sticks around.)
begin
if( reset ) c = 0;
else if( item === target ) c = c + 1;
match_count = c;
end
endfunction // match_count
reg [7:0] symbol;
reg reset;
wire [9:0] s1count;
assign s1count = match_count(reset,symbol,1);
wire [9:0] s2count;
assign s2count = match_count(reset,symbol,2);
/// WARNING: Within an example showing how NOT to use functions.
initial
begin:I
integer j;
reset = 1;
#1;
reset = 0;
#1;
for(j=0;j<8;j=j+1)
begin
symbol = {6'b0,j[2:1]};
#1;
$display("Input is %d, count of 1's is %d",symbol,s1count);
$display("Input is %d, count of 2's is %d",symbol,s2count);
end
end // block: I
// Problems:
// Unsafe use of static variables. (Incorrect behavior.)
// "Trick" simulator into executing function on changes.
endmodule // test_match_count_function
/// WARNING: The preceding example showed how NOT to use functions.