Any instantiation of a module must be wrapped with "Module()".
This is just a guess, but give this a try:
val cache_inst = Module(new Cache(nways = 16, nsets = 32))
ChiselMainTest(.....),() => (cache_inst){....}
The reason for this, IIRC, is that "Module()" helps Chisel understand the parentage of wires/objects created within your Cache object (essentially pushing and popping the Module stack as the graph is constructed).