```////////////////////////////////////////////////////////////////////////////////
///
/// Solution to LSU EE 3755 Spring 2002 Homework 1
///

// Assignment:"http://www.ee.lsu.edu/ee3755/2002/hw01.pdf

////////////////////////////////////////////////////////////////////////////////
/// Problem 1
///

module decode_2_to_4(x0,x1,x2,x3,a);
input [1:0] a;
output      x0, x1, x2, x3;

not n0(a0n,a[0]);
not n1(a1n,a[1]);

and a0(x0,a1n,a0n);
and a1(x1,a1n,a[0]);
and a2(x2,a[1],a0n);
and a3(x3,a[1],a[0]);

endmodule

////////////////////////////////////////////////////////////////////////////////
/// Problem 2
///

module atoi_implicit(i,s);
input [15:0] s;
output [7:0] i;

assign  i[3:0] = s[3:0] + ( s[6] ? 4'd9 : 4'd0 );
assign  i[7:4] = s[11:8] + ( s[14] ? 4'd9 : 4'd0 );

endmodule

module not_a_good_solution_atoi_implicit(i,s);
input [15:0] s;
output [7:0] i;

parameter  ascii_0 = 48;
parameter  ascii_a = 97;

// The code below should work (but not tested) however it requires
// more hardware than the first solution.  In particular, it does a
// magnitude comparison when it's sufficient to test a single bit
// of s.  It does 8-bit subtractions when only the four least
// significant bits are used.

assign i[3:0] = s[7:0] >= ascii_a ? s[7:0] - ascii_a + 10 : s[7:0] - ascii_0;
assign i[7:4] = s[15:8] >= ascii_a
? s[15:8] - ascii_a + 10
: s[15:8] - ascii_0;

endmodule

////////////////////////////////////////////////////////////////////////////////
/// Problem 3
///

module atoi_explicit(i,s);
input [15:0] s;
output [7:0] i;

endmodule

//
// Modules for use in Problem 3
//
// DO NOT modify these modules.

module sub4(d,a,b);
input [3:0] a, b;
output [3:0] d;

assign       d = a - b;

endmodule

input [3:0] a, b;
output [3:0] d;

assign       d = a + b;

endmodule

module sub7(d,a,b);
input [6:0] a, b;
output [6:0] d;

assign       d = a - b;

endmodule

input [6:0] a, b;
output [6:0] d;

assign       d = a + b;

endmodule

////////////////////////////////////////////////////////////////////////////////
/// Testbenches
///

module test_decoder();

parameter stop_on_error = 1;

reg [1:0] a;
wire      x0, x1, x2, x3;
reg [3:0] x;

decode_2_to_4 your_decoder(x0,x1,x2,x3,a);

integer   i, err;

initial begin

err = 0;

for(i=0; i<4; i=i+1) begin

a = i[1:0];
#1;
x = 1 << a;
if( {x3,x2,x1,x0} !== x )
begin
\$display("FAIL: Demux wrong output for input %d",a);
err = err + 1;
if( stop_on_error ) \$stop;
end
end

if( !err ) \$write("PASS: ");
\$write("Tests completed, ");
if( err )
\$display("encountered %d errors.",err);
else
\$display("no errors found.\n");

\$display("Thank you for using the decode testbench.");

end

endmodule

module test_atoi();

wire [7:0] ie, ii;
reg [15:0] s;

parameter  stop_on_error = 1;
parameter  ascii_0 = 48;
parameter  ascii_a = 97;

atoi_explicit our_atoi_explicit(ie,s);
atoi_implicit our_atoi_implict(ii,s);

integer    i, err_i, err_e;

integer    d0, d1;

initial begin

err_i = 0;  err_e = 0;

for(i=0; i<256; i=i+1)
begin

d0 = i & 15;
d1 = i >> 4;
s[7:0]  = d0 < 10 ? d0 + ascii_0 : d0 + ascii_a - 10;
s[15:8] = d1 < 10 ? d1 + ascii_0 : d1 + ascii_a - 10;
#1;
if( ie !== i ) begin
\$display("FAIL: Explicit, wrong output, 0x%h (correct) != 0x%h",
i,ie);
err_e = err_e + 1;
if( stop_on_error ) \$stop;
end
if( ii !== i ) begin
\$display("FAIL: Implicit, wrong output, 0x%h (correct) != 0x%h",
i,ii);
err_i = err_i + 1;
if( stop_on_error ) \$stop;
end

end
if( !err_i ) \$write("PASS: ");
\$write("Implicit tests completed, ");
if( err_i )
\$display("encountered %d errors.",err_i);
else
\$display("no errors found.\n");

if( !err_e ) \$write("PASS: ");
\$write("Explicit tests completed, ");
if( err_e )
\$display("encountered %d errors.",err_e);
else
\$display("no errors found.\n");

end

endmodule
```