Verilog/SystemVerilog contains a well organized event queue. All the statements in each and every time stamp executes according to this queue.
- $display executes in ACTIVE region, so if there is any non-blocking assignment(which executes in INACTIVE region), it won't be shown by $display.
- $write also executes in ACTIVE region, but an explicit call to newline character(\n) is required to insert another line. This system task is generally used when you want to display Multidimensional array using for loop.
- $strobe executes in MONITOR/POSTPONE region, that is, at the end of time stamp. Hence the updated value is shown by $strobe.
- $monitor displays every time one of its display parameters changes. Only one $monitor per Simulation is to be used.
Have a look at this image : VERILOG EVENT REGIONS
Sample code is available at : Display/Strobe/Monitor
Hope this code makes it clear.