为什么仲裁器中就绪信号总是0?

Why is ready signal always 0 in arbiter?

我正在尝试关注 chisel3 materials(jupyter) 我想知道为什么就绪信号在仲裁器中总是为 0。

下面是code

test(new Module {
    // Example circuit using a priority arbiter
    val io = IO(new Bundle {
      val in = Flipped(Vec(2, Decoupled(UInt(8.W))))
      val out = Decoupled(UInt(8.W))
    })
    // Arbiter doesn't have a convenience constructor, so it's built like any Module
    val arbiter = Module(new Arbiter(UInt(8.W), 2))  // 2 to 1 Priority Arbiter
    arbiter.io.in <> io.in
    io.out <> arbiter.io.out
  }) { c =>
    c.io.in(0).valid.poke(false.B)
    c.io.in(1).valid.poke(false.B)
    println(s"Start:")
    println(s"\tin(0).ready=${c.io.in(0).ready.peek().litValue}, in(1).ready=${c.io.in(1).ready.peek().litValue}")
    println(s"\tout.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}")
    c.io.in(1).valid.poke(true.B)  // Valid input 1
    c.io.in(1).bits.poke(42.U)
    // What do you think the output will be?
    println(s"valid input 1:")
    println(s"\tin(0).ready=${c.io.in(0).ready.peek().litValue}, in(1).ready=${c.io.in(1).ready.peek().litValue}")
    println(s"\tout.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}")
    c.io.in(0).valid.poke(true.B)  // Valid inputs 0 and 1
    c.io.in(0).bits.poke(43.U)
    // What do you think the output will be? Which inputs will be ready?
    println(s"valid inputs 0 and 1:")
    println(s"\tin(0).ready=${c.io.in(0).ready.peek().litValue}, in(1).ready=${c.io.in(1).ready.peek().litValue}")
    println(s"\tout.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}")
    c.io.in(1).valid.poke(false.B)  // Valid input 0
    // What do you think the output will be?
    println(s"valid input 0:")
    println(s"\tin(0).ready=${c.io.in(0).ready.peek().litValue}, in(1).ready=${c.io.in(1).ready.peek().litValue}")
    println(s"\tout.valid=${c.io.out.valid.peek().litValue}, out.bits=${c.io.out.bits.peek().litValue}")
}

结果是:

Start:
    in(0).ready=0, in(1).ready=0
    out.valid=0, out.bits=0
valid input 1:
    in(0).ready=0, in(1).ready=0
    out.valid=1, out.bits=42
valid inputs 0 and 1:
    in(0).ready=0, in(1).ready=0
    out.valid=1, out.bits=43
valid input 0:
    in(0).ready=0, in(1).ready=0
    out.valid=1, out.bits=43

material 是这样解释就绪信号的: 就绪信号应该只取决于接收器是否能够接收数据

所以我认为当有效信号输入时,c.io.in.ready信号应该是1(或真) 但就绪信号在这里始终为 0,即使 in(0) 和 in(1) 都有效

感谢您的回答,实际上这是我第一次在这里提问,所以如果有任何问题(或者我在这里写问题时必须知道的事情),请告诉我。 谢谢!

您的代码看起来不错,但您只是缺少一些小东西。

仲裁器在其输出就绪为高电平之前不会说它已就绪。因此你需要添加一个

c.io.out.ready.poke(true.B)

这会将就绪传递给输入。

在将 poke 值添加到仲裁器后,您还需要提前时钟。 在每块 poke 之后添加以下内容:

c.clock.step()