Параметризованный FIFO в Chisel

Я просматривал руководство Chisel 2.2 Tutorial (я знаю, что Chisel3 отсутствует в БЕТА-версия, но мне необходимо использовать Chisel2.2 для некоторого расширения ранее реализованных модулей).

Я искал примеры использования интерфейса DecoupledIO в Chisel и нашел несколько в учебнике, упомянутом выше, а также на Переполнение стека.

Одним из таких примеров является пример параметризованного FIFO в руководстве Chisel Tutorial, реализация которого:

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 (даже не параметризованный), это поможет мне развеять мои сомнения.


person Abhishek Tyagi    schedule 18.11.2017    source источник