aboutsummaryrefslogtreecommitdiff
path: root/tests/div
diff options
context:
space:
mode:
authorWojciech Kosior <kwojtus@protonmail.com>2020-09-01 10:54:59 +0200
committerWojciech Kosior <kwojtus@protonmail.com>2020-09-01 11:04:22 +0200
commitee1f6c47e1eff920068f4bceaf604f9535a2e8a9 (patch)
tree580eb001a72601d254bb29cc348a529490f84808 /tests/div
parentcd02ddff8886aa1db29f80d3cc5cf99a349d8258 (diff)
downloadAGH-engineering-thesis-ee1f6c47e1eff920068f4bceaf604f9535a2e8a9.tar.gz
AGH-engineering-thesis-ee1f6c47e1eff920068f4bceaf604f9535a2e8a9.zip
start anew
Diffstat (limited to 'tests/div')
-rw-r--r--tests/div/test.v108
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/div/test.v b/tests/div/test.v
new file mode 100644
index 0000000..f360ebd
--- /dev/null
+++ b/tests/div/test.v
@@ -0,0 +1,108 @@
+`default_nettype none
+
+`include "messages.vh"
+
+`ifndef SIMULATION
+ `error_SIMULATION_not_defined
+; /* Cause syntax error */
+`endif
+
+module div_test();
+ reg clock;
+ reg start;
+ reg [15:0] dividend;
+ reg [15:0] divisor;
+
+ wire [15:0] quotient;
+ wire [15:0] remainder;
+ wire done;
+
+ div
+ #(
+ .WIDTH(16)
+ ) div
+ (
+ .clock(clock),
+ .start(start),
+ .dividend(dividend),
+ .divisor(divisor),
+ .quotient(quotient),
+ .remainder(remainder),
+ .done(done)
+ );
+
+ integer seed;
+ integer progress;
+ reg [15:0] new_divisor;
+ reg [16:0] max_divisor;
+
+ initial begin
+ seed <= 0;
+ progress <= 0;
+ clock <= 0;
+ end
+
+ // initial
+ // $monitor("[%t] clock is %b", $time, clock);
+
+ always #1
+ clock <= ~clock;
+
+ always @ (posedge clock) begin
+ if (progress == 0) begin
+ start <= 1;
+ dividend <= 15;
+ divisor <= 3;
+ progress <= progress + 1;
+ end else begin
+ if (done) begin
+ if (dividend / divisor === quotient && dividend % divisor === remainder) begin
+ `DBG(("%0d/%0d computed as %0d r %0d", dividend, divisor, quotient, remainder));
+ end else begin
+ `MSG(("error: %0d/%0d computed as %0d r %0d",
+ dividend, divisor, quotient, remainder));
+ end
+ start <= 1;
+ case (progress)
+ 1 : begin
+ dividend <= 3;
+ divisor <= 4;
+ end
+ 2 : begin
+ dividend <= 65535;
+ divisor <= 65534;
+ end
+ 3 : begin
+ dividend <= 1024;
+ divisor <= 4;
+ end
+ 4 : begin
+ dividend <= 319;
+ divisor <= 17;
+ end
+ default : begin
+ if (progress == 500)
+ $finish;
+ else if (progress > 400)
+ max_divisor = 2**16;
+ else if (progress > 200)
+ max_divisor = 2**10;
+ else
+ max_divisor = 2**5;
+
+ for (new_divisor = $urandom(seed) % max_divisor;
+ new_divisor == 0;
+ new_divisor = $urandom(seed) % max_divisor)
+ ;
+
+ dividend <= $urandom(seed);
+ divisor <= new_divisor;
+ end
+ endcase // case (progress)
+ progress <= progress + 1;
+ end else begin // if (done)
+ start <= 0;
+ end // else: !if(done)
+ end // else: !if(progress == 0)
+ end // always @ (posedge clock)
+endmodule // div_test