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