aboutsummaryrefslogtreecommitdiff
path: root/examples/example_toplevel.v
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example_toplevel.v')
-rw-r--r--examples/example_toplevel.v142
1 files changed, 142 insertions, 0 deletions
diff --git a/examples/example_toplevel.v b/examples/example_toplevel.v
new file mode 100644
index 0000000..1da1750
--- /dev/null
+++ b/examples/example_toplevel.v
@@ -0,0 +1,142 @@
+`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 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)
+ ) 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
+
+ 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