module tb_ALU_32bit;
// Inputs
reg [31:0] a_in;
reg [31:0] b_in;
reg [3:0] op;
// Outputs
wire [31:0] result;
wire zero;
wire overflow;
// Instantiate the Unit Under Tset (UUT)
ALU_32bit uut(
.a_in(a_in),
.b_in(b_in),
.op(op),
.result(result),
.zero(zero),
.overflow(overflow)
);
initial begin
// Initialize Inputs
a_in =0;
b_in =0;
op = 0;
// Wait 100ns for flobal reset
#100;
// a b AND , 연산 a[n]=1 & a[n+1]=1 이면 result[n]=1 그외엔 0
a_in = 2000;
b_in = 1000;
op = 4'b0000;
#50;
// a,b or 연산 a[n+1]=1 이면 result[n]=1 그외엔 0
a_in = 2000;
b_in = 1000;
op = 4'b0001;
#50;
// a, b ADD 연산
a_in = 2000;
b_in = 1000;
op = 4'b0010;
#50;
// a, b 뺄샘 , 결과 양수
a_in = 2000;
b_in = 1000;
op = 4'b0110;
#50;
// a,b 뺄샘 a=b result = 0 , zero =1
a_in = 1000;
b_in = 1000;
op = 4'b0110;
#50;
// a,b 뺄셈 a<b result = 음수
a_in = 1000;
b_in = 2000;
op = 4'b0110;
#50;
// a 와 b의 NOR 연산 b[n+1]=0 , b[n] =0 이면 result[n]=1 나머지 0
a_in = 1000;
b_in = 2000;
op = 4'b1100;
#50;
// a가 b보다 작은지 체크 result = 00000001 (hex)
a_in = 1000;
b_in = 2000;
op = 4'b0111;
#50;
a_in = 2000;
b_in = 1000;
op = 4'b0111; // a가 b보다 작은지 체크 result = 0 예상
#50;
a_in = 1000;
b_in = 1000;
op = 4'b0110; // a<b 체크 a=b result =0 예상
#50;
//op = 4'b0010; // a,b 덧셈 명령 overflow =1 예상 a[31]=0 b[31]=0 co[30]=1
// carry_out=0 co[30]=1 XOR(carry_out,co[30])=1 overflow
a_in = 32'b01111111111111111111111111111111; // 2^31-1 32bit max value
b_in = 1;
#50;
a_in = 32'b01111111111111111111111111111111; // 2^31-1 = 2147483647 (32bit 최대 숫자)
b_in = 1;
op = 4'b0110;
// a,b 뺼셈 result= 2'b01111111111111111111111111111110 a[31]=0 b'+1 [31]=1 c[30]=1 carry_out=1 XOR c[30] carry_out = 0
#50;
a_in = 1;
b_in = 32'b01111111111111111111111111111111; // 2^31-1 = 2147483647 (32bit 최대 숫자)
op = 4'b0110;
//SUB overflow = 0 a[31]=0 b'+1 [31] = 1 c[30]=0 carry_out=0
#50;
a_in = 32'b10000000000000000000000000000001; // -2^31
b_in = 32'b01111111111111111111111111111111; // 2^31-1 = 2147483647 (32bit 최대 숫자)
op = 4'b0110;
//SUB overflow = 1 a[31]=1 b'+1 [31]=1 cin=0 carry out =1
#50;
a_in = 32'b10000000000000000000000000000001; //-2^31+1 = -2147483647
b_in = -1; // b=11111111111111111111111111111111
op = 4'b0010;
//ADD overflow = 0? a[31]=1 b[31] = 1 , c[30] =1 carry out = 1, XOR c[30] carry_out=0
#50;
a_in = 32'b10000000000000000000000000000000; //-2^31 = -2147483648 (32bit 최소 숫자)
b_in = -1;
op = 4'b0010;
//ADD overflow = 1 a[31]=1 b[31] = 1 , c[30] =0 carry out = 1, XOR c[30] carry_out=1
#50;
a_in = 0;
b_in = 32'b10000000000000000000000000000000; //-2^31 = -2147483648 (32bit 최소 숫자)
op = 4'b0110;
// SUB overflow = 1 a[31]=0 b[31] = 1 , c[0]=1 c[30] =1 carry out = 0, XOR c[30] carry_out=1
// invert b 하고 c[0]=1 이니까 overflow가 되는구나
#50;
end
endmodule