Search code examples
verilogsystem-verilogvivadotest-bench

$display not working properly in testbench


I am working on 4-bit adder/subtractor (depends on my input). I used 4-bit ripple carry adder method to achieve that. I am testbenching all 4-bit numbers so there is a overflow in some cases. I want the testbench to $display("overflow") whenever the overflow appears as 1 on output. I am attaching the testbench code here.

module yxz;

    reg [3:0] A;
    reg [3:0] B;
    wire [3:0] S;
    reg Op;
    wire  V;
U2_add_sub xyz(.A(A), .B(B), .S(S), .Op(Op), .V(V));
    

        
        initial begin
        
        Op = 0; // Op = 0 ->adder; Op = 1 ->subtractor
       
        if (V == 1) begin
                $display("overflow");
                end
        A = 4'b0000; B = 4'b0000; #10
        A = 4'b0000; B = 4'b0001; #10
        A = 4'b0000; B = 4'b0010; #10
        A = 4'b0000; B = 4'b0011; #10
        A = 4'b0000; B = 4'b0100; #10
        A = 4'b0000; B = 4'b0101; #10
        A = 4'b0000; B = 4'b0110; #10
        A = 4'b0000; B = 4'b0111; #10
        A = 4'b0000; B = 4'b1000; #10
        A = 4'b0000; B = 4'b1001; #10
        A = 4'b0000; B = 4'b1010; #10
        A = 4'b0000; B = 4'b1011; #10
        A = 4'b0000; B = 4'b1100; #10
        A = 4'b0000; B = 4'b1101; #10
        A = 4'b0000; B = 4'b1110; #10
        A = 4'b0000; B = 4'b1111; #10
        A = 4'b0001; B = 4'b0000; #10
        A = 4'b0001; B = 4'b0001; #10
        A = 4'b0001; B = 4'b0010; #10
        A = 4'b0001; B = 4'b0011; #10
        A = 4'b0001; B = 4'b0100; #10
        A = 4'b0001; B = 4'b0101; #10
        A = 4'b0001; B = 4'b0110; #10
        A = 4'b0001; B = 4'b0111; #10
        A = 4'b0001; B = 4'b1000; #10
        A = 4'b0001; B = 4'b1001; #10
        A = 4'b0001; B = 4'b1010; #10
        A = 4'b0001; B = 4'b1011; #10
        A = 4'b0001; B = 4'b1100; #10
        A = 4'b0001; B = 4'b1101; #10
        A = 4'b0001; B = 4'b1110; #10
        A = 4'b0001; B = 4'b1111; #10
        A = 4'b0010; B = 4'b0000; #10
        A = 4'b0010; B = 4'b0001; #10
        A = 4'b0010; B = 4'b0010; #10
        A = 4'b0010; B = 4'b0011; #10
        A = 4'b0010; B = 4'b0100; #10
        A = 4'b0010; B = 4'b0101; #10
        A = 4'b0010; B = 4'b0110; #10
        A = 4'b0010; B = 4'b0111; #10
        A = 4'b0010; B = 4'b1000; #10
        A = 4'b0010; B = 4'b1001; #10
        A = 4'b0010; B = 4'b1010; #10
        A = 4'b0010; B = 4'b1011; #10
        A = 4'b0010; B = 4'b1100; #10
        A = 4'b0010; B = 4'b1101; #10
        A = 4'b0010; B = 4'b1110; #10
        A = 4'b0010; B = 4'b1111; #10
        A = 4'b0011; B = 4'b0000; #10
        A = 4'b0011; B = 4'b0001; #10
        A = 4'b0011; B = 4'b0010; #10
        A = 4'b0011; B = 4'b0011; #10
        A = 4'b0011; B = 4'b0100; #10
        A = 4'b0011; B = 4'b0101; #10
        A = 4'b0011; B = 4'b0110; #10
        A = 4'b0011; B = 4'b0111; #10
        A = 4'b0011; B = 4'b1000; #10
        A = 4'b0011; B = 4'b1001; #10
        A = 4'b0011; B = 4'b1010; #10
        A = 4'b0011; B = 4'b1011; #10
        A = 4'b0011; B = 4'b1100; #10
        A = 4'b0011; B = 4'b1101; #10
        A = 4'b0011; B = 4'b1110; #10
        A = 4'b0011; B = 4'b1111; #10
        A = 4'b0100; B = 4'b0000; #10
        A = 4'b0100; B = 4'b0001; #10
        A = 4'b0100; B = 4'b0010; #10
        A = 4'b0100; B = 4'b0011; #10
        A = 4'b0100; B = 4'b0100; #10
        A = 4'b0100; B = 4'b0101; #10
        A = 4'b0100; B = 4'b0110; #10
        A = 4'b0100; B = 4'b0111; #10
        A = 4'b0100; B = 4'b1000; #10
        A = 4'b0100; B = 4'b1001; #10
        A = 4'b0100; B = 4'b1010; #10
        A = 4'b0100; B = 4'b1011; #10
        A = 4'b0100; B = 4'b1100; #10
        A = 4'b0100; B = 4'b1101; #10
        A = 4'b0100; B = 4'b1110; #10
        A = 4'b0100; B = 4'b1111; #10
        A = 4'b0101; B = 4'b0000; #10
        A = 4'b0101; B = 4'b0001; #10
        A = 4'b0101; B = 4'b0010; #10
        A = 4'b0101; B = 4'b0011; #10
        A = 4'b0101; B = 4'b0100; #10
        A = 4'b0101; B = 4'b0101; #10
        A = 4'b0101; B = 4'b0110; #10
        A = 4'b0101; B = 4'b0111; #10
        A = 4'b0101; B = 4'b1000; #10
        A = 4'b0101; B = 4'b1001; #10
        A = 4'b0101; B = 4'b1010; #10
        A = 4'b0101; B = 4'b1011; #10
        A = 4'b0101; B = 4'b1100; #10
        A = 4'b0101; B = 4'b1101; #10
        A = 4'b0101; B = 4'b1110; #10
        A = 4'b0101; B = 4'b1111; #10
        A = 4'b0110; B = 4'b0000; #10
        A = 4'b0110; B = 4'b0001; #10
        A = 4'b0110; B = 4'b0010; #10
        A = 4'b0110; B = 4'b0011; #10
        A = 4'b0110; B = 4'b0100; #10
        A = 4'b0110; B = 4'b0101; #10
        A = 4'b0110; B = 4'b0110; #10
        A = 4'b0110; B = 4'b0111; #10
        A = 4'b0110; B = 4'b1000; #10
        A = 4'b0110; B = 4'b1001; #10
        A = 4'b0110; B = 4'b1010; #10
        A = 4'b0110; B = 4'b1011; #10
        A = 4'b0110; B = 4'b1100; #10
        A = 4'b0110; B = 4'b1101; #10
        A = 4'b0110; B = 4'b1110; #10
        A = 4'b0110; B = 4'b1111; #10
        A = 4'b0111; B = 4'b0000; #10
        A = 4'b0111; B = 4'b0001; #10
        A = 4'b0111; B = 4'b0010; #10
        A = 4'b0111; B = 4'b0011; #10
        A = 4'b0111; B = 4'b0100; #10
        A = 4'b0111; B = 4'b0101; #10
        A = 4'b0111; B = 4'b0110; #10
        A = 4'b0111; B = 4'b0111; #10
        A = 4'b0111; B = 4'b1000; #10
        A = 4'b0111; B = 4'b1001; #10
        A = 4'b0111; B = 4'b1010; #10
        A = 4'b0111; B = 4'b1011; #10
        A = 4'b0111; B = 4'b1100; #10
        A = 4'b0111; B = 4'b1101; #10
        A = 4'b0111; B = 4'b1110; #10
        A = 4'b0111; B = 4'b1111; #10
        A = 4'b1000; B = 4'b0000; #10
        A = 4'b1000; B = 4'b0001; #10
        A = 4'b1000; B = 4'b0010; #10
        A = 4'b1000; B = 4'b0011; #10
        A = 4'b1000; B = 4'b0100; #10
        A = 4'b1000; B = 4'b0101; #10
        A = 4'b1000; B = 4'b0110; #10
        A = 4'b1000; B = 4'b0111; #10
        A = 4'b1000; B = 4'b1000; #10
        A = 4'b1000; B = 4'b1001; #10
        A = 4'b1000; B = 4'b1010; #10
        A = 4'b1000; B = 4'b1011; #10
        A = 4'b1000; B = 4'b1100; #10
        A = 4'b1000; B = 4'b1101; #10
        A = 4'b1000; B = 4'b1110; #10
        A = 4'b1000; B = 4'b1111; #10
        A = 4'b1001; B = 4'b0000; #10
        A = 4'b1001; B = 4'b0001; #10
        A = 4'b1001; B = 4'b0010; #10
        A = 4'b1001; B = 4'b0011; #10
        A = 4'b1001; B = 4'b0100; #10
        A = 4'b1001; B = 4'b0101; #10
        A = 4'b1001; B = 4'b0110; #10
        A = 4'b1001; B = 4'b0111; #10
        A = 4'b1001; B = 4'b1000; #10
        A = 4'b1001; B = 4'b1001; #10
        A = 4'b1001; B = 4'b1010; #10
        A = 4'b1001; B = 4'b1011; #10
        A = 4'b1001; B = 4'b1100; #10
        A = 4'b1001; B = 4'b1101; #10
        A = 4'b1001; B = 4'b1110; #10
        A = 4'b1001; B = 4'b1111; #10
        A = 4'b1010; B = 4'b0000; #10
        A = 4'b1010; B = 4'b0001; #10
        A = 4'b1010; B = 4'b0010; #10
        A = 4'b1010; B = 4'b0011; #10
        A = 4'b1010; B = 4'b0100; #10
        A = 4'b1010; B = 4'b0101; #10
        A = 4'b1010; B = 4'b0110; #10
        A = 4'b1010; B = 4'b0111; #10
        A = 4'b1010; B = 4'b1000; #10
        A = 4'b1010; B = 4'b1001; #10
        A = 4'b1010; B = 4'b1010; #10
        A = 4'b1010; B = 4'b1011; #10
        A = 4'b1010; B = 4'b1100; #10
        A = 4'b1010; B = 4'b1101; #10
        A = 4'b1010; B = 4'b1110; #10
        A = 4'b1010; B = 4'b1111; #10
        A = 4'b1011; B = 4'b0000; #10
        A = 4'b1011; B = 4'b0001; #10
        A = 4'b1011; B = 4'b0010; #10
        A = 4'b1011; B = 4'b0011; #10
        A = 4'b1011; B = 4'b0100; #10
        A = 4'b1011; B = 4'b0101; #10
        A = 4'b1011; B = 4'b0110; #10
        A = 4'b1011; B = 4'b0111; #10
        A = 4'b1011; B = 4'b1000; #10
        A = 4'b1011; B = 4'b1001; #10
        A = 4'b1011; B = 4'b1010; #10
        A = 4'b1011; B = 4'b1011; #10
        A = 4'b1011; B = 4'b1100; #10
        A = 4'b1011; B = 4'b1101; #10
        A = 4'b1011; B = 4'b1110; #10
        A = 4'b1011; B = 4'b1111; #10
        A = 4'b1100; B = 4'b0000; #10
        A = 4'b1100; B = 4'b0001; #10
        A = 4'b1100; B = 4'b0010; #10
        A = 4'b1100; B = 4'b0011; #10
        A = 4'b1100; B = 4'b0100; #10
        A = 4'b1100; B = 4'b0101; #10
        A = 4'b1100; B = 4'b0110; #10
        A = 4'b1100; B = 4'b0111; #10
        A = 4'b1100; B = 4'b1000; #10
        A = 4'b1100; B = 4'b1001; #10
        A = 4'b1100; B = 4'b1010; #10
        A = 4'b1100; B = 4'b1011; #10
        A = 4'b1100; B = 4'b1100; #10
        A = 4'b1100; B = 4'b1101; #10
        A = 4'b1100; B = 4'b1110; #10
        A = 4'b1100; B = 4'b1111; #10
        A = 4'b1101; B = 4'b0000; #10
        A = 4'b1101; B = 4'b0001; #10
        A = 4'b1101; B = 4'b0010; #10
        A = 4'b1101; B = 4'b0011; #10
        A = 4'b1101; B = 4'b0100; #10
        A = 4'b1101; B = 4'b0101; #10
        A = 4'b1101; B = 4'b0110; #10
        A = 4'b1101; B = 4'b0111; #10
        A = 4'b1101; B = 4'b1000; #10
        A = 4'b1101; B = 4'b1001; #10
        A = 4'b1101; B = 4'b1010; #10
        A = 4'b1101; B = 4'b1011; #10
        A = 4'b1101; B = 4'b1100; #10
        A = 4'b1101; B = 4'b1101; #10
        A = 4'b1101; B = 4'b1110; #10
        A = 4'b1101; B = 4'b1111; #10
        A = 4'b1110; B = 4'b0000; #10
        A = 4'b1110; B = 4'b0001; #10
        A = 4'b1110; B = 4'b0010; #10
        A = 4'b1110; B = 4'b0011; #10
        A = 4'b1110; B = 4'b0100; #10
        A = 4'b1110; B = 4'b0101; #10
        A = 4'b1110; B = 4'b0110; #10
        A = 4'b1110; B = 4'b0111; #10
        A = 4'b1110; B = 4'b1000; #10
        A = 4'b1110; B = 4'b1001; #10
        A = 4'b1110; B = 4'b1010; #10
        A = 4'b1110; B = 4'b1011; #10
        A = 4'b1110; B = 4'b1100; #10
        A = 4'b1110; B = 4'b1101; #10
        A = 4'b1110; B = 4'b1110; #10
        A = 4'b1110; B = 4'b1111; #10
        A = 4'b1111; B = 4'b0000; #10
        A = 4'b1111; B = 4'b0001; #10
        A = 4'b1111; B = 4'b0010; #10
        A = 4'b1111; B = 4'b0011; #10
        A = 4'b1111; B = 4'b0100; #10
        A = 4'b1111; B = 4'b0101; #10
        A = 4'b1111; B = 4'b0110; #10
        A = 4'b1111; B = 4'b0111; #10
        A = 4'b1111; B = 4'b1000; #10
        A = 4'b1111; B = 4'b1001; #10
        A = 4'b1111; B = 4'b1010; #10
        A = 4'b1111; B = 4'b1011; #10
        A = 4'b1111; B = 4'b1100; #10
        A = 4'b1111; B = 4'b1101; #10
        A = 4'b1111; B = 4'b1110; #10
        A = 4'b1111; B = 4'b1111;       
    
                  
$monitor($time, ": %b + %b = %b, %b", A, B, S, Op, V);
    end


endmodule

Solution

  • Your testbench currently only checks if V is 1 at time 0 because the check is done only once in the initial block. Move the code out of the initial block into its own always block:

    always @* if (V == 1) $display($time, " overflow");
    

    Every time V changes, the check will be done. I added $time to your message because it is helpful for debugging.


    You can simplify your testbench using for loops:

    integer i, j;
    
    initial begin
        for (i=0; i<16; i=i+1) begin
            for (j=0; j<16; j=j+1) begin
                A = i;
                B = j;
                #10;
            end
        end
    end