Язык долота, как лучше всего использовать очереди?

Я новичок в долоте, если кто-то может объяснить роль:

1- Очередь 2- Развязанный ввод-вывод 3- Развязанный 3- Действительный ввод-вывод 4- Действительный

Правилен ли этот фрагмент кода долота?


...

val a = Decoupled()
val b = Decoupled()
val c = Decoupled()

...

val Reg_a = Reg(UInt())
val Reg_b = Reg(UInt())

...

when(io.a.valid && io.a.ready && io.b.valid && io.b.ready && io.c.valid &&     io.c.ready)
{

  Reg_a := io.a.bits.data
  Reg_b := io.b.bits.data
}

io.c.bits := Reg_a & Reg_b

...

Module.io.a    <>    Queue(Module_1.io.a_1)
Module.io.b    <>    Queue(Module_1.io.b_1)
Module_1.io.c_1 <>   Queue(Module.io.c)

С Уважением!


person FadrixMH    schedule 13.12.2016    source источник


Ответы (1)


  1. Очередь – это аппаратный модуль, который реализует очередь в порядке очереди с входами и выходами DecoupledIO.
  2. DecoupledIO – это готовый/допустимый тип интерфейса с готовыми, допустимыми членами и битами.
  3. Decoupled – помощник для создания DecoupledIO из другого типа.
  4. ValidIO похож на DecoupledIO, за исключением того, что он имеет только действительные и биты
  5. Valid похож на Decoupled для построения ValidIO.

Я не могу сказать, что пытается сделать код, но вот пример модуля, который имеет 2 входа DecoupledIO и 1 выход DecoupledIO. Он буферизует входные данные с помощью очередей, а затем соединяет выходные данные с суммой входных данных:

import chisel3._
import chisel3.util._

class QueueModule extends Module {
  val io = IO(new Bundle {
    val a = Flipped(Decoupled(UInt(32.W))) // valid and bits are inputs
    val b = Flipped(Decoupled(UInt(32.W)))
    val z = Decoupled(UInt(32.W)) // valid and bits are outputs
  })
  // Note that a, b, and z are all of type DecoupledIO

  // Buffer the inputs with queues
  val qa = Queue(io.a) // io.a is the input to the FIFO
                       // qa is DecoupledIO output from FIFO
  val qb = Queue(io.b)

  // We only dequeue when io.z is ready
  qa.nodeq() // equivalent to qa.ready := false.B
  qb.nodeq()

  // When qa and qb have valid inputs and io.z is ready for an output
  when (qa.valid && qb.valid && io.z.ready) {
    io.z.enq(qa.deq() + qb.deq())
    /* The above is short for
      io.z.valid := true.B
      io.z.bits := qa.bits + qb.bits
      qa.ready := true.B
      qb.ready := true.B
    */
  }
}

Надеюсь это поможет!

person Jack Koenig    schedule 13.12.2016