From d5c877247834fc25689ca6cf7530cd8d1b870d3a Mon Sep 17 00:00:00 2001 From: Wojciech Kosior Date: Sat, 5 Sep 2020 17:20:38 +0200 Subject: add swap instruction together with bench --- Makefile | 1 + design/stack_machine.v | 7 +++++++ tclasm.tcl | 5 +++++ tests/stack_machine_swap/instructions.s.tcl | 17 +++++++++++++++++ tests/stack_machine_swap/test.v | 1 + tests/stack_machine_swap/words_to_verify.mem | 3 +++ 6 files changed, 34 insertions(+) create mode 100755 tests/stack_machine_swap/instructions.s.tcl create mode 120000 tests/stack_machine_swap/test.v create mode 100644 tests/stack_machine_swap/words_to_verify.mem diff --git a/Makefile b/Makefile index c0c2a17..dfeb4f9 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ STACK_MACHINE_TESTS := \ load_store \ multiinstructions_load_store \ tee \ + swap \ add \ sub diff --git a/design/stack_machine.v b/design/stack_machine.v index 868a103..0ccc1c6 100644 --- a/design/stack_machine.v +++ b/design/stack_machine.v @@ -182,6 +182,10 @@ module stack_machine_new assign instr_nop = !set_im && !use_im && stack_same_size && instruction[11:0] == 12'd1; + wire instr_swap; + assign instr_swap = !set_im && !use_im && stack_same_size && + instruction[11:0] == 12'd2; + wire instr_set_sp; assign instr_set_sp = use_im && stack_same_size && instruction[11:7] == 5'd0; @@ -439,6 +443,9 @@ module stack_machine_new if (instr_nop) r1 <= r1; + if (instr_swap) + {r0, r1} <= {r1, r0}; + if (instr_set_sp) `SET_SP(im_effective); diff --git a/tclasm.tcl b/tclasm.tcl index c86a3e7..ed4ed8d 100644 --- a/tclasm.tcl +++ b/tclasm.tcl @@ -154,3 +154,8 @@ proc set_sp {address} { proc halt {} { puts 0000000000000000 } + + +proc swap {} { + puts 0000000000000010 +} diff --git a/tests/stack_machine_swap/instructions.s.tcl b/tests/stack_machine_swap/instructions.s.tcl new file mode 100755 index 0000000..a44ecf9 --- /dev/null +++ b/tests/stack_machine_swap/instructions.s.tcl @@ -0,0 +1,17 @@ +#!/usr/bin/env tclsh + +source tclasm.tcl + +set_sp 0 + +const h0000DEAD +const h0000BEEF + +swap + +## Because values were swapped, h0000DEAD should get written, first, at lower +## address (h100) and h0000BEEF should be written next (at h200) +store h000100 +store h000200 + +halt diff --git a/tests/stack_machine_swap/test.v b/tests/stack_machine_swap/test.v new file mode 120000 index 0000000..f5b6a59 --- /dev/null +++ b/tests/stack_machine_swap/test.v @@ -0,0 +1 @@ +../stack_machine_store/test.v \ No newline at end of file diff --git a/tests/stack_machine_swap/words_to_verify.mem b/tests/stack_machine_swap/words_to_verify.mem new file mode 100644 index 0000000..8557c9a --- /dev/null +++ b/tests/stack_machine_swap/words_to_verify.mem @@ -0,0 +1,3 @@ +// address value + 00100 DEAD + 00200 BEEF -- cgit v1.2.3