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] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ayka
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company:
4
// Engineer: Yihua Liu
5
//
6 6 ayka
// Create Date: 2022/10/14 01:01:28
7 2 ayka
// Design Name:
8
// Module Name: testbench
9
// Project Name: lab_3_b
10
// Target Devices: xczu7eg-ffvf1517-2-i
11
// Tool Versions:
12
// Description:
13
//
14
// Dependencies:
15
//
16
// Revision:
17
// Revision 0.01 - File Created
18 6 ayka
// Revision 0.02 - Update Testbench
19 2 ayka
// Additional Comments:
20
//
21
//////////////////////////////////////////////////////////////////////////////////
22
 
23
 
24
module testbench();
25
 
26 6 ayka
        logic [63:0] test_input;
27
        logic clock, reset, quit;
28 2 ayka
 
29
        logic [31:0] result;
30
        logic done;
31
 
32 6 ayka
        integer i;
33 2 ayka
 
34 6 ayka
    ISR UUT(
35 2 ayka
        .reset(reset),
36 6 ayka
        .value(test_input),
37 2 ayka
        .clock(clock),
38
        .result(result),
39
        .done(done)
40
    );
41
 
42 6 ayka
        task compare_correct_result;
43
                input [63:0] value;
44
                input [31:0] result;
45
 
46
                logic [31:0] guess;
47
                logic [63:0] multi;
48
                begin
49
                        // First, calculate the correct result
50
                        guess = 32'h8000_0000;
51
                        for (i = 0; i <= 31; i = i + 1) begin
52
                                guess[31 - i] = 1'b1;
53
                                multi = {32'b0, guess};
54
                                if ((multi * multi) > value) begin
55
                                        guess[31 - i] = 1'b0;
56
                                end
57
                        end
58
                        // Then, compare the result with the correct one
59
                        if (result == guess) begin
60
                        end
61
                        else begin
62
                                $display("@@@Failed");
63
                                $display("Incorrect at time %4.0f",$time);
64
                                $display("corrent_result = %h result = %h", guess, result);
65
                                $finish;
66
                        end
67 2 ayka
                end
68 6 ayka
        endtask
69 2 ayka
 
70 6 ayka
 
71 2 ayka
        always begin
72 6 ayka
                #250;
73
                clock = ~clock;
74 2 ayka
        end
75
 
76 6 ayka
        // Some users have had problems just using "@(posedge done)" because their
77
        // "done" signals glitch (even though they are the output of a register). This
78
        // prevents that by making sure "done" is high at the clock edge.
79 2 ayka
        task wait_until_done;
80
                forever begin : wait_loop
81
                        @(posedge done);
82
                        @(negedge clock);
83 6 ayka
                        if (done) disable wait_until_done;
84 2 ayka
                end
85
        endtask
86
 
87 6 ayka
 
88 2 ayka
        initial begin
89 6 ayka
                $dumpvars;
90
                $monitor("Time:%4.0f done:%b input:%h result:%h ",$time, done, test_input, result);
91
                reset = 0;
92 2 ayka
                clock = 0;
93 6 ayka
 
94
                // First some special cases
95
        test_input = 64'h0000_0000_0000_03E9;
96 2 ayka
                @(negedge clock);
97
                reset = 1;
98
                @(negedge clock);
99
                reset = 0;
100
                wait_until_done();
101 6 ayka
                $display("Calculate done!");
102
                compare_correct_result(test_input, result);
103 2 ayka
                @(negedge clock);
104
                reset = 1;
105 6 ayka
                test_input = 64'hFFFF_FFFF_FFFF_FFFF;
106 2 ayka
                @(negedge clock);
107
                reset = 0;
108
                wait_until_done();
109 6 ayka
                compare_correct_result(test_input, result);
110 2 ayka
                @(negedge clock);
111
                reset = 1;
112 6 ayka
                test_input = 64'h0000_0000_0000_0000;
113 2 ayka
                @(negedge clock);
114
                reset = 0;
115
                wait_until_done();
116 6 ayka
                compare_correct_result(test_input, result);
117
 
118
                // Then some random tests
119 2 ayka
                @(negedge clock);
120
                reset = 1;
121
                @(negedge clock);
122 6 ayka
                quit = 0;
123
                quit <= #100000 1;
124
                while (~quit) begin
125 2 ayka
                        reset = 1;
126 6 ayka
                        test_input = {$random, $random};
127 2 ayka
                        @(negedge clock);
128
                        reset = 0;
129
                        wait_until_done();
130 6 ayka
                        compare_correct_result(test_input, result);
131 2 ayka
                end
132 6 ayka
        @(negedge clock);
133
        reset = 1;
134
        @(negedge clock);
135
        $display("@@@Passed");
136 2 ayka
                $finish;
137
        end
138
 
139
endmodule

powered by: WebSVN 2.1.0

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