File: t_timing_long.py

package info (click to toggle)
verilator 5.038-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 162,552 kB
  • sloc: cpp: 139,204; python: 20,931; ansic: 10,222; yacc: 6,000; lex: 1,925; makefile: 1,260; sh: 494; perl: 282; fortran: 22
file content (63 lines) | stat: -rwxr-xr-x 1,923 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2024 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

import vltest_bootstrap

test.scenarios('simulator')
test.top_filename = test.obj_dir + "/t_timing_long.v"

# Look for O(n^2) problems in process handling


def gen(filename):
    with open(filename, 'w', encoding="utf8") as fh:
        fh.write("// Generated by t_timing_long.py\n")

        fh.write("\n")
        fh.write("`ifdef TEST_VERBOSE\n")
        fh.write(" `define MSG(m) $display m\n")
        fh.write("`else\n")
        fh.write(" `define MSG(m)\n")
        fh.write("`endif\n")
        fh.write("\n")

        fh.write("module t;\n")
        fh.write("\n")
        fh.write("  int cnt;\n")
        fh.write("\n")
        fh.write("  initial begin\n")

        n = 100
        for i in range(1, n):
            # If statement around the timing is important to make the code scheduling
            # mostly unpredictable
            fh.write("    if (cnt == " + str(i - 1) + ") begin\n")
            fh.write("      #1; ++cnt; `MSG((\"[%0t] cnt?=" + str(i) + "\", $time));" +
                     " if (cnt != " + str(i) + ") $stop;\n")
            fh.write("    end\n")

        fh.write("\n")
        fh.write('    $write("*-* All Finished *-*\\n");' + "\n")
        fh.write("    $finish;\n")
        fh.write("  end\n")
        fh.write("endmodule\n")


gen(test.top_filename)

if test.have_coroutines:
    test.compile(verilator_flags2=["--exe --build --main --timing"], make_top=1)

    test.execute()

test.compile(verilator_flags2=["--exe --build --main --no-timing -Wno-STMTDLY"], make_top=1)

test.execute()

test.passes()