// Copyright 2021 Howard Lau // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package riscv.core import chisel3._ import chisel3.experimental.ChiselEnum import chisel3.util._ import riscv.Parameters object ALUFunctions extends ChiselEnum { val zero, add, sub, sll, slt, xor, or, and, srl, sra, sltu = Value } class ALU extends Module { val io = IO(new Bundle { val func = Input(ALUFunctions()) val op1 = Input(UInt(Parameters.DataWidth)) val op2 = Input(UInt(Parameters.DataWidth)) val result = Output(UInt(Parameters.DataWidth)) }) io.result := 0.U switch(io.func) { is(ALUFunctions.add) { io.result := io.op1 + io.op2 } is(ALUFunctions.sub) { io.result := io.op1 - io.op2 } is(ALUFunctions.sll) { io.result := io.op1 << io.op2(4, 0) } is(ALUFunctions.slt) { io.result := io.op1.asSInt < io.op2.asSInt } is(ALUFunctions.xor) { io.result := io.op1 ^ io.op2 } is(ALUFunctions.or) { io.result := io.op1 | io.op2 } is(ALUFunctions.and) { io.result := io.op1 & io.op2 } is(ALUFunctions.srl) { io.result := io.op1 >> io.op2(4, 0) } is(ALUFunctions.sra) { io.result := (io.op1.asSInt >> io.op2(4, 0)).asUInt } is(ALUFunctions.sltu) { io.result := io.op1 < io.op2 } } }