I agree. Lots of people tend to over complicate simple tasks.
It is only when you fully understand the problem you are solving, and you have tried solving it from a few different perspectives the "obvious" and "simple" becomes apparent.
It is next to impossible that a beginner writing a UART would stumble onto a nice solution, as there are too many complicating issues that are distractions. For this example...
- start bits
- stop bits
- baud rate errors
- framing errors
- line noise
- detecting the start of bits
- synchronizing of RxD - is it actually needed in this case? (yes, because 'run' could go metastable otherwise)
- resets - why does 'tick' and 'shreg' not get reset by 'rst'?
- clock rates
- bit clock vs system clocks
- supporting different baud rates
- implementing by oversampling, like micros do.
- Order of bits on the wire
- software / hardware flow control
- subtle timing issues
- keeping track of signal edges vs signal levels - edges hold the timing info (i.e. when to capture bits), but the signal levels hold the data bits.
- size (in bits) of 'tick', 'bitcount' and 'shreg' required to hold the range of counter values - e.g. running on a 100MHz clock this would break because 'tick' is too small.
These all these have to be discovered and thought about, hence the ugly FSM with a huge number of states, assigning individual bits and checking everything. It isn't really surprising that beginners write terrible UARTs, in any language. The 10th UART you write will be 10x better than the first, but only 0.1x as satisfying.
I am pretty sure that a less complex, more understandable UART could be written (in any HDL language) that that one. shifting into a shift register and detecting the start bit, avoiding all the complexity of things like "run <= (~RxD) ? 1 : (~rst | endtick & endbit) ? 0 : run;".
It isn't a language thing, it is the design that you are trying to express that makes the biggest difference, and that is mostly shaped by how familiar you are with the problem, and not the HDL being used. Switching language won't help this much.