Fixed that address misalignment error bit could be set when not performing a load or store instruction. This means that some other instructions would trigger the core to lock, when performing valid instructions.
diff --git a/verilog/rtl/ExperiarCore/RV32ICore.v b/verilog/rtl/ExperiarCore/RV32ICore.v
index 5319df1..b435524 100644
--- a/verilog/rtl/ExperiarCore/RV32ICore.v
+++ b/verilog/rtl/ExperiarCore/RV32ICore.v
@@ -295,12 +295,19 @@
state == STATE_EXECUTE ? aluAPlusB:
32'b0;
wire loadSigned = (funct3 == 3'b100) || (funct3 == 3'b101);
- wire loadStoreByte = funct3[1:0] == 2'b00;
- wire loadStoreHalf = funct3[1:0] == 3'b01;
wire loadStoreWord = funct3 == 3'b010;
- wire[3:0] baseByteMask = state == STATE_FETCH || loadStoreWord ? 4'b1111 :
- loadStoreHalf ? 4'b0011 :
- loadStoreByte ? 4'b0001 : 4'b0000;
+ wire loadStoreHalf = funct3[1:0] == 3'b01;
+ wire loadStoreByte = funct3[1:0] == 2'b00;
+ reg[3:0] baseByteMask;
+ always @(*) begin
+ if (state == STATE_FETCH) baseByteMask <= 4'b1111;
+ else if ((isLoad || isStore) && state == STATE_EXECUTE) begin
+ if (loadStoreWord) baseByteMask <= 4'b1111;
+ else if (loadStoreHalf) baseByteMask <= 4'b0011;
+ else if (loadStoreByte) baseByteMask <= 4'b0001;
+ else baseByteMask <= 4'b0000;
+ end else baseByteMask <= 4'b0000;
+ end
wire[6:0] loadStoreByteMask = {3'b0, baseByteMask} << targetMemoryAddress[1:0];
wire loadStoreByteMaskValid = |(loadStoreByteMask[3:0]);