카테고리 없음

tb_ALU

이해와암기 사이 2023. 4. 23. 03:31


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