aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--design/stack_machine.v10
-rw-r--r--tclasm.tcl5
-rwxr-xr-xtests/stack_machine_sub/instructions.s.tcl24
l---------tests/stack_machine_sub/test.v1
-rw-r--r--tests/stack_machine_sub/words_to_verify.mem6
6 files changed, 47 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 6f2227f..c0c2a17 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,8 @@ STACK_MACHINE_TESTS := \
load_store \
multiinstructions_load_store \
tee \
- add
+ add \
+ sub
# Add other tests here if You need
TESTS := \
diff --git a/design/stack_machine.v b/design/stack_machine.v
index d79a136..868a103 100644
--- a/design/stack_machine.v
+++ b/design/stack_machine.v
@@ -200,6 +200,11 @@ module stack_machine_new
assign instr_add = !set_im && !use_im && stack_shrinks_by_1 &&
instruction[11:0] == 12'd0;
+ wire instr_sub;
+ assign instr_sub = !set_im && !use_im && stack_shrinks_by_1 &&
+ instruction[11:0] == 12'd1;
+
+
reg halt; /* Set once a halt instruction is encountered */
assign finished = halt;
@@ -446,7 +451,10 @@ module stack_machine_new
/* Instructions, that shrink stack */
if (instr_add && first_execution_tick)
- r1 <= r1 + r0;
+ r1 <= r0 + r1;
+
+ if (instr_sub && first_execution_tick)
+ r1 <= r0 - r1;
end // case: STEP_EXECUTING
endcase // case (step)
end // else: !if(RST_I)
diff --git a/tclasm.tcl b/tclasm.tcl
index f5646a2..c86a3e7 100644
--- a/tclasm.tcl
+++ b/tclasm.tcl
@@ -101,6 +101,11 @@ proc add {} {
}
+proc sub {} {
+ puts 0011000000000001
+}
+
+
proc _store {address_part} {
puts 011111100[__to_binary $address_part 7]
}
diff --git a/tests/stack_machine_sub/instructions.s.tcl b/tests/stack_machine_sub/instructions.s.tcl
new file mode 100755
index 0000000..e8485ee
--- /dev/null
+++ b/tests/stack_machine_sub/instructions.s.tcl
@@ -0,0 +1,24 @@
+#!/usr/bin/env tclsh
+
+source tclasm.tcl
+
+### store 2 values to memory, load them back,
+### substract them and store the result
+
+set_sp 0
+
+const 68996288
+store h1EEE0
+const 540904416
+store h1EEE4
+
+const 8
+
+load h1EEE0
+load h1EEE4
+# substracting 540904416 from 68996288 should yield -471908128
+sub
+# will write to h1EEE0 + 8 = h1EEE8
+store+ h1EEE0
+
+halt
diff --git a/tests/stack_machine_sub/test.v b/tests/stack_machine_sub/test.v
new file mode 120000
index 0000000..f5b6a59
--- /dev/null
+++ b/tests/stack_machine_sub/test.v
@@ -0,0 +1 @@
+../stack_machine_store/test.v \ No newline at end of file
diff --git a/tests/stack_machine_sub/words_to_verify.mem b/tests/stack_machine_sub/words_to_verify.mem
new file mode 100644
index 0000000..10c15db
--- /dev/null
+++ b/tests/stack_machine_sub/words_to_verify.mem
@@ -0,0 +1,6 @@
+// address value
+ 1EEE0 41CCCC0 // 68996288 in hex is 41CCCC0
+
+ 1EEE4 203D8BE0 // 540904416 in hex is 203D8BE0
+
+ 1EEE8 E3DF40E0 // -471908128 in hex is E3DF40E0