RTL is not as expressive for algorithms or data structures as most software programming languages.
The concurrency model is that everything executes in lock-step. The programmer keeps all this concurrency in his/her mind.
Users must generate their own, bespoke handshaking and flow control between components.
Higher-level entry forms are ideally needed, perhaps schedulling within a thread at compile-time and between threads at run time ? (See Bluespec and HLS remarks).