OpenCores
URL https://opencores.org/ocsvn/integer_square_root/integer_square_root/trunk

Subversion Repositories integer_square_root

[/] [integer_square_root/] [tags/] [v2.0/] [src/] [test_ISR.sv] - Diff between revs 6 and 7

Only display areas with differences | Details | Blame | View Log

Rev 6 Rev 7
`timescale 1ns / 1ps
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Company:
// Engineer: Yihua Liu
// Engineer: Yihua Liu
//
//
// Create Date: 2022/10/14 01:01:28
// Create Date: 2022/10/14 01:01:28
// Design Name:
// Design Name:
// Module Name: testbench
// Module Name: testbench
// Project Name: lab_3_b
// Project Name: lab_3_b
// Target Devices: xczu7eg-ffvf1517-2-i
// Target Devices: xczu7eg-ffvf1517-2-i
// Tool Versions:
// Tool Versions:
// Description:
// Description:
//
//
// Dependencies:
// Dependencies:
//
//
// Revision:
// Revision:
// Revision 0.01 - File Created
// Revision 0.01 - File Created
// Revision 0.02 - Update Testbench
// Revision 0.02 - Update Testbench
// Additional Comments:
// Additional Comments:
//
//
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
module testbench();
module testbench();
        logic [63:0] test_input;
        logic [63:0] test_input;
        logic clock, reset, quit;
        logic clock, reset, quit;
        logic [31:0] result;
        logic [31:0] result;
        logic done;
        logic done;
        integer i;
        integer i;
    ISR UUT(
    ISR UUT(
        .reset(reset),
        .reset(reset),
        .value(test_input),
        .value(test_input),
        .clock(clock),
        .clock(clock),
        .result(result),
        .result(result),
        .done(done)
        .done(done)
    );
    );
        task compare_correct_result;
        task compare_correct_result;
                input [63:0] value;
                input [63:0] value;
                input [31:0] result;
                input [31:0] result;
                logic [31:0] guess;
                logic [31:0] guess;
                logic [63:0] multi;
                logic [63:0] multi;
                begin
                begin
                        // First, calculate the correct result
                        // First, calculate the correct result
                        guess = 32'h8000_0000;
                        guess = 32'h8000_0000;
                        for (i = 0; i <= 31; i = i + 1) begin
                        for (i = 0; i <= 31; i = i + 1) begin
                                guess[31 - i] = 1'b1;
                                guess[31 - i] = 1'b1;
                                multi = {32'b0, guess};
                                multi = {32'b0, guess};
                                if ((multi * multi) > value) begin
                                if ((multi * multi) > value) begin
                                        guess[31 - i] = 1'b0;
                                        guess[31 - i] = 1'b0;
                                end
                                end
                        end
                        end
                        // Then, compare the result with the correct one
                        // Then, compare the result with the correct one
                        if (result == guess) begin
                        if (result == guess) begin
                        end
                        end
                        else begin
                        else begin
                                $display("@@@Failed");
                                $display("@@@Failed");
                                $display("Incorrect at time %4.0f",$time);
                                $display("Incorrect at time %4.0f",$time);
                                $display("corrent_result = %h result = %h", guess, result);
                                $display("corrent_result = %h result = %h", guess, result);
                                $finish;
                                $finish;
                        end
                        end
                end
                end
        endtask
        endtask
        always begin
        always begin
                #250;
                #250;
                clock = ~clock;
                clock = ~clock;
        end
        end
        // Some users have had problems just using "@(posedge done)" because their
        // Some users have had problems just using "@(posedge done)" because their
        // "done" signals glitch (even though they are the output of a register). This
        // "done" signals glitch (even though they are the output of a register). This
        // prevents that by making sure "done" is high at the clock edge.
        // prevents that by making sure "done" is high at the clock edge.
        task wait_until_done;
        task wait_until_done;
                forever begin : wait_loop
                forever begin : wait_loop
                        @(posedge done);
                        @(posedge done);
                        @(negedge clock);
                        @(negedge clock);
                        if (done) disable wait_until_done;
                        if (done) disable wait_until_done;
                end
                end
        endtask
        endtask
        initial begin
        initial begin
                $dumpvars;
                $dumpvars;
                $monitor("Time:%4.0f done:%b input:%h result:%h ",$time, done, test_input, result);
                $monitor("Time:%4.0f done:%b input:%h result:%h ",$time, done, test_input, result);
                reset = 0;
                reset = 0;
                clock = 0;
                clock = 0;
                // First some special cases
                // First some special cases
        test_input = 64'h0000_0000_0000_03E9;
        test_input = 64'h0000_0000_0000_03E9;
                @(negedge clock);
                @(negedge clock);
                reset = 1;
                reset = 1;
                @(negedge clock);
                @(negedge clock);
                reset = 0;
                reset = 0;
                wait_until_done();
                wait_until_done();
                $display("Calculate done!");
                $display("Calculate done!");
                compare_correct_result(test_input, result);
                compare_correct_result(test_input, result);
                @(negedge clock);
                @(negedge clock);
                reset = 1;
                reset = 1;
                test_input = 64'hFFFF_FFFF_FFFF_FFFF;
                test_input = 64'hFFFF_FFFF_FFFF_FFFF;
                @(negedge clock);
                @(negedge clock);
                reset = 0;
                reset = 0;
                wait_until_done();
                wait_until_done();
                compare_correct_result(test_input, result);
                compare_correct_result(test_input, result);
                @(negedge clock);
                @(negedge clock);
                reset = 1;
                reset = 1;
                test_input = 64'h0000_0000_0000_0000;
                test_input = 64'h0000_0000_0000_0000;
                @(negedge clock);
                @(negedge clock);
                reset = 0;
                reset = 0;
                wait_until_done();
                wait_until_done();
                compare_correct_result(test_input, result);
                compare_correct_result(test_input, result);
                // Then some random tests
                // Then some random tests
                @(negedge clock);
                @(negedge clock);
                reset = 1;
                reset = 1;
                @(negedge clock);
                @(negedge clock);
                quit = 0;
                quit = 0;
                quit <= #100000 1;
                quit <= #100000 1;
                while (~quit) begin
                while (~quit) begin
                        reset = 1;
                        reset = 1;
                        test_input = {$random, $random};
                        test_input = {$random, $random};
                        @(negedge clock);
                        @(negedge clock);
                        reset = 0;
                        reset = 0;
                        wait_until_done();
                        wait_until_done();
                        compare_correct_result(test_input, result);
                        compare_correct_result(test_input, result);
                end
                end
        @(negedge clock);
        @(negedge clock);
        reset = 1;
        reset = 1;
        @(negedge clock);
        @(negedge clock);
        $display("@@@Passed");
        $display("@@@Passed");
                $finish;
                $finish;
        end
        end
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.