@@ -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