`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