Similar to what @ads-ee said, a freeze at time 0 is most commonly from a process running without either a wait statement or a sensitivity list, however, there is an issue in this process.
Your else branch in your process does not have a wait statement, and hence, once your process selects this branch, your simulation will hang.
Code:
. . .
else
data_out <= ( others => 'Z' ) ;
read_or_write <= '0' ;
cs <= '1' ;
end if ;
end process cpu_transactions ;
If the CPU you are modeling uses a clock, it might be handy to use that as a reference internally to your model.
I know some books suggest that waveform assignments are suitable to setup elements of a test. Once the test has any complexity this approach becomes painful (both to write and review). What I might suggest as a structure is:
CpuTestProc: process
begin
-- wait for system to come out of reset and start time
wait for 100 ns ;
-- Do Write Cycle with address=X"000114", data=X"000020E7"
wait for 300 ns - NOW ; -- NOW is a function in std.standard
-- Do Write Cycle with address=X"000054", data=X"...."
wait for 700000 ns - NOW ;
-- Do Read Cycle with address=X"000034"
. . .
Use procedures to implement a CpuWriteCycle and CpuReadCycle.
If this is for work, see our website (
https://www.synthworks.com) for VHDL classes that will help you progress quickly.