Skip to content

Commit 9ed1edf

Browse files
committed
Enforce x0 write protection in decoder + add testbench
1 parent ac911ec commit 9ed1edf

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

dv/dv/tb_x0_protection.sv

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
module tb_x0_protection;
2+
3+
logic [4:0] rf_waddr_o;
4+
logic rf_we;
5+
logic illegal_reg_rv32e;
6+
logic rf_we_o;
7+
8+
assign rf_we_o = rf_we & ~illegal_reg_rv32e & (rf_waddr_o != 5'd0);
9+
10+
initial begin
11+
$display("Testing x0 protection...");
12+
13+
rf_we = 1'b1;
14+
illegal_reg_rv32e = 1'b0;
15+
16+
// x0 write
17+
rf_waddr_o = 5'd0;
18+
#1;
19+
if (rf_we_o !== 0)
20+
$error("FAIL: x0 write not blocked");
21+
22+
// ✅ valid write
23+
rf_waddr_o = 5'd5;
24+
#1;
25+
if (rf_we_o !== 1)
26+
$error("FAIL: valid write blocked");
27+
28+
$display("✅ PASS: x0 protection works");
29+
30+
$finish;
31+
end
32+
33+
endmodule

rtl/ibex_decoder.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,7 @@ module ibex_decoder #(
11971197
assign illegal_insn_o = illegal_insn | illegal_reg_rv32e;
11981198

11991199
// do not propagate regfile write enable if non-available registers are accessed in RV32E
1200-
assign rf_we_o = rf_we & ~illegal_reg_rv32e;
1200+
assign rf_we_o = rf_we & ~illegal_reg_rv32e & (rf_waddr_o != 5'd0) ;
12011201

12021202
// Not all bits are used
12031203
assign unused_instr_alu = {instr_alu[19:15],instr_alu[11:7]};

0 commit comments

Comments
 (0)