diff --git a/src/frontend/sras.sv b/src/frontend/sras.sv index e8d92fbf43bcade4a97bd22b3dca2d56df68a856..1bd7ed8e0d233f396eb16ee29dd05d20a4fa17f5 100644 --- a/src/frontend/sras.sv +++ b/src/frontend/sras.sv @@ -54,38 +54,44 @@ module sras #( assign overflow = |ovf_counter_q[ptr_spec_q]; always_comb begin - tos_d = tos_q; ovf_counter_d = ovf_counter_q; if (flush_i) begin - tos_d = '0; ovf_counter_d = '0; end else if (!bad_spec_i) begin if (push_i && !pop_i) begin if (overflow) begin ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] + 1'b1; - end else begin - if (prev_plus_one == '0 || pp_plus_one == '0) begin - ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] + 1'b1; - if (begin_spec_i) begin - ovf_counter_d[ptr_spec_q] = ovf_counter_q[ptr_spec_q] + 1'b1; - end - end else begin - tos_d[ptr_spec_d] = prev_plus_one; - if (begin_spec_i) begin - tos_d[ptr_spec_q] = pp_plus_one; - end + end else if (prev_plus_one == '0 || pp_plus_one == '0) begin + ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] + 1'b1; + if (begin_spec_i) begin + ovf_counter_d[ptr_spec_q] = ovf_counter_q[ptr_spec_q] + 1'b1; end end - end else if (!push_i && pop_i) begin - if (ovf_counter_q[ptr_spec_q] != '0) begin - ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] - 1'b1; - end else begin - tos_d[ptr_spec_d] = prev_minus_one; + end else if (!push_i && pop_i && ovf_counter_q[ptr_spec_q] != '0) begin + ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q] - 1'b1; + end else if (!bad_spec_i && begin_spec_i) begin + ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q]; + end + end + end + + always_comb begin + tos_d = tos_q; + + if (flush_i) begin + tos_d = '0; + end else if (!bad_spec_i) begin + if (push_i && !pop_i && !overflow && prev_plus_one != '0 && pp_plus_one != '0) begin + tos_d[ptr_spec_d] = prev_plus_one; + + if (begin_spec_i) begin + tos_d[ptr_spec_q] = pp_plus_one; end + end else if (!push_i && pop_i && ovf_counter_q[ptr_spec_q] == '0) begin + tos_d[ptr_spec_d] = prev_minus_one; end else if (!bad_spec_i && begin_spec_i) begin tos_d[ptr_spec_d] = tos_q[ptr_spec_q]; - ovf_counter_d[ptr_spec_d] = ovf_counter_q[ptr_spec_q]; end end end @@ -133,15 +139,16 @@ module sras #( stack_q[i]; end + initial stack_q = '0; always_ff @(posedge clk_i or negedge rst_ni) begin + stack_q <= stack_d; + if (~rst_ni) begin - stack_q <= '0; ptr_spec_q <= '0; ptr_backup_q <= '0; tos_q <= '0; ovf_counter_q <= '0; end else begin - stack_q <= stack_d; ptr_spec_q <= ptr_spec_d; ptr_backup_q <= ptr_backup_d; tos_q <= tos_d;