@@ -648,11 +648,12 @@ module picorv32 #(
648648 reg instr_lb, instr_lh, instr_lw, instr_lbu, instr_lhu, instr_sb, instr_sh, instr_sw;
649649 reg instr_addi, instr_slti, instr_sltiu, instr_xori, instr_ori, instr_andi, instr_slli, instr_srli, instr_srai;
650650 reg instr_add, instr_sub, instr_sll, instr_slt, instr_sltu, instr_xor, instr_srl, instr_sra, instr_or, instr_and;
651- reg instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh, instr_ecall_ebreak;
651+ reg instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh, instr_ecall_ebreak, instr_fence ;
652652 reg instr_getq, instr_setq, instr_retirq, instr_maskirq, instr_waitirq, instr_timer;
653653 wire instr_trap;
654654
655- reg [regindex_bits- 1 :0 ] decoded_rd, decoded_rs1, decoded_rs2;
655+ reg [regindex_bits- 1 :0 ] decoded_rd, decoded_rs1;
656+ reg [4 :0 ] decoded_rs2;
656657 reg [31 :0 ] decoded_imm, decoded_imm_j;
657658 reg decoder_trigger;
658659 reg decoder_trigger_q;
@@ -680,7 +681,7 @@ module picorv32 #(
680681 instr_lb, instr_lh, instr_lw, instr_lbu, instr_lhu, instr_sb, instr_sh, instr_sw,
681682 instr_addi, instr_slti, instr_sltiu, instr_xori, instr_ori, instr_andi, instr_slli, instr_srli, instr_srai,
682683 instr_add, instr_sub, instr_sll, instr_slt, instr_sltu, instr_xor, instr_srl, instr_sra, instr_or, instr_and,
683- instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh,
684+ instr_rdcycle, instr_rdcycleh, instr_rdinstr, instr_rdinstrh, instr_fence,
684685 instr_getq, instr_setq, instr_retirq, instr_maskirq, instr_waitirq, instr_timer};
685686
686687 wire is_rdcycle_rdcycleh_rdinstr_rdinstrh;
@@ -746,6 +747,7 @@ module picorv32 #(
746747 if (instr_rdcycleh) new_ascii_instr = "rdcycleh" ;
747748 if (instr_rdinstr) new_ascii_instr = "rdinstr" ;
748749 if (instr_rdinstrh) new_ascii_instr = "rdinstrh" ;
750+ if (instr_fence) new_ascii_instr = "fence" ;
749751
750752 if (instr_getq) new_ascii_instr = "getq" ;
751753 if (instr_setq) new_ascii_instr = "setq" ;
@@ -1083,6 +1085,7 @@ module picorv32 #(
10831085
10841086 instr_ecall_ebreak <= ((mem_rdata_q[6 :0 ] == 7'b1110011 && ! mem_rdata_q[31 :21 ] && ! mem_rdata_q[19 :7 ]) ||
10851087 (COMPRESSED_ISA && mem_rdata_q[15 :0 ] == 16'h9002 ));
1088+ instr_fence <= (mem_rdata_q[6 :0 ] == 7'b0001111 && ! mem_rdata_q[14 :12 ]);
10861089
10871090 instr_getq <= mem_rdata_q[6 :0 ] == 7'b0001011 && mem_rdata_q[31 :25 ] == 7'b0000000 && ENABLE_IRQ && ENABLE_IRQ_QREGS;
10881091 instr_setq <= mem_rdata_q[6 :0 ] == 7'b0001011 && mem_rdata_q[31 :25 ] == 7'b0000001 && ENABLE_IRQ && ENABLE_IRQ_QREGS;
@@ -1158,6 +1161,8 @@ module picorv32 #(
11581161 instr_sra <= 0 ;
11591162 instr_or <= 0 ;
11601163 instr_and <= 0 ;
1164+
1165+ instr_fence <= 0 ;
11611166 end
11621167 end
11631168
0 commit comments