Карри в аппаратных средствах - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь реализовать простой адресный декодер с функцией карри внутри. Код ниже не скомпилируется, кто-нибудь может мне помочь с этим?

class AddrDecoder[T<:UInt] (dType:T, n:Int) extends Module {
  val io = IO (new Bundle {
    //val range = (Vec(Seq.fill(n){(dType,dType)})) // This won't compile, how to fix ?
    val range = (List.fill(n){(dType,dType)})        
    val addr  = Input (dType)
    val en    = Input (Bool())        
    val sel   = Output(Bool())
  })

  def inside (range:(T,T))(addr:T):Bool = {
    addr >= range._1 && addr < range._1 + range._2
  }

  when (io.en) {
    io.sel := io.range map (inside(_)(io.addr))
  }
}

[error] found : List[chisel3.Bool]
[error] (which expands to) List[chisel3.core.Bool]
[error] required: chisel3.core.Data
[error] io.sel := io.range map (inside(_)(io.addr))

1 Ответ

0 голосов
/ 27 октября 2018

@ jkoenig предоставил отличное решение. Размещать это здесь для пользы других

class AddrDecoder[T<:Data with Num[T]] (dType:T, n:Int) extends Module {
  val io = IO (new Bundle {
    val range0  = Input (Vec(n,dType))
    val range1  = Input (Vec(n,dType))        
    val addr    = Input (dType)
    val en      = Input (Bool())        
    val sel     = Output(Vec(n,Bool()))
  })

  // Curried function which accepts a tuple and an input addr
  // Use map to apply it to inputs
  def inside (range:(T,T))(addr:T):Bool = {
    addr >= range._1 && addr < range._1 + range._2
  }

  // MUX output
  for (i <- 0 until n) {
    io.sel(i) := false.B
  }

  when (io.en) {
    io.sel := io.range0 zip io.range1 map (inside(_)(io.addr))
  }    
  // $onehot0 output encoding check
  assert (PopCount(io.sel) <= 1.U, "Invalid addr decoding")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...