Add RISC-V opcodes and memory operation codes for atomics

This commit is contained in:
Luke Wren 2021-12-04 11:16:24 +00:00
parent 52ba930638
commit a988adfec8
4 changed files with 38 additions and 13 deletions

View File

@ -561,7 +561,7 @@ hazard3_csr #(
.trap_enter_soon (m_trap_enter_soon), .trap_enter_soon (m_trap_enter_soon),
.trap_enter_vld (m_trap_enter_vld), .trap_enter_vld (m_trap_enter_vld),
.trap_enter_rdy (m_trap_enter_rdy), .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), .mepc_in (m_exception_return_addr),
.wfi_stall_clear (m_wfi_stall_clear), .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, // this cycle, and on the next cycle the trap entry will be asserted,
// suppressing any load/store that may currently be in stage X. // suppressing any load/store that may currently be in stage X.
`ifdef FORMAL `ifdef FORMAL
assert(!xm_memop[3]); // Not NONE assert(xm_memop != MEMOP_NONE);
`endif `endif
xm_except <= xm_memop <= MEMOP_LBU ? EXCEPT_LOAD_FAULT : EXCEPT_STORE_FAULT; xm_except <= xm_memop <= MEMOP_LBU ? EXCEPT_LOAD_FAULT : EXCEPT_STORE_FAULT;
xm_wfi <= 1'b0; 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 f_jump_target = m_trap_enter_vld ? m_trap_addr : x_jump_target;
assign x_jump_not_except = !m_trap_enter_vld; 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 || assign m_stall = m_bus_stall ||
(m_trap_enter_vld && !m_trap_enter_rdy && !m_trap_is_irq) || (m_trap_enter_vld && !m_trap_enter_rdy && !m_trap_is_irq) ||
(xm_wfi && !m_wfi_stall_clear); (xm_wfi && !m_wfi_stall_clear);

View File

@ -52,15 +52,27 @@ localparam ALUSRCA_PC = 1'h1;
localparam ALUSRCB_RS2 = 1'h0; localparam ALUSRCB_RS2 = 1'h0;
localparam ALUSRCB_IMM = 1'h1; localparam ALUSRCB_IMM = 1'h1;
localparam MEMOP_LW = 4'h0; localparam MEMOP_LW = 5'h00;
localparam MEMOP_LH = 4'h1; localparam MEMOP_LH = 5'h01;
localparam MEMOP_LB = 4'h2; localparam MEMOP_LB = 5'h02;
localparam MEMOP_LHU = 4'h3; localparam MEMOP_LHU = 5'h03;
localparam MEMOP_LBU = 4'h4; localparam MEMOP_LBU = 5'h04;
localparam MEMOP_SW = 4'h5; localparam MEMOP_SW = 5'h05;
localparam MEMOP_SH = 4'h6; localparam MEMOP_SH = 5'h06;
localparam MEMOP_SB = 4'h7; localparam MEMOP_SB = 5'h07;
localparam MEMOP_NONE = 4'h8;
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_NEVER = 2'h0;
localparam BCOND_ALWAYS = 2'h1; localparam BCOND_ALWAYS = 2'h1;

View File

@ -7,7 +7,7 @@ parameter W_REGADDR = 5,
parameter W_ALUOP = 6, parameter W_ALUOP = 6,
parameter W_ALUSRC = 1, parameter W_ALUSRC = 1,
parameter W_MEMOP = 4, parameter W_MEMOP = 5,
parameter W_BCOND = 2, parameter W_BCOND = 2,
parameter W_SHAMT = 5, parameter W_SHAMT = 5,

View File

@ -67,6 +67,19 @@ localparam RV_DIVU = 32'b0000001??????????101?????0110011;
localparam RV_REM = 32'b0000001??????????110?????0110011; localparam RV_REM = 32'b0000001??????????110?????0110011;
localparam RV_REMU = 32'b0000001??????????111?????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) // Zba (address generation)
localparam RV_SH1ADD = 32'b0010000??????????010?????0110011; localparam RV_SH1ADD = 32'b0010000??????????010?????0110011;
localparam RV_SH2ADD = 32'b0010000??????????100?????0110011; localparam RV_SH2ADD = 32'b0010000??????????100?????0110011;