blob: c528eae694621b6b79e9b9d4b28a1f3e8d11f6f5 [file] [log] [blame]
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package common
import chisel3._
import chisel3.simulator.scalatest.ChiselSim
import org.scalatest.freespec.AnyFreeSpec
class KelvinArbiterSpec extends AnyFreeSpec with ChiselSim {
"KelvinArbiter" in {
simulate(new KelvinRRArbiter(UInt(32.W), 2)) { dut =>
dut.io.in(0).valid.poke(false)
dut.io.in(0).bits.poke(42.U)
dut.io.in(1).valid.poke(false)
dut.io.in(1).bits.poke(142.U)
dut.io.out.valid.expect(0)
// Input 0 only
dut.io.in(0).valid.poke(true)
dut.io.out.valid.expect(1)
dut.io.out.bits.expect(42)
dut.io.chosen.expect(0)
dut.io.out.ready.poke(false)
dut.io.in(0).ready.expect(0)
dut.io.in(1).ready.expect(0)
dut.io.out.ready.poke(true)
dut.io.in(0).ready.expect(1)
// Input 1 only
dut.io.in(0).valid.poke(false)
dut.io.in(1).valid.poke(true)
dut.io.out.valid.expect(1)
dut.io.out.bits.expect(142)
dut.io.chosen.expect(1)
dut.io.out.ready.poke(false)
dut.io.in(0).ready.expect(0)
dut.io.in(1).ready.expect(0)
dut.io.out.ready.poke(true)
dut.io.in(1).ready.expect(1)
// Both inputs, locks to 1 first cycle as 0 was lastGrant
dut.io.in(0).valid.poke(true)
dut.io.out.valid.expect(1)
dut.io.out.bits.expect(142)
dut.io.chosen.expect(1)
dut.io.out.ready.poke(false)
dut.io.in(0).ready.expect(0)
dut.io.in(1).ready.expect(0)
dut.io.out.ready.poke(true)
dut.io.in(0).ready.expect(0)
dut.io.in(1).ready.expect(1)
// Move to next cycle, should lock to 0 as 1 was lastGrant
dut.clock.step()
dut.io.out.valid.expect(1)
dut.io.out.bits.expect(42)
dut.io.chosen.expect(0)
dut.io.out.ready.poke(false)
dut.io.in(0).ready.expect(0)
dut.io.in(1).ready.expect(0)
dut.io.out.ready.poke(true)
dut.io.in(0).ready.expect(1)
dut.io.in(1).ready.expect(0)
}
}
}