Assignments with after and signals
The key here is your use of &lt;=, which causes assignments to happen in parallel.

Consider the assignment of 1 to input. That triggers the process(input). The first line temp &lt;= input; effectively queues the assignment of 1 to temp immediately after the current time step. temp retains the value of 0 for the execution of the next line, which is interpreted as "queue the assignment of the value that temp had at the start of this process to be assigned to goes_out in 10ns time".

If you collapse it to goes_out &lt;= input after 10ns; and remove temp entirely, it looks a bit more intuitive. Or view the values of temp and input in your simulator.