All Downloads are FREE. Search and download functionalities are using the official Maven repository.

examples.leros.AluAccuMultiIO.scala Maven / Gradle / Ivy

package examples.leros

import chisel3._
import chisel3.util._
import examples.leros.Types.{add, and, ld, nop, or, shr, sub, xor}

class AluAccuInput(val size: Int) extends Bundle{
  val op = UInt(3.W)
  val din = UInt(size.W)
  val ena = Bool()
}

class AluAccuOutput(val size: Int) extends Bundle {
  val accu = UInt(size.W)
}

/**
  * Base class for Leros ALU including the accumulator register.
  *
  * @param size
  */
abstract class AluAccuMutliIO(sizen: Int) extends Module {
  val input = IO(Input(new AluAccuInput(sizen)))
  val output = IO(Output(new AluAccuOutput(sizen)))
}

class AluAccuMultiChisel(val size: Int) extends AluAccuMutliIO(size) {
  val accuReg = RegInit(0.U(size.W))

  val op = input.op
  val a = accuReg
  val b = input.din
  val res = WireDefault(a)

  switch(op) {
    is(nop) {
      res := a
    }
    is(add) {
      res := a + b
    }
    is(sub) {
      res := a - b
    }
    is(and) {
      res := a & b
    }
    is(or) {
      res := a | b
    }
    is(xor) {
      res := a ^ b
    }
    is (shr) {
      res := a >> 1
    }
    is(ld) {
      res := b
    }
  }

  when (input.ena) {
    accuReg := res
  }

  output.accu := accuReg
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy