File: t_fork_repeat_reset.v

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 (60 lines) | stat: -rw-r--r-- 1,476 bytes parent folder | download
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
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2025 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0

module t;

   logic  clock;

   initial begin
      clock = '0;
      forever begin
         clock = #5ns ~clock;
      end
   end

   task static has_fork_task(input [31:0] address);
      @(posedge clock);
      fork
         begin
            repeat($urandom_range(9)) @(posedge clock);
         end
      join
   endtask

   // Intentionally created a recursive task chain (that should be unreachable anyway):
   // call_task()
   //   --> (unreachable) --> calls local_sub_task()
   //       --> calls call_task()
   //             --> ...
   //   --> (reachable) --> calls has_fork_task() done.

   task static call_task(input [31:0] address);
      if (1) begin
         // Workaround1: Comment this out to pass the compile.
         has_fork_task(address);
      end
      else begin
         // Workaround2: Comment this out to pass the compile
         // Should be unreachable anyway.
         local_sub_task(.address(address));
      end
   endtask

   task static local_sub_task(input [31:0] address);
      logic [63:0] req;
      logic [39:0] resp;
      req = '0;
      call_task(.address(32'h0000_1234));
      resp = '0;
   endtask

   initial begin : main
      #100ns;
      $write("*-* All Finished *-*\n");
      $finish;
   end

endmodule