[otbn] Add base naming to all base immediate types
Base & bignum ISAs don't share immediate encodings so different types
are associated RTL are needed for base & bignum immediate handling.
Signed-off-by: Greg Chadwick <gac@lowrisc.org>
diff --git a/hw/ip/otbn/rtl/otbn_decoder.sv b/hw/ip/otbn/rtl/otbn_decoder.sv
index ed7969e..a63bb66 100644
--- a/hw/ip/otbn/rtl/otbn_decoder.sv
+++ b/hw/ip/otbn/rtl/otbn_decoder.sv
@@ -53,14 +53,14 @@
//////////////////////////////////////
// Register and immediate selection //
//////////////////////////////////////
- imm_a_sel_e imm_a_mux_sel; // immediate selection for operand a
- imm_b_sel_e imm_b_mux_sel; // immediate selection for operand b
+ imm_a_sel_base_e imm_a_mux_sel_base; // immediate selection for operand a in base ISA
+ imm_b_sel_base_e imm_b_mux_sel_base; // immediate selection for operand b in base ISA
- logic [31:0] imm_i_type;
- logic [31:0] imm_s_type;
- logic [31:0] imm_b_type;
- logic [31:0] imm_u_type;
- logic [31:0] imm_j_type;
+ logic [31:0] imm_i_type_base;
+ logic [31:0] imm_s_type_base;
+ logic [31:0] imm_b_type_base;
+ logic [31:0] imm_u_type_base;
+ logic [31:0] imm_j_type_base;
alu_op_base_e alu_operator_base; // ALU operation selection for base ISA
op_a_sel_e alu_op_a_mux_sel; // operand a selection: reg value, PC, immediate or zero
@@ -72,11 +72,11 @@
logic rf_ren_b;
// immediate extraction and sign extension
- assign imm_i_type = { {20{insn[31]}}, insn[31:20] };
- assign imm_s_type = { {20{insn[31]}}, insn[31:25], insn[11:7] };
- assign imm_b_type = { {19{insn[31]}}, insn[31], insn[7], insn[30:25], insn[11:8], 1'b0 };
- assign imm_u_type = { insn[31:12], 12'b0 };
- assign imm_j_type = { {12{insn[31]}}, insn[19:12], insn[20], insn[30:21], 1'b0 };
+ assign imm_i_type_base = { {20{insn[31]}}, insn[31:20] };
+ assign imm_s_type_base = { {20{insn[31]}}, insn[31:25], insn[11:7] };
+ assign imm_b_type_base = { {19{insn[31]}}, insn[31], insn[7], insn[30:25], insn[11:8], 1'b0 };
+ assign imm_u_type_base = { insn[31:12], 12'b0 };
+ assign imm_j_type_base = { {12{insn[31]}}, insn[19:12], insn[20], insn[30:21], 1'b0 };
// source registers
assign insn_rs1 = insn[19:15];
@@ -95,15 +95,15 @@
logic jump_insn;
// Reduced main ALU immediate MUX for Operand B
- logic [31:0] imm_b;
+ logic [31:0] imm_b_base;
always_comb begin : immediate_b_mux
- unique case (imm_b_mux_sel)
- ImmBI: imm_b = imm_i_type;
- ImmBS: imm_b = imm_s_type;
- ImmBU: imm_b = imm_u_type;
- ImmBB: imm_b = imm_b_type;
- ImmBJ: imm_b = imm_j_type;
- default: imm_b = imm_i_type;
+ unique case (imm_b_mux_sel_base)
+ ImmBaseBI: imm_b_base = imm_i_type_base;
+ ImmBaseBS: imm_b_base = imm_s_type_base;
+ ImmBaseBU: imm_b_base = imm_u_type_base;
+ ImmBaseBB: imm_b_base = imm_b_type_base;
+ ImmBaseBJ: imm_b_base = imm_j_type_base;
+ default: imm_b_base = imm_i_type_base;
endcase
end
@@ -114,7 +114,7 @@
a: insn_rs1,
b: insn_rs2,
d: insn_rd,
- i: imm_b,
+ i: imm_b_base,
alu_op: alu_operator_base,
comparison_op: comparison_operator_base
};
@@ -330,8 +330,8 @@
alu_op_a_mux_sel = OpASelRegister;
alu_op_b_mux_sel = OpBSelImmediate;
- imm_a_mux_sel = ImmAZero;
- imm_b_mux_sel = ImmBI;
+ imm_a_mux_sel_base = ImmBaseAZero;
+ imm_b_mux_sel_base = ImmBaseBI;
opcode_alu = insn_opcode_e'(insn_alu[6:0]);
@@ -341,24 +341,24 @@
/////////
InsnOpcodeBaseLui: begin // Load Upper Immediate
- alu_op_a_mux_sel = OpASelZero;
- alu_op_b_mux_sel = OpBSelImmediate;
- imm_a_mux_sel = ImmAZero;
- imm_b_mux_sel = ImmBU;
- alu_operator_base = AluOpBaseAdd;
+ alu_op_a_mux_sel = OpASelZero;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ imm_a_mux_sel_base = ImmBaseAZero;
+ imm_b_mux_sel_base = ImmBaseBU;
+ alu_operator_base = AluOpBaseAdd;
end
InsnOpcodeBaseAuipc: begin // Add Upper Immediate to PC
- alu_op_a_mux_sel = OpASelCurrPc;
- alu_op_b_mux_sel = OpBSelImmediate;
- imm_b_mux_sel = ImmBU;
- alu_operator_base = AluOpBaseAdd;
+ alu_op_a_mux_sel = OpASelCurrPc;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ imm_b_mux_sel_base = ImmBaseBU;
+ alu_operator_base = AluOpBaseAdd;
end
InsnOpcodeBaseOpImm: begin // Register-Immediate ALU Operations
- alu_op_a_mux_sel = OpASelRegister;
- alu_op_b_mux_sel = OpBSelImmediate;
- imm_b_mux_sel = ImmBI;
+ alu_op_a_mux_sel = OpASelRegister;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ imm_b_mux_sel_base = ImmBaseBI;
unique case (insn_alu[14:12])
3'b000: alu_operator_base = AluOpBaseAdd; // Add Immediate
@@ -407,17 +407,17 @@
//////////////////
InsnOpcodeBaseLoad: begin
- alu_op_a_mux_sel = OpASelRegister;
- alu_op_b_mux_sel = OpBSelImmediate;
- alu_operator_base = AluOpBaseAdd;
- imm_b_mux_sel = ImmBI;
+ alu_op_a_mux_sel = OpASelRegister;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ alu_operator_base = AluOpBaseAdd;
+ imm_b_mux_sel_base = ImmBaseBI;
end
InsnOpcodeBaseStore: begin
- alu_op_a_mux_sel = OpASelRegister;
- alu_op_b_mux_sel = OpBSelImmediate;
- alu_operator_base = AluOpBaseAdd;
- imm_b_mux_sel = ImmBS;
+ alu_op_a_mux_sel = OpASelRegister;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ alu_operator_base = AluOpBaseAdd;
+ imm_b_mux_sel_base = ImmBaseBS;
end
/////////////////
@@ -428,22 +428,22 @@
alu_op_a_mux_sel = OpASelCurrPc;
alu_op_b_mux_sel = OpBSelImmediate;
alu_operator_base = AluOpBaseAdd;
- imm_b_mux_sel = ImmBB;
+ imm_b_mux_sel_base = ImmBaseBB;
comparison_operator_base = insn_alu[12] ? ComparisonOpBaseNeq : ComparisonOpBaseEq;
end
InsnOpcodeBaseJal: begin
- alu_op_a_mux_sel = OpASelCurrPc;
- alu_op_b_mux_sel = OpBSelImmediate;
- alu_operator_base = AluOpBaseAdd;
- imm_b_mux_sel = ImmBJ;
+ alu_op_a_mux_sel = OpASelCurrPc;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ alu_operator_base = AluOpBaseAdd;
+ imm_b_mux_sel_base = ImmBaseBJ;
end
InsnOpcodeBaseJalr: begin
- alu_op_a_mux_sel = OpASelRegister;
- alu_op_b_mux_sel = OpBSelImmediate;
- alu_operator_base = AluOpBaseAdd;
- imm_b_mux_sel = ImmBI;
+ alu_op_a_mux_sel = OpASelRegister;
+ alu_op_b_mux_sel = OpBSelImmediate;
+ alu_operator_base = AluOpBaseAdd;
+ imm_b_mux_sel_base = ImmBaseBI;
end
/////////////
diff --git a/hw/ip/otbn/rtl/otbn_pkg.sv b/hw/ip/otbn/rtl/otbn_pkg.sv
index 57a6add..98e2cae 100644
--- a/hw/ip/otbn/rtl/otbn_pkg.sv
+++ b/hw/ip/otbn/rtl/otbn_pkg.sv
@@ -96,19 +96,19 @@
} op_b_sel_e;
- // Immediate a selection
+ // Immediate a selection for base ISA
typedef enum logic {
- ImmAZero
- } imm_a_sel_e;
+ ImmBaseAZero
+ } imm_a_sel_base_e;
- // Immediate b selection
+ // Immediate b selection for base ISA
typedef enum logic [2:0] {
- ImmBI,
- ImmBS,
- ImmBB,
- ImmBU,
- ImmBJ
- } imm_b_sel_e;
+ ImmBaseBI,
+ ImmBaseBS,
+ ImmBaseBB,
+ ImmBaseBU,
+ ImmBaseBJ
+ } imm_b_sel_base_e;
// Regfile write data selection
typedef enum logic [1:0] {