summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/CompatibilitySpec.scala
diff options
context:
space:
mode:
authorAditya Naik2023-11-23 03:11:56 -0800
committerAditya Naik2023-11-23 03:11:56 -0800
commitaf415532cf160e63e971ceb301833b8433c18a50 (patch)
tree1fef70139846f57298c8e24a590490a74249f7dd /src/test/scala/chiselTests/CompatibilitySpec.scala
parent8200c0cdf1d471453946d5ae24bc99757b2ef02d (diff)
cleanup
Diffstat (limited to 'src/test/scala/chiselTests/CompatibilitySpec.scala')
-rw-r--r--src/test/scala/chiselTests/CompatibilitySpec.scala639
1 files changed, 0 insertions, 639 deletions
diff --git a/src/test/scala/chiselTests/CompatibilitySpec.scala b/src/test/scala/chiselTests/CompatibilitySpec.scala
deleted file mode 100644
index 5a3b43e6..00000000
--- a/src/test/scala/chiselTests/CompatibilitySpec.scala
+++ /dev/null
@@ -1,639 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-
-package chiselTests
-
-import chisel3.stage.ChiselStage
-import chisel3.testers.BasicTester
-
-import org.scalacheck.Gen
-import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks
-
-import scala.collection.immutable.ListMap
-
-// Need separate import to override compile options from Chisel._
-object CompatibilityCustomCompileOptions {
- import Chisel.{defaultCompileOptions => _, _}
- implicit val customCompileOptions =
- chisel3.ExplicitCompileOptions.NotStrict.copy(inferModuleReset = true)
- class Foo extends Module {
- val io = new Bundle {}
- }
-}
-
-class CompatibiltySpec extends ChiselFlatSpec with ScalaCheckDrivenPropertyChecks with Utils {
- import Chisel._
-
- behavior.of("Chisel compatibility layer")
-
- it should "accept direction arguments" in {
- ChiselStage.elaborate(new Module {
- // Choose a random direction
- val directionArgument: Direction = Gen.oneOf(INPUT, OUTPUT, NODIR).sample.get
- val expectedDirection = directionArgument match {
- case NODIR => OUTPUT
- case other => other
- }
- // Choose a random width
- val width = Gen.choose(1, 2048).sample.get
- val io = new Bundle {
- val b = Bool(directionArgument)
- val u = UInt(directionArgument, width)
- }
- io.b shouldBe a[Bool]
- io.b.getWidth shouldEqual 1
- io.b.dir shouldEqual (expectedDirection)
- io.u shouldBe a[UInt]
- io.u.getWidth shouldEqual width
- io.u.dir shouldEqual (expectedDirection)
- })
- }
-
- it should "accept single argument U/SInt factory methods" in {
- // Choose a random value
- val value: Int = Gen.choose(0, Int.MaxValue).sample.get
- val l = UInt(value)
- l shouldBe a[UInt]
- l shouldBe 'lit
- l.getWidth shouldEqual BigInt(value).bitLength
- l.litValue() shouldEqual value
- }
-
- it should "map utility objects into the package object" in {
- val value: Int = Gen.choose(2, 2048).sample.get
- log2Up(value) shouldBe (1.max(BigInt(value - 1).bitLength))
- log2Ceil(value) shouldBe (BigInt(value - 1).bitLength)
- log2Down(value) shouldBe ((1.max(BigInt(value - 1).bitLength)) - (if (value > 0 && ((value & (value - 1)) == 0)) 0
- else 1))
- log2Floor(value) shouldBe (BigInt(value - 1).bitLength - (if (value > 0 && ((value & (value - 1)) == 0)) 0 else 1))
- isPow2(BigInt(1) << value) shouldBe true
- isPow2((BigInt(1) << value) - 1) shouldBe false
- }
-
- it should "make BitPats available" in {
- val value: Int = Gen.choose(1, Int.MaxValue).sample.get
- val binaryString = value.toBinaryString
- val maskPosition = Gen.choose(0, binaryString.length - 1).sample.get
- val bs = new StringBuilder(binaryString)
- bs(maskPosition) = '?'
- val bitPatString = bs.toString
- val bp = BitPat("b" + bitPatString)
- bp shouldBe a[BitPat]
- bp.getWidth shouldEqual binaryString.length
-
- }
-
- it should "successfully compile a complete module" in {
- class Dummy extends Module {
- // The following just checks that we can create objects with nothing more than the Chisel compatibility package.
- val io = new Bundle {}
- val data = UInt(width = 3)
- val wire = Wire(data)
- new ArbiterIO(data, 2) shouldBe a[ArbiterIO[UInt]]
- Module(new LockingRRArbiter(data, 2, 2, None)) shouldBe a[LockingRRArbiter[UInt]]
- Module(new RRArbiter(data, 2)) shouldBe a[RRArbiter[UInt]]
- Module(new Arbiter(data, 2)) shouldBe a[Arbiter[UInt]]
- new Counter(2) shouldBe a[Counter]
- new ValidIO(data) shouldBe a[ValidIO[UInt]]
- new DecoupledIO(data) shouldBe a[DecoupledIO[UInt]]
- new QueueIO(data, 2) shouldBe a[QueueIO[UInt]]
- Module(new Pipe(data, 2)) shouldBe a[Pipe[UInt]]
-
- FillInterleaved(2, wire) shouldBe a[UInt]
- PopCount(wire) shouldBe a[UInt]
- Fill(2, wire) shouldBe a[UInt]
- Reverse(wire) shouldBe a[UInt]
- Cat(wire, wire) shouldBe a[UInt]
- Log2(wire) shouldBe a[UInt]
- // 'switch' and 'is' are tested below in Risc
- Counter(2) shouldBe a[Counter]
- DecoupledIO(wire) shouldBe a[DecoupledIO[UInt]]
- val dcd = Wire(Decoupled(data))
- dcd shouldBe a[DecoupledIO[UInt]]
- Queue(dcd) shouldBe a[DecoupledIO[UInt]]
- Queue(dcd, 0) shouldBe a[DecoupledIO[UInt]]
- Enum(UInt(), 2) shouldBe a[List[UInt]]
- ListLookup(wire, List(wire), Array((BitPat("b1"), List(wire)))) shouldBe a[List[UInt]]
- Lookup(wire, wire, Seq((BitPat("b1"), wire))) shouldBe a[UInt]
- Mux1H(wire, Seq(wire)) shouldBe a[UInt]
- PriorityMux(Seq(Bool(false)), Seq(data)) shouldBe a[UInt]
- MuxLookup(wire, wire, Seq((wire, wire))) shouldBe a[UInt]
- MuxCase(wire, Seq((Bool(true), wire))) shouldBe a[UInt]
- OHToUInt(wire) shouldBe a[UInt]
- PriorityEncoder(wire) shouldBe a[UInt]
- UIntToOH(wire) shouldBe a[UInt]
- PriorityEncoderOH(wire) shouldBe a[UInt]
- RegNext(wire) shouldBe a[UInt]
- RegInit(wire) shouldBe a[UInt]
- RegEnable(wire, Bool(true)) shouldBe a[UInt]
- ShiftRegister(wire, 2) shouldBe a[UInt]
- Valid(data) shouldBe a[ValidIO[UInt]]
- Pipe(Wire(Valid(data)), 2) shouldBe a[ValidIO[UInt]]
- }
- ChiselStage.elaborate { new Dummy }
- }
- // Verify we can elaborate a design expressed in Chisel2
- class Chisel2CompatibleRisc extends Module {
- val io = new Bundle {
- val isWr = Bool(INPUT)
- val wrAddr = UInt(INPUT, 8)
- val wrData = Bits(INPUT, 32)
- val boot = Bool(INPUT)
- val valid = Bool(OUTPUT)
- val out = Bits(OUTPUT, 32)
- }
- val file = Mem(256, Bits(width = 32))
- val code = Mem(256, Bits(width = 32))
- val pc = Reg(init = UInt(0, 8))
-
- val add_op :: imm_op :: Nil = Enum(2)
-
- val inst = code(pc)
- val op = inst(31, 24)
- val rci = inst(23, 16)
- val rai = inst(15, 8)
- val rbi = inst(7, 0)
-
- val ra = Mux(rai === Bits(0), Bits(0), file(rai))
- val rb = Mux(rbi === Bits(0), Bits(0), file(rbi))
- val rc = Wire(Bits(width = 32))
-
- io.valid := Bool(false)
- io.out := Bits(0)
- rc := Bits(0)
-
- when(io.isWr) {
- code(io.wrAddr) := io.wrData
- }.elsewhen(io.boot) {
- pc := UInt(0)
- }.otherwise {
- switch(op) {
- is(add_op) { rc := ra +% rb }
- is(imm_op) { rc := (rai << 8) | rbi }
- }
- io.out := rc
- when(rci === UInt(255)) {
- io.valid := Bool(true)
- }.otherwise {
- file(rci) := rc
- }
- pc := pc +% UInt(1)
- }
- }
-
- it should "Chisel2CompatibleRisc should elaborate" in {
- ChiselStage.elaborate { new Chisel2CompatibleRisc }
- }
-
- it should "not try to assign directions to Analog" in {
- ChiselStage.elaborate(new Module {
- val io = new Bundle {
- val port = chisel3.experimental.Analog(32.W)
- }
- })
- }
-
- class SmallBundle extends Bundle {
- val f1 = UInt(width = 4)
- val f2 = UInt(width = 5)
- }
- class BigBundle extends SmallBundle {
- val f3 = UInt(width = 6)
- }
-
- "A Module with missing bundle fields when compiled with the Chisel compatibility package" should "not throw an exception" in {
-
- class ConnectFieldMismatchModule extends Module {
- val io = new Bundle {
- val in = (new SmallBundle).asInput
- val out = (new BigBundle).asOutput
- }
- io.out := io.in
- }
- ChiselStage.elaborate { new ConnectFieldMismatchModule() }
- }
-
- "A Module in which a Reg is created with a bound type when compiled with the Chisel compatibility package" should "not throw an exception" in {
-
- class CreateRegFromBoundTypeModule extends Module {
- val io = new Bundle {
- val in = (new SmallBundle).asInput
- val out = (new BigBundle).asOutput
- }
- val badReg = Reg(UInt(7, width = 4))
- }
- ChiselStage.elaborate { new CreateRegFromBoundTypeModule() }
- }
-
- "A Module with unwrapped IO when compiled with the Chisel compatibility package" should "not throw an exception" in {
-
- class RequireIOWrapModule extends Module {
- val io = new Bundle {
- val in = UInt(width = 32).asInput
- val out = Bool().asOutput
- }
- io.out := io.in(1)
- }
- ChiselStage.elaborate { new RequireIOWrapModule() }
- }
-
- "A Module without val io" should "throw an exception" in {
- class ModuleWithoutValIO extends Module {
- val foo = IO(new Bundle {
- val in = UInt(width = 32).asInput
- val out = Bool().asOutput
- })
- foo.out := foo.in(1)
- }
- val e = intercept[Exception](
- ChiselStage.elaborate { new ModuleWithoutValIO }
- )
- e.getMessage should include("must have a 'val io' Bundle")
- }
-
- "A Module connecting output as source to input as sink when compiled with the Chisel compatibility package" should "not throw an exception" in {
-
- class SimpleModule extends Module {
- val io = new Bundle {
- val in = (UInt(width = 3)).asInput
- val out = (UInt(width = 4)).asOutput
- }
- }
- class SwappedConnectionModule extends SimpleModule {
- val child = Module(new SimpleModule)
- io.in := child.io.out
- }
- ChiselStage.elaborate { new SwappedConnectionModule() }
- }
-
- "Vec ports" should "give default directions to children so they can be used in chisel3.util" in {
- import Chisel._
- ChiselStage.elaborate(new Module {
- val io = new Bundle {
- val in = Vec(1, UInt(width = 8)).flip
- val out = UInt(width = 8)
- }
- io.out := RegEnable(io.in(0), true.B)
- })
- }
-
- "Reset" should "still walk, talk, and quack like a Bool" in {
- import Chisel._
- ChiselStage.elaborate(new Module {
- val io = new Bundle {
- val in = Bool(INPUT)
- val out = Bool(OUTPUT)
- }
- io.out := io.in && reset
- })
- }
-
- "Data.dir" should "give the correct direction for io" in {
- import Chisel._
- ChiselStage.elaborate(new Module {
- val io = (new Bundle {
- val foo = Bool(OUTPUT)
- val bar = Bool().flip
- }).flip
- Chisel.assert(io.foo.dir == INPUT)
- Chisel.assert(io.bar.dir == OUTPUT)
- })
- }
-
- // Note: This is a regression (see https://github.com/freechipsproject/chisel3/issues/668)
- it should "fail for Chisel types" in {
- import Chisel._
- an[chisel3.ExpectedHardwareException] should be thrownBy extractCause[chisel3.ExpectedHardwareException] {
- ChiselStage.elaborate(new Module {
- val io = new Bundle {}
- UInt(INPUT).dir
- })
- }
- }
-
- "Mux return value" should "be able to be used on the RHS" in {
- import Chisel._
- ChiselStage.elaborate(new Module {
- val gen = new Bundle { val foo = UInt(width = 8) }
- val io = new Bundle {
- val a = Vec(2, UInt(width = 8)).asInput
- val b = Vec(2, UInt(width = 8)).asInput
- val c = gen.asInput
- val d = gen.asInput
- val en = Bool(INPUT)
- val y = Vec(2, UInt(width = 8)).asOutput
- val z = gen.asOutput
- }
- io.y := Mux(io.en, io.a, io.b)
- io.z := Mux(io.en, io.c, io.d)
- })
- }
-
- "Chisel3 IO constructs" should "be useable in Chisel2" in {
- import Chisel._
- ChiselStage.elaborate(new Module {
- val io = IO(new Bundle {
- val in = Input(Bool())
- val foo = Output(Bool())
- val bar = Flipped(Bool())
- })
- Chisel.assert(io.in.dir == INPUT)
- Chisel.assert(io.foo.dir == OUTPUT)
- Chisel.assert(io.bar.dir == INPUT)
- })
- }
-
- behavior.of("BitPat")
-
- it should "support old operators" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("Deprecated method DC hasn't been removed")
- val bp = BitPat.DC(4)
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("Enum")
-
- it should "support apply[T <: Bits](nodeType: T, n: Int): List[T]" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("works for a UInt")
- Enum(UInt(), 4) shouldBe a[List[UInt]]
-
- info("throw an exception for non-UInt types")
- intercept[IllegalArgumentException] {
- Enum(SInt(), 4)
- }.getMessage should include("Only UInt supported for enums")
-
- info("throw an exception if the bit width is specified")
- intercept[IllegalArgumentException] {
- Enum(UInt(width = 8), 4)
- }.getMessage should include("Bit width may no longer be specified for enums")
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("Queue")
-
- it should "support deprecated constructors" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("reset: Option[Bool] constructor works")
- val option = Module(new Queue(UInt(), 4, false, false, Some(Bool(true))))
-
- info("reset: Bool constructor works")
- val explicit = Module(new Queue(UInt(), 4, false, false, Bool(true)))
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("LFSR16")
-
- it should "still exist" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("Still exists")
- val lfsr = LFSR16()
-
- info("apply method returns a UInt")
- lfsr shouldBe a[UInt]
-
- info("returned UInt has a width of 16")
- lfsr.getWidth should be(16)
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("Mem")
-
- it should "support deprecated apply methods" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("apply[T <: Data](t: T, size: BigInt): Mem[T] works")
- val memBigInt = Mem(UInt(), 8: BigInt)
- memBigInt shouldBe a[Mem[UInt]]
-
- info("apply[T <: Data](t: T, size: Int): Mem[T] works")
- val memInt = Mem(SInt(), 16: Int)
- memInt shouldBe a[Mem[SInt]]
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("SeqMem")
-
- it should "support deprecated apply methods" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("apply[T <: Data](t: T, size: BigInt): SeqMem[T] works")
- val seqMemBigInt = SeqMem(UInt(), 8: BigInt)
- seqMemBigInt shouldBe a[SeqMem[UInt]]
-
- info("apply[T <: Data](t: T, size: Int): SeqMem[T] works")
- val seqMemInt = SeqMem(UInt(), 16: Int)
- seqMemInt shouldBe a[SeqMem[UInt]]
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- it should "support data-types of mixed directionality" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
- val tpe = new Bundle { val foo = UInt(OUTPUT, width = 4); val bar = UInt(width = 4) }
- // NOTE for some reason, the old bug this hit did not occur when `tpe` is inlined
- val mem = SeqMem(tpe, 8)
- mem(3.U)
-
- }
- ChiselStage.elaborate((new Foo))
- }
-
- behavior.of("debug")
-
- it should "still exist" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- val data = UInt(width = 2)
- debug(data)
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("Data methods")
-
- behavior.of("Wire")
-
- it should "support legacy methods" in {
- class Foo extends Module {
- val io = IO(new Bundle {})
-
- info("apply[T <: Data](dummy: Int = 0, init: T): T works")
- val first = Wire(init = UInt("hdeadbeef"))
- first shouldBe a[UInt]
-
- info("apply[T <: Data](t: T, init: T): T works")
- val second = Wire(SInt(), SInt(-100))
- second shouldBe a[SInt]
-
- info("apply[T <: Data](t: T, init: DontCare.type): T works")
- val third = Wire(UInt(), chisel3.DontCare)
- third shouldBe a[UInt]
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- behavior.of("Vec")
-
- it should "support legacy methods" in {
- class Foo extends BasicTester {
- val seq = Seq(Wire(UInt(0, width = 4)), Wire(UInt(1, width = 4)), Wire(UInt(2, width = 4)))
- val vec = Vec(seq)
-
- info("read works")
- chisel3.assert(vec.read(UInt(0)) === UInt(0))
-
- info("write works")
- vec.write(UInt(1), UInt(3))
- chisel3.assert(vec.read(UInt(1)) === UInt(3))
-
- val (_, done) = Counter(Bool(true), 4)
- when(done) { stop }
- }
-
- assertTesterPasses(new Foo)
- }
-
- behavior.of("Bits methods")
-
- it should "support legacy methods" in {
- class Foo extends Module {
- val io = new Bundle {}
-
- val u = UInt(8)
- val s = SInt(-4)
-
- info("asBits works")
- s.asBits shouldBe a[Bits]
-
- info("toSInt works")
- u.toSInt shouldBe a[SInt]
-
- info("toUInt works")
- s.toUInt shouldBe a[UInt]
-
- info("toBools works")
- s.toBools shouldBe a[Seq[Bool]]
- }
-
- ChiselStage.elaborate(new Foo)
- }
-
- it should "properly propagate custom compileOptions in Chisel.Module" in {
- import CompatibilityCustomCompileOptions._
- var result: Foo = null
- ChiselStage.elaborate({ result = new Foo; result })
- (result.compileOptions should be).theSameInstanceAs(customCompileOptions)
- }
-
- it should "properly set the refs of Records" in {
- class MyRecord extends Record {
- val foo = Vec(1, Bool()).asInput
- val bar = Vec(1, Bool())
- val elements = ListMap("in" -> foo, "out" -> bar)
- def cloneType = (new MyRecord).asInstanceOf[this.type]
- }
- class Foo extends Module {
- val io = IO(new MyRecord)
- io.bar := io.foo
- }
- val verilog = ChiselStage.emitVerilog(new Foo)
- // Check that the names are correct (and that the FIRRTL is valid)
- verilog should include("assign io_out_0 = io_in_0;")
- }
-
- it should "ignore .suggestName on field io" in {
- class MyModule extends Module {
- val io = new Bundle {
- val foo = UInt(width = 8).asInput
- val bar = UInt(width = 8).asOutput
- }
- io.suggestName("potato")
- io.bar := io.foo
- }
- val verilog = ChiselStage.emitVerilog(new MyModule)
- verilog should include("input [7:0] io_foo")
- verilog should include("output [7:0] io_bar")
- }
-
- it should "properly name field io" in {
- class MyModule extends Module {
- val io = new Bundle {
- val foo = UInt(width = 8).asInput
- val bar = UInt(width = 8).asOutput
- }
- val wire = Wire(init = io.foo)
- io.bar := wire
- }
- val verilog = ChiselStage.emitVerilog(new MyModule)
- verilog should include("input [7:0] io_foo")
- verilog should include("output [7:0] io_bar")
- }
-
- it should "properly handle hardware construction before val io is initialized" in {
- class MyModule extends Module {
- val foo = Wire(init = UInt(8))
- val io = new Bundle {
- val in = UInt(INPUT, width = 8)
- val en = Bool(INPUT)
- val out = UInt(OUTPUT, width = 8)
- }
- io.out := foo
- when(io.en) {
- io.out := io.in
- }
- }
- // Just check that this doesn't crash during elaboration. For more info see:
- // https://github.com/chipsalliance/chisel3/issues/1802
- //
- ChiselStage.elaborate(new MyModule)
- }
-
- behavior.of("BlackBox")
-
- it should "have invalidated ports in a compatibility context" in {
- class ExtModuleInvalidatedTester extends Module {
- val io = IO(new Bundle {
- val in = Input(UInt(8.W))
- val out = Output(UInt(8.W))
- })
- val inst = Module(new BlackBox {
- val io = IO(new Bundle {
- val in = Input(UInt(8.W))
- val out = Output(UInt(8.W))
- })
- })
- inst.io.in := io.in
- io.out := inst.io.out
- }
-
- val chirrtl = ChiselStage.emitChirrtl(new ExtModuleInvalidatedTester)
- chirrtl should include("inst.in is invalid")
- chirrtl should include("inst.out is invalid")
- }
-}