blob: b8ed12eb095835e6ee41190010736e61510534be [file] [log] [blame]
/////////////////////////
// Author: Peichen Guo //
// RIOS Lab work //
// HeHe Core //
/////////////////////////
`ifndef AC_V
`define AC_V
`include "../params.vh"
/* verilator lint_off UNUSED */
module ac (
input valid_i,
input [PHY_REG_ADDR_WIDTH - 1 : 0] rd_addr_i,
input opcode_i,
input [1:0] size_i,
input [VIRTUAL_ADDR_LEN - 1 : 0] addr_i,
output [EXCEPTION_CODE_WIDTH - 1 : 0] ecause_o,
output exception_valid_o
);
wire misalign_fault;
wire access_fault;
assign misalign_fault =
(size_i == 2'b01 && addr_i[0] != 0) || // hw
(size_i == 2'b10 && addr_i[1:0] != 0) || // w
(size_i == 2'b11 && addr_i[2:0] != 0); // dw
assign access_fault = (rd_addr_i == '0);
assign ecause_o =
access_fault ? (opcode_i ? EXCEPTION_STORE_ACCESS_FAULT : EXCEPTION_LOAD_ACCESS_FAULT) :
misalign_fault ? (opcode_i ? EXCEPTION_STORE_ADDR_MISALIGNED : EXCEPTION_LOAD_ADDR_MISALIGNED) :
0;
assign exception_valid_o = valid_i &
(misalign_fault);
endmodule
/* verilator lint_on UNUSED */
`endif // AC_V