File: t_vlprocess_missing.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 (106 lines) | stat: -rwxr-xr-x 2,302 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/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_vlprocess_missing.v"

# Number of tests to generate
NUM_TESTS = 200

# Testbench header template
HEADER = """\
module Testbench;

  logic clk;
  logic reset;

  // Clock driver
  initial begin
    clk = 0;
    forever begin
      #5 clk = ~clk;
    end
  end

  task automatic advance_clock(int n = 1);
    repeat (n) @(posedge clk);
  endtask

"""

# Test task template
TEST_TASK_TEMPLATE = """
  task automatic test_{num}();
    int counter = 0;
    int expected_value = {num};

    // Timeout wait
    fork
      begin
        advance_clock(10000);
        $error("Timeout");
      end
    join_none
    wait (counter == expected_value);
    disable fork;

    while (counter < expected_value) begin
      advance_clock();
      counter++;
    end
  endtask
"""

# Testbench footer template
FOOTER = "  initial begin"

# Call template for invoking each test task
CALL_TEMPLATE = "    test_{num}();\n"

# Footer end
FOOTER_END = """
    $finish;
  end

endmodule
"""


def gen(filename, num_tests):
    """
    Generates a SystemVerilog testbench with the specified number of tests.

    Args:
        filename (str): The output file name for the generated testbench.
        num_tests (int): The number of test tasks to generate.
    """
    with open(filename, 'w', encoding="utf-8") as fh:
        fh.write("// Generated by t_vlprocess_missing.py\n")

        # Write the header
        fh.write(HEADER)

        # Generate the test tasks
        for i in range(1, num_tests + 1):
            fh.write(TEST_TASK_TEMPLATE.format(num=i))

        # Write the initial block with test calls
        fh.write(FOOTER)
        for i in range(1, num_tests + 1):
            fh.write(CALL_TEMPLATE.format(num=i))
        fh.write(FOOTER_END)


gen(test.top_filename, NUM_TESTS)

test.compile(verilator_flags2=["--binary"])

test.passes()