Skip to content

Commit 368c013

Browse files
committed
[rtl] Only start the push/pop FSM if the instruction is valid
1 parent fa19edb commit 368c013

1 file changed

Lines changed: 15 additions & 10 deletions

File tree

rtl/ibex_compressed_decoder.sv

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,15 @@ module ibex_compressed_decoder #(
2828
);
2929
import ibex_pkg::*;
3030

31-
// valid_i indicates if instr_i is valid and is used for assertions only.
32-
// The following signal is used to avoid possible lint errors.
33-
logic unused_valid;
34-
assign unused_valid = valid_i;
31+
if (!(RV32ZC == RV32ZcaZcbZcmp || RV32ZC == RV32ZcaZcmp)) begin : gen_unused_valid
32+
// valid_i indicates if instr_i is valid and is used for assertions only if Zcmp is disabled.
33+
// id_in_ready_i indicates if instr_o is consumed and is used for assertions only if Zcmp is
34+
// disabled. The following signals are used to avoid possible lint errors.
35+
logic unused_valid;
36+
logic unused_id_in_ready;
37+
assign unused_valid = valid_i;
38+
assign unused_id_in_ready = id_in_ready_i;
39+
end
3540

3641
function automatic logic [6:0] cm_stack_adj_base(input logic [3:0] rlist);
3742
unique case (rlist)
@@ -544,7 +549,7 @@ module ibex_compressed_decoder #(
544549
end else if (cm_rlist_d == 5'd4) begin
545550
// Only `ra` has to be stored, which is done in this cycle. Proceed by
546551
// decrementing SP.
547-
if (id_in_ready_i) begin
552+
if (valid_i && id_in_ready_i) begin
548553
cm_state_d = CmPushDecrSp;
549554
end
550555
end else begin
@@ -556,7 +561,7 @@ module ibex_compressed_decoder #(
556561
// offset from 2 onwards in CmPushStoreReg next cycle.
557562
cm_sp_offset_d = 5'd2;
558563
// Proceed with storing registers.
559-
if (id_in_ready_i) begin
564+
if (valid_i && id_in_ready_i) begin
560565
cm_state_d = CmPushStoreReg;
561566
end
562567
end
@@ -612,7 +617,7 @@ module ibex_compressed_decoder #(
612617
end else if (cm_rlist_d == 5'd4) begin
613618
// Only `ra` has to be loaded, which is done in this cycle. Proceed by
614619
// incrementing SP.
615-
if (id_in_ready_i) begin
620+
if (valid_i && id_in_ready_i) begin
616621
cm_state_d = CmPopIncrSp;
617622
end
618623
end else begin
@@ -621,7 +626,7 @@ module ibex_compressed_decoder #(
621626
cm_rlist_d -= 5'd1;
622627
cm_sp_offset_d -= 5'd1;
623628
// Proceed with loading registers.
624-
if (id_in_ready_i) begin
629+
if (valid_i && id_in_ready_i) begin
625630
cm_state_d = CmPopLoadReg;
626631
end
627632
end
@@ -688,7 +693,7 @@ module ibex_compressed_decoder #(
688693
// No cm.mvsa01 instruction is active yet; start a new one.
689694
// Move a0 to register indicated by r1s'.
690695
instr_o = cm_mvsa01(.a01(1'b0), .rs(instr_i[9:7]));
691-
if (id_in_ready_i) begin
696+
if (valid_i && id_in_ready_i) begin
692697
cm_state_d = CmMvSecondReg;
693698
end
694699
end
@@ -714,7 +719,7 @@ module ibex_compressed_decoder #(
714719
// No cm.mva01s instruction is active yet; start a new one.
715720
// Move register indicated by r1s' into a0.
716721
instr_o = cm_mva01s(.rs(instr_i[9:7]), .a01(1'b0));
717-
if (id_in_ready_i) begin
722+
if (valid_i && id_in_ready_i) begin
718723
cm_state_d = CmMvSecondReg;
719724
end
720725
end

0 commit comments

Comments
 (0)