[if you can] hit all the addresses in a row or column in less than the max refresh interval then you do not need a dedicated refresh controller. The act of reading a row refreshes all the other rows in the chip for that read/write cycle, and if you do more than 256 incremental reads no need for refresh.
In the old days I just wrote an interrupt routine that sequentially scanned memory at the refresh rate. That's all that was needed.
Not the most efficient, but it worked and was simple. The hardware we built at the time was very discrete, did not have any
memory controller on the MCU, or on the board at all, and we used rows and rows of small DRAMS on 18-20 pin DIPS I think
it was.
This was around 1986-87.
By the way, if you need this for a one off project, you can get some 30-pin 16MB SIMM modules on eBay, like the picture. just find something fast enough and make the data bus wide enough for your speeds.