An LVT based implementation based on this paper by Laforest and Steffan using SpinalHDL
- Use Asynchronous or Synchronous RAMs
- Can infer MLAB blocks in new Altera Devices (using attributes) for async or sync rams
- Generic: Any number of read and write ports (Must be greater than zero)
- spinalHDL
- scaltest (for verification)
A basic example is given in src/main/scala/MultiportRamGenerator.scala
All the properties are defined in the RamCfg class. The following are the parameters that are used
nWords: IntNumber of words in RAMnWrite: IntNumber of write portsnBits: IntNumber of bits per wordnRead: IntNumber of read portsuseRdEn: BooleanUse read enable signalsasyncReads: BooleanDo reads asynchronouslymlabAttr: BooleanForce Infer MLABs (Altera Quartus only)
Multiple random configurations (16 wide, 32 deep) are created covering both synchronous and asynchronous modes with random number of read and write ports (constrained within 1 to 5). They are first written with random 16 bit data using all write ports and then it is read back using all read ports. It is then checked if the readback data matched the data that was written