diff options
Diffstat (limited to 'design')
-rw-r--r-- | design/stack_machine.v | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/design/stack_machine.v b/design/stack_machine.v index 04b1285..d79a136 100644 --- a/design/stack_machine.v +++ b/design/stack_machine.v @@ -118,6 +118,9 @@ module stack_machine_new wire stack_shrinks; assign stack_shrinks = instruction[13] == 1'b1 && !set_im; + wire stack_shrinks_by_1; + assign stack_shrinks_by_1 = stack_shrinks && instruction[12] == 1'b1; + wire stack_shrinks_by_2; assign stack_shrinks_by_2 = stack_shrinks && instruction[12] == 1'b0; @@ -193,7 +196,9 @@ module stack_machine_new instruction[11:7] == 5'd0; /* Instructions, that shrink stack */ - /* none now */ + wire instr_add; + assign instr_add = !set_im && !use_im && stack_shrinks_by_1 && + instruction[11:0] == 12'd0; reg halt; /* Set once a halt instruction is encountered */ assign finished = halt; @@ -279,9 +284,6 @@ module stack_machine_new STEP_EXECUTING : begin first_execution_tick <= 0; - if (instr_halt) - halt <= 1; - if (((stack_grows || stack_shrinks || load || store) && first_execution_tick) || (load_store_uncompleted && @@ -425,14 +427,26 @@ module stack_machine_new else im <= 32'bx; - if (instr_const && first_execution_tick) - r1 <= im_effective; + /* Instructions, that do not change stack size */ + if (instr_halt) + halt <= 1; - if (instr_tee) + if (instr_nop) r1 <= r1; if (instr_set_sp) `SET_SP(im_effective); + + /* Instructions, that grow stack */ + if (instr_tee) + r1 <= r1; + + if (instr_const && first_execution_tick) + r1 <= im_effective; + + /* Instructions, that shrink stack */ + if (instr_add && first_execution_tick) + r1 <= r1 + r0; end // case: STEP_EXECUTING endcase // case (step) end // else: !if(RST_I) |