circt/test/Dialect/FIRRTL/SFCTests/ExtractSeqMems/Compose.fir

126 lines
4.5 KiB
Plaintext

; UNSUPPORTED: system-windows
; See https://github.com/llvm/circt/issues/4128
; RUN: rm -rf %t
; RUN: firtool --repl-seq-mem --repl-seq-mem-file=mems.conf --split-verilog -o=%t %s
; RUN: FileCheck %s --check-prefix=TESTHARNESS < %t/TestHarness.sv
; RUN: FileCheck %s --check-prefix=DUTMODULE < %t/DUTModule.sv
; RUN: FileCheck %s --check-prefix=SEQMEMSGROUP < %t/SeqMemsGroup.sv
; RUN: FileCheck %s --check-prefix=INJECTEDSUBMODULE < %t/InjectedSubmodule.sv
; RUN: FileCheck %s --check-prefix=SOMEMODULE < %t/SomeModule.sv
; RUN: FileCheck %s --check-prefix=MEM < %t/mem.sv
; RUN: FileCheck %s --check-prefix=MEMS-CONF < %t/mems.conf
; RUN: FileCheck %s --check-prefix=SEQMEMS-TXT < %t/SeqMems.txt
; Extracted from test/scala/firrtl/ExtractSeqMems.scala
; Checks that instance extraction composes with:
; - Dedup
; - Inject DUT Hierarchy
FIRRTL version 4.0.0
circuit TestHarness : %[[
{
"class":"sifive.enterprise.firrtl.InjectDUTHierarchyAnnotation",
"name":"InjectedSubmodule"
},
{
"class":"sifive.enterprise.firrtl.ExtractSeqMemsFileAnnotation",
"filename":"SeqMems.txt",
"group":"SeqMemsGroup"
},
{
"class":"sifive.enterprise.firrtl.MarkDUTAnnotation",
"target":"TestHarness.DUTModule"
}
]]
module SomeModule :
input clock : Clock
input reset : Reset
output io : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}
smem mem : UInt<8> [8]
infer mport read = mem[io.addr], clock
connect io.dataOut, read
when io.wen :
infer mport write = mem[io.addr], clock
connect write, io.dataIn
module SomeModule_1 :
input clock : Clock
input reset : Reset
output io : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}
smem mem : UInt<8> [8]
infer mport read = mem[io.addr], clock
connect io.dataOut, read
when io.wen :
infer mport write = mem[io.addr], clock
connect write, io.dataIn
; DUTMODULE: module DUTModule
; DUTMODULE: SeqMemsGroup SeqMemsGroup
; DUTMODULE: InjectedSubmodule InjectedSubmodule
; NOTE(fschuiki): The above should actually read `SeqMemsGroup`, but it
; is not yet totally clear how to properly order the FIRRTL passes such that
; the module generated by `ExtractInstances` gets properly prefixed.
module DUTModule :
input clock : Clock
input reset : Reset
output io : { foo : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}, bar : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}}
inst inst0 of SomeModule
connect inst0.clock, clock
connect inst0.reset, reset
connect io.foo.dataOut, inst0.io.dataOut
connect inst0.io.wen, io.foo.wen
connect inst0.io.dataIn, io.foo.dataIn
connect inst0.io.addr, io.foo.addr
inst inst1 of SomeModule_1
connect inst1.clock, clock
connect inst1.reset, reset
connect io.bar.dataOut, inst1.io.dataOut
connect inst1.io.wen, io.bar.wen
connect inst1.io.dataIn, io.bar.dataIn
connect inst1.io.addr, io.bar.addr
; TESTHARNESS: module TestHarness
; TESTHARNESS: DUTModule dut
; TESTHARNESS-NOT: mem_ext mem_ext
; TESTHARNESS-NOT: mem_ext mem_ext
public module TestHarness :
input clock : Clock
input reset : UInt<1>
output io : { foo : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}, bar : { flip addr : UInt<3>, flip dataIn : UInt<8>, flip wen : UInt<1>, dataOut : UInt<8>}}
inst dut of DUTModule
connect dut.clock, clock
connect dut.reset, reset
connect io.bar.dataOut, dut.io.bar.dataOut
connect dut.io.bar.wen, io.bar.wen
connect dut.io.bar.dataIn, io.bar.dataIn
connect dut.io.bar.addr, io.bar.addr
connect io.foo.dataOut, dut.io.foo.dataOut
connect dut.io.foo.wen, io.foo.wen
connect dut.io.foo.dataIn, io.foo.dataIn
connect dut.io.foo.addr, io.foo.addr
; INJECTEDSUBMODULE: module InjectedSubmodule
; INJECTEDSUBMODULE: SomeModule inst0
; INJECTEDSUBMODULE: SomeModule inst1
; SOMEMODULE: module SomeModule
; SOMEMODULE: mem mem
; SEQMEMSGROUP: module SeqMemsGroup
; SEQMEMSGROUP: mem_wiring_1_R0_addr
; SEQMEMSGROUP: mem_wiring_0_R0_addr
; SEQMEMSGROUP: mem_ext mem_ext
; SEQMEMSGROUP: mem_ext mem_ext
; MEM: module mem
; MEM-NOT: mem_ext mem_ext
; MEM-NOT: mem_ext mem_ext
; MEMS-CONF: name mem_ext depth 8 width 8 ports write,read
; SEQMEMS-TXT: mem_wiring_1 -> DUTModule.InjectedSubmodule.inst0.mem
; SEQMEMS-TXT: mem_wiring_0 -> DUTModule.InjectedSubmodule.inst1.mem