There will be no good answers from this information; we can only guess what source code this equipment created.
But itβs clear that you need to study the source, hypothesize why it is slow, take steps to fix the problem, and test the solution.
And repeat until fast enough.
My guess is, given your hint that there is a case argument for decoding opcodes ...
one of the hands is something like:
when <some expression involving decode> => address <= <some address calculation>;
The problem is that often the two expressions are interconnected, so they are evaluated in one cycle. An example solution would be to precompute the address expression (i.e., in the previous cycle) in the register and rewrite the business hand as:
when <some expression involving decode> => address <= register;
If you guessed it, the result will be a little faster, and you will have another (similar) bottleneck to fix. Repeat until fast enough ...
But without a source and time analysis, do not expect a more specific answer.
EDIT: Having laid out part of the source code, the image is a little clearer: you have two nested Case statements, each of which is large enough. You obviously need some simplification ...
I note that only 2 internal arguments to the case are assigned by i_ram_addr, but time analysis shows a huge and complex multiplex to i_ram_addr; it is clear that there are many other cases that contribute to i_ram_addr ...
I would suggest that you have to deal with i_ram_addr separately from the main Case statement and write a simple machine that you can only create for i_ram_addr. For example, I would like to note that the lever for the OPCODE case is equivalent:
if OPCODE(7 downto 3) = "11101" then ...
and ask how easy you can get a decoder for i_ram_addr only. You may find that many other weapon manipulations do very similar things with i_ram_addr (the original 8051 designers would jump to simplify the logic!). Synthesis tools can be quite smart at simplifying logic, but when things get too complicated, they can miss opportunities.
(At this point, I commented on the purpose of i_ram_addr and left the rest of the decoder)