Even if you start with a _much_ simpler design than a DDR-controller, (in my experience) you'll have issues reading other peoples code.
First off, call-graphs and static analysis doesn't really makes sense in an HDL context, as everything is concurrent. There's no calls, functions etc...
Also, HDL languages seem to have gotten stuck somewhere in the 80s. None of the modern niceties of a modern language is present. No namespaces, structs, etc. All of this is implementable in a HDL (as it has no bearing on the outputted code), but it makes it _much_, _much_ easier to organize ones code and make it more readable.
Since it pretty much is impossible to write clean and understandable HDL once you get up to scale, understanding other peoples projects will be difficult.
In the end, I pretty much adapted the strategy "I'll write something just like this module, and I'll copy the sh*t of out of it" (copyrights be damned). Once I got along a bit, I started to understand the original much better, and I could discontinue my own version, and use the original instead..