aboutsummaryrefslogtreecommitdiff
path: root/examples/example_toplevel.v
blob: f1501e3630671338ef941d82c3c3fb59cdb77eef (plain)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
`default_nettype none
`timescale 1ns/1ns

`include "messages.vh"

`ifndef SIMULATION
 `error_SIMULATION_not_defined
; /* Cause syntax error */
`endif

`ifndef ROM_WORDS_COUNT
 `error_ROM_WORDS_COUNT_must_be_defined
; /* Cause syntax error */
`endif

`ifndef EMBEDDED_ROM_FILE
 `error_EMBEDDED_ROM_FILE_not_defined
; /* Cause syntax error */
`endif

`ifndef FONT_FILE
 `error_FONT_FILE_not_defined
; /* Cause syntax error */
`endif

`ifndef SPI_ROM_FILE
 `define SPI_ROM_FILE "/dev/null"
 `define SPI_ROM_WORDS_COUNT 0
`else
 `ifndef SPI_ROM_WORDS_COUNT
  `error_SPI_ROM_WORDS_COUNT_not_defined
; /* Cause syntax error */
 `endif
`endif

`ifndef FINISH_ON_IMAGE_WRITES
 `define FINISH_ON_IMAGE_WRITES 0
`else
 `define FINISH_RULE_PROVIDED 1
`endif

`ifndef FINISH_ON_LED1
 `define FINISH_ON_LED1 -1
`else
 `define FINISH_RULE_PROVIDED 1
`endif

`ifndef FINISH_ON_LED2
 `define FINISH_ON_LED2 -1
`else
 `define FINISH_RULE_PROVIDED 1
`endif

`ifndef FINISH_RULE_PROVIDED
 `define FINISH_RULE_PROVIDED 0
`endif

`ifndef MIN_TIME_NS
 `define MIN_TIME_NS 1000
`endif

`ifndef MAX_TIME_NS
 `define MAX_TIME_NS 250_000_000
`endif

module example();
   wire [9:0] image_writes;
   wire       can_finish;

   reg 	      clock_100mhz;
   reg 	      reset;

   wire       led1;
   wire       led2;

   soc_with_peripherals
     #(
       .FONT_FILE(`FONT_FILE),
       .EMBEDDED_ROM_WORDS_COUNT(`ROM_WORDS_COUNT),
       .EMBEDDED_ROM_FILE(`EMBEDDED_ROM_FILE),
       .SPI_ROM_WORDS_COUNT(`SPI_ROM_WORDS_COUNT),
       .SPI_ROM_FILE(`SPI_ROM_FILE)
       ) soc
       (
	.clock_100mhz(clock_100mhz),

	.button1(!reset),
	.button2(1'b1),

	.led1(led1),
	.led2(led2),

	.image_writes(image_writes)
	);

   integer    i;

   initial begin
      reset <= 1;
      clock_100mhz <= 0;

      if (!`FINISH_RULE_PROVIDED) begin
	 `MSG(("No finish rule provided, simulation will terminate after %0d ns,",
	       `MAX_TIME_NS));
      end

      for (i = 0; i < `MAX_TIME_NS; i = i + 5) begin
	 #5;

	 if (clock_100mhz)
	   reset <= 0;

	 clock_100mhz <= ~clock_100mhz;
      end

      `MSG(("%0d ns passed, finishing", `MAX_TIME_NS));
      $finish;
   end

   assign can_finish = i >= `MIN_TIME_NS;

   always @ (led1) begin
      if (i > 0) begin
	 if (!led1)
	   `MSG(("LED1 goes on, stack machine finished operation"));
	 else
	   `MSG(("LED1 goes off, stack machine resets"));
      end
   end

   always @ (led2) begin
      if (i > 35) begin
	 if (!led2)
	   `MSG(("LED2 goes on"));
	 else
	   `MSG(("LED2 goes off"));
      end
   end

   always @ (image_writes) begin
      if (image_writes)
	`MSG(("Display refreshed %0d time(s)", image_writes));
   end

   generate
      if (`FINISH_RULE_PROVIDED) begin
	 always @ (image_writes or led1 or led2 or can_finish) begin
	    if ((image_writes >= `FINISH_ON_IMAGE_WRITES) &&
		(`FINISH_ON_LED1 < 0 || `FINISH_ON_LED1 == !led1) &&
		(`FINISH_ON_LED2 < 0 || `FINISH_ON_LED2 == !led2) &&
		can_finish) begin
	       #1;
	       `MSG(("finishing"));
	       $finish;
	    end
	 end
      end // if (`FINISH_RULE_PROVIDED)
   endgenerate
endmodule // example