为什么仲裁器中就绪信号总是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()
我正在尝试关注 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()