From a988adfec8e01a23d486a595705a633673160f2f Mon Sep 17 00:00:00 2001 From: Luke Wren Date: Sat, 4 Dec 2021 11:16:24 +0000 Subject: [PATCH] Add RISC-V opcodes and memory operation codes for atomics --- hdl/hazard3_core.v | 6 +++--- hdl/hazard3_ops.vh | 30 +++++++++++++++++++++--------- hdl/hazard3_width_const.vh | 2 +- hdl/rv_opcodes.vh | 13 +++++++++++++ 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/hdl/hazard3_core.v b/hdl/hazard3_core.v index d7c169d..ccb8dc0 100644 --- a/hdl/hazard3_core.v +++ b/hdl/hazard3_core.v @@ -561,7 +561,7 @@ hazard3_csr #( .trap_enter_soon (m_trap_enter_soon), .trap_enter_vld (m_trap_enter_vld), .trap_enter_rdy (m_trap_enter_rdy), - .loadstore_dphase_pending (!xm_memop[3]), + .loadstore_dphase_pending (xm_memop != MEMOP_NONE), .mepc_in (m_exception_return_addr), .wfi_stall_clear (m_wfi_stall_clear), @@ -603,7 +603,7 @@ always @ (posedge clk or negedge rst_n) begin // this cycle, and on the next cycle the trap entry will be asserted, // suppressing any load/store that may currently be in stage X. `ifdef FORMAL - assert(!xm_memop[3]); // Not NONE + assert(xm_memop != MEMOP_NONE); `endif xm_except <= xm_memop <= MEMOP_LBU ? EXCEPT_LOAD_FAULT : EXCEPT_STORE_FAULT; xm_wfi <= 1'b0; @@ -644,7 +644,7 @@ assign f_jump_req = x_jump_req || m_trap_enter_vld; assign f_jump_target = m_trap_enter_vld ? m_trap_addr : x_jump_target; assign x_jump_not_except = !m_trap_enter_vld; -wire m_bus_stall = !xm_memop[3] && !bus_dph_ready_d; +wire m_bus_stall = xm_memop != MEMOP_NONE && !bus_dph_ready_d; assign m_stall = m_bus_stall || (m_trap_enter_vld && !m_trap_enter_rdy && !m_trap_is_irq) || (xm_wfi && !m_wfi_stall_clear); diff --git a/hdl/hazard3_ops.vh b/hdl/hazard3_ops.vh index e58b263..19cade0 100644 --- a/hdl/hazard3_ops.vh +++ b/hdl/hazard3_ops.vh @@ -52,15 +52,27 @@ localparam ALUSRCA_PC = 1'h1; localparam ALUSRCB_RS2 = 1'h0; localparam ALUSRCB_IMM = 1'h1; -localparam MEMOP_LW = 4'h0; -localparam MEMOP_LH = 4'h1; -localparam MEMOP_LB = 4'h2; -localparam MEMOP_LHU = 4'h3; -localparam MEMOP_LBU = 4'h4; -localparam MEMOP_SW = 4'h5; -localparam MEMOP_SH = 4'h6; -localparam MEMOP_SB = 4'h7; -localparam MEMOP_NONE = 4'h8; +localparam MEMOP_LW = 5'h00; +localparam MEMOP_LH = 5'h01; +localparam MEMOP_LB = 5'h02; +localparam MEMOP_LHU = 5'h03; +localparam MEMOP_LBU = 5'h04; +localparam MEMOP_SW = 5'h05; +localparam MEMOP_SH = 5'h06; +localparam MEMOP_SB = 5'h07; + +localparam MEMOP_LR_W = 5'h08; +localparam MEMOP_SC_W = 5'h09; +localparam MEMOP_AMOSWAP_W = 5'h0a; +localparam MEMOP_AMOADD_W = 5'h0b; +localparam MEMOP_AMOXOR_W = 5'h0c; +localparam MEMOP_AMOAND_W = 5'h0d; +localparam MEMOP_AMOOR_W = 5'h0e; +localparam MEMOP_AMOMIN_W = 5'h0f; +localparam MEMOP_AMOMAX_W = 5'h10; +localparam MEMOP_AMOMINU_W = 5'h11; +localparam MEMOP_AMOMAXU_W = 5'h12; +localparam MEMOP_NONE = 5'h1f; localparam BCOND_NEVER = 2'h0; localparam BCOND_ALWAYS = 2'h1; diff --git a/hdl/hazard3_width_const.vh b/hdl/hazard3_width_const.vh index ae57032..1926cb8 100644 --- a/hdl/hazard3_width_const.vh +++ b/hdl/hazard3_width_const.vh @@ -7,7 +7,7 @@ parameter W_REGADDR = 5, parameter W_ALUOP = 6, parameter W_ALUSRC = 1, -parameter W_MEMOP = 4, +parameter W_MEMOP = 5, parameter W_BCOND = 2, parameter W_SHAMT = 5, diff --git a/hdl/rv_opcodes.vh b/hdl/rv_opcodes.vh index 0d7a681..c8fa9c0 100644 --- a/hdl/rv_opcodes.vh +++ b/hdl/rv_opcodes.vh @@ -67,6 +67,19 @@ localparam RV_DIVU = 32'b0000001??????????101?????0110011; localparam RV_REM = 32'b0000001??????????110?????0110011; localparam RV_REMU = 32'b0000001??????????111?????0110011; +// A extension +localparam RV_LR_W = 32'b00010??00000?????010?????0101111; +localparam RV_SC_W = 32'b00011????????????010?????0101111; +localparam RV_AMOSWAP_W = 32'b00001????????????010?????0101111; +localparam RV_AMOADD_W = 32'b00000????????????010?????0101111; +localparam RV_AMOXOR_W = 32'b00100????????????010?????0101111; +localparam RV_AMOAND_W = 32'b01100????????????010?????0101111; +localparam RV_AMOOR_W = 32'b01000????????????010?????0101111; +localparam RV_AMOMIN_W = 32'b10000????????????010?????0101111; +localparam RV_AMOMAX_W = 32'b10100????????????010?????0101111; +localparam RV_AMOMINU_W = 32'b11000????????????010?????0101111; +localparam RV_AMOMAXU_W = 32'b11100????????????010?????0101111; + // Zba (address generation) localparam RV_SH1ADD = 32'b0010000??????????010?????0110011; localparam RV_SH2ADD = 32'b0010000??????????100?????0110011;