aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojciech Kosior <kwojtus@protonmail.com>2020-11-23 11:22:19 +0100
committerWojciech Kosior <kwojtus@protonmail.com>2020-11-23 11:22:19 +0100
commita0e9d28f2a21cc42dff7ed2fce3e52cb04bc5170 (patch)
tree276893fc299d83ceea85c2176c45b00134379270
parentb44a3a201ee2b524f31aa93abfe4abd8b756a533 (diff)
downloadAGH-engineering-thesis-a0e9d28f2a21cc42dff7ed2fce3e52cb04bc5170.tar.gz
AGH-engineering-thesis-a0e9d28f2a21cc42dff7ed2fce3e52cb04bc5170.zip
add unsigned division remainder instruction
-rw-r--r--design/stack_machine.v10
-rwxr-xr-xtclasm.tcl4
l---------tests/stack_machine_rem/Makefile1
-rw-r--r--tests/stack_machine_rem/instructions.s.tcl17
l---------tests/stack_machine_rem/test.v1
-rw-r--r--tests/stack_machine_rem/words_to_verify.mem6
6 files changed, 38 insertions, 1 deletions
diff --git a/design/stack_machine.v b/design/stack_machine.v
index f68421e..13e55c1 100644
--- a/design/stack_machine.v
+++ b/design/stack_machine.v
@@ -286,6 +286,10 @@ module stack_machine_new
assign instr_uge = !set_im && !use_im && stack_shrinks_by_1 &&
instruction[11:0] == 12'd15;
+ wire instr_urem;
+ assign instr_urem = !set_im && !use_im && stack_shrinks_by_1 &&
+ instruction[11:0] == 12'd16;
+
wire instr_ret;
assign instr_ret = !set_im && !use_im && stack_shrinks_by_1 &&
instruction[11:0] == 12'b000010000000;
@@ -326,7 +330,7 @@ module stack_machine_new
reg arithmetic_uncompleted;
wire arithmetic_completes;
- assign arithmetic_completes = instr_udiv ? div_done :
+ assign arithmetic_completes = instr_udiv || instr_urem ? div_done :
instr_halt ? 0 :
1;
@@ -611,6 +615,9 @@ module stack_machine_new
if (instr_udiv && arithmetic_uncompleted)
r1 <= div_quotient;
+ if (instr_urem && arithmetic_uncompleted)
+ r1 <= div_remainder;
+
if (instr_mul && arithmetic_uncompleted)
r1 <= r0 * r1;
@@ -687,6 +694,7 @@ module stack_machine_new
instr_ugt ? "ugt" :
instr_ge ? "ge" :
instr_uge ? "uge" :
+ instr_urem ? "urem" :
instr_ret ? "ret" :
instr_cond_jump ? "cond_jump" :
instr_cond_jump_n ? "cond_jump_n" :
diff --git a/tclasm.tcl b/tclasm.tcl
index 90adda5..3fa53d2 100755
--- a/tclasm.tcl
+++ b/tclasm.tcl
@@ -376,6 +376,10 @@ proc uge {} {
puts 0011000000001111
}
+proc rem {} {
+ puts 0011000000010000
+}
+
proc ret {} {
puts 0011000010000000
diff --git a/tests/stack_machine_rem/Makefile b/tests/stack_machine_rem/Makefile
new file mode 120000
index 0000000..2c3c770
--- /dev/null
+++ b/tests/stack_machine_rem/Makefile
@@ -0,0 +1 @@
+../stack_machine_store/Makefile \ No newline at end of file
diff --git a/tests/stack_machine_rem/instructions.s.tcl b/tests/stack_machine_rem/instructions.s.tcl
new file mode 100644
index 0000000..1376d51
--- /dev/null
+++ b/tests/stack_machine_rem/instructions.s.tcl
@@ -0,0 +1,17 @@
+### store 2 values to memory, load them back, divide one by another and store
+### the result (remainder); this is analogous to addition and substraction tests
+
+set_sp 0
+
+const 777681520
+store h1EEE0
+const 3721
+store h1EEE4
+
+load h1EEE0
+load h1EEE4
+# dividing 777681520 by 3721 should yield 208997 r 3683
+rem
+store h1EEE8
+
+halt
diff --git a/tests/stack_machine_rem/test.v b/tests/stack_machine_rem/test.v
new file mode 120000
index 0000000..f5b6a59
--- /dev/null
+++ b/tests/stack_machine_rem/test.v
@@ -0,0 +1 @@
+../stack_machine_store/test.v \ No newline at end of file
diff --git a/tests/stack_machine_rem/words_to_verify.mem b/tests/stack_machine_rem/words_to_verify.mem
new file mode 100644
index 0000000..c11e8b5
--- /dev/null
+++ b/tests/stack_machine_rem/words_to_verify.mem
@@ -0,0 +1,6 @@
+// address value
+ 1EEE0 2E5A7A70 // 777681520 in hex is 2E5A7A70
+
+ 1EEE4 E89 // 3721 in hex is E89
+
+ 1EEE8 E63 // 3683 in hex is E63