Chisel中的参数化FIFO

时间:2017-11-18 09:33:49

标签: riscv chisel

我正在阅读Chisel 2.2 Tutorial手册(我知道Chisel3已经出现在BETA版本中,但我需要使用Chisel2.2来扩展先前实现的模块)。

我一直在寻找在Chisel中使用DecoupledIO接口的示例,并在上面提到的教程和StackOverflow中找到了一些。

一个这样的例子是Chisel Tutorial手册中的参数化FIFO示例,其实现是:

class Fifo[T <: Data] (type: T, n: Int)extends Module {
val io = new Bundle {
val enq_val = Bool(INPUT)
val enq_rdy = Bool(OUTPUT)
val deq_val = Bool(OUTPUT)
val deq_rdy = Bool(INPUT)
val enq_dat = type.asInput
val deq_dat = type.asOutput
}
val enq_ptr= Reg(init = UInt(0, sizeof(n)))
val deq_ptr= Reg(init = UInt(0, sizeof(n)))
val is_full= Reg(init = Bool(false))
val do_enq= io.enq_rdy && io.enq_val
val do_deq= io.deq_rdy && io.deq_val
val is_empty= !is_full && (enq_ptr === deq_ptr)


val deq_ptr_inc = deq_ptr + UInt(1)
val enq_ptr_inc = enq_ptr + UInt(1)


val is_full_next = Mux(do_enq && ~do_deq &&(enq_ptr_inc===deq_ptr),Bool(true),Mux(do_deq && is_full, Bool(false), is_full))


enq_ptr := Mux(do_enq, enq_ptr_inc, enq_ptr)
deq_ptr := Mux(do_deq, deq_ptr_inc, deq_ptr)
is_full := is_full_next
val ram = Mem(n)
when (do_enq) {
ram(enq_ptr) := io.enq_dat
}
io.enq_rdy := !is_full
io.deq_val := !is_empty
ram(deq_ptr) <> io.deq_dat
}

我理解大部分实现但是代码片段:

 val is_full_next = Mux(do_enq && ~do_deq &&(enq_ptr_inc===deq_ptr),Bool(true),Mux(do_deq && is_full, Bool(false), is_full))

如果我正确地解释它,我们试图检查下一个操作是否会导致isFull的条件。如果是这样,我们为什么要查看enq_ptr_inc === deq_ptr的价值。

如果有人可以分享他们对此如何运作的看法,我想听听你的意见。

另外,我不确定这是否是实现参数化FIFO的最简单方法。我正在开发自己的实现,但如果有一种更简单的方法来实现FIFO(甚至不是参数化的),它将帮助我清除我的怀疑。

0 个答案:

没有答案