From f37a50d6cfe86e6f5ebe368c0868878fd72aa884 Mon Sep 17 00:00:00 2001 From: Wojciech Kosior Date: Sat, 5 Sep 2020 18:32:44 +0200 Subject: add jump instruction together with bench --- Makefile | 3 ++- design/stack_machine.v | 7 +++++++ tclasm.tcl | 9 +++++++++ tests/stack_machine_jump/instructions.s.tcl | 22 ++++++++++++++++++++++ tests/stack_machine_jump/test.v | 1 + tests/stack_machine_jump/words_to_verify.mem | 2 ++ 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100755 tests/stack_machine_jump/instructions.s.tcl create mode 120000 tests/stack_machine_jump/test.v create mode 100644 tests/stack_machine_jump/words_to_verify.mem diff --git a/Makefile b/Makefile index 98631ef..454b499 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,8 @@ STACK_MACHINE_TESTS := \ add \ sub \ div \ - mul + mul \ + jump # Add other tests here if You need TESTS := \ diff --git a/design/stack_machine.v b/design/stack_machine.v index a6b2765..150f6c7 100644 --- a/design/stack_machine.v +++ b/design/stack_machine.v @@ -190,6 +190,10 @@ module stack_machine_new assign instr_set_sp = use_im && stack_same_size && instruction[11:7] == 5'd0; + wire instr_jump; + assign instr_jump = use_im && stack_same_size && + instruction[11:7] == 5'd1; + /* Instructions, that grow stack */ wire instr_tee; assign instr_tee = !set_im && !use_im && stack_grows && @@ -493,6 +497,9 @@ module stack_machine_new if (instr_set_sp) `SET_SP(im_effective); + if (instr_jump) + `SET_PC(im_effective); + /* Instructions, that grow stack */ if (instr_tee) r1 <= r1; diff --git a/tclasm.tcl b/tclasm.tcl index c5b1cb3..1f716ee 100644 --- a/tclasm.tcl +++ b/tclasm.tcl @@ -150,6 +150,15 @@ proc set_sp {address} { } +proc _jump {address_part} { + puts 010000001[__to_binary $address_part 7] +} + +proc jump {address} { + _with_im _jump $address +} + + # Instructions, that grow stack proc tee {} { diff --git a/tests/stack_machine_jump/instructions.s.tcl b/tests/stack_machine_jump/instructions.s.tcl new file mode 100755 index 0000000..fe3b297 --- /dev/null +++ b/tests/stack_machine_jump/instructions.s.tcl @@ -0,0 +1,22 @@ +#!/usr/bin/env tclsh + +source tclasm.tcl + +## Let there be 2 pieces of code - each one storing a different value in memory +## and halting afterwards. Jump instruction should cause the second piece of +## code to execute instead of the first. We'll verify that by checking, which +## value got written. + +## Ufortunately, our assembly currently doesn't compute label addresses for us. + +# Those 4 instructions should get encoded into 5 16-bit words, so they +# will take 10 bytes total. Hence jump to address 10 is needed to skip them. +jump 10 +const h12 +store h87C0 +halt + +# address 10 here +const h34 +store h87C0 +halt diff --git a/tests/stack_machine_jump/test.v b/tests/stack_machine_jump/test.v new file mode 120000 index 0000000..f5b6a59 --- /dev/null +++ b/tests/stack_machine_jump/test.v @@ -0,0 +1 @@ +../stack_machine_store/test.v \ No newline at end of file diff --git a/tests/stack_machine_jump/words_to_verify.mem b/tests/stack_machine_jump/words_to_verify.mem new file mode 100644 index 0000000..1b9f11d --- /dev/null +++ b/tests/stack_machine_jump/words_to_verify.mem @@ -0,0 +1,2 @@ +// address value + 87C0 34 -- cgit v1.2.3