[dvsim] Fix for missing coverage

- The while loop in `Deploy.deploy()` method that sequences the deployed
processes had a bug that caused it to exit when there was more work to
be done. I reordered it so that it works correctly now. `cov_report`
should now get dispatched after `cov_merge`.
- This fixes #1792.

- Some minor fixes to the way things are displayed in stdout.

Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/util/dvsim/Deploy.py b/util/dvsim/Deploy.py
index aba91e8..065bfb4 100644
--- a/util/dvsim/Deploy.py
+++ b/util/dvsim/Deploy.py
@@ -311,7 +311,7 @@
     @staticmethod
     def deploy(items):
         dispatched_items = []
-        queued_items = items
+        queued_items = []
 
         if Deploy.print_legend:
             # Print legend once at the start of the run.
@@ -342,7 +342,7 @@
                     log.log(VERBOSE, "[%s]: [%s]: [dispatch]:\n%s",
                             get_etime(), target, item_names[target])
 
-        def track_progress(status, print_status):
+        def track_progress(status, print_status_flag):
             all_done = True
             for target in status.keys():
                 if "target_done" in status[target].keys(): continue
@@ -361,7 +361,7 @@
                     target_done = True
                 all_done &= target_done
 
-                if print_status:
+                if print_status_flag:
                     width = "0{}d".format(len(str(stats["T"])))
                     msg = "["
                     for s in stats.keys():
@@ -373,16 +373,43 @@
 
         all_done = False
         status = {}
+        print_status_flag = True
 
         # Queue all items
+        queued_items.extend(items)
         for item in queued_items:
             if item.target not in status.keys():
                 status[item.target] = {}
             status[item.target][item] = "Q"
 
         while not all_done:
+            # Get status of dispatched items.
+            for item in dispatched_items:
+                if item.status == "D": item.get_status()
+                if item.status != status[item.target][item]:
+                    print_status_flag = True
+                    if item.status != "D":
+                        if item.status != "P":
+                            # Kill its sub items if item did not pass.
+                            item.set_sub_status("K")
+                            log.error("[%s]: [%s]: [status] [%s: %s]",
+                                      get_etime(), item.target,
+                                      item.identifier, item.status)
+                        else:
+                            log.log(VERBOSE, "[%s]: [%s]: [status] [%s: %s]",
+                                    get_etime(), item.target, item.identifier,
+                                    item.status)
+                        # Queue items' sub-items if it is done.
+                        queued_items.extend(item.sub)
+                        for sub_item in item.sub:
+                            if sub_item.target not in status.keys():
+                                status[sub_item.target] = {}
+                            status[sub_item.target][sub_item] = "Q"
+                status[item.target][item] = item.status
+
             # Dispatch items from the queue as slots free up.
-            if len(queued_items) != 0:
+            all_done = (len(queued_items) == 0)
+            if not all_done:
                 num_slots = Deploy.max_parallel - Deploy.dispatch_counter
                 if num_slots > 0:
                     if len(queued_items) > num_slots:
@@ -394,33 +421,15 @@
                         dispatched_items.extend(queued_items)
                         queued_items = []
 
-            # Advance time by 1s.
-            time.sleep(1)
-            Deploy.num_secs += 1
-            print_status = ((Deploy.num_secs % Deploy.print_interval) == 0)
-
-            # Get status of dispatched items.
-            for item in dispatched_items:
-                if item.status == "D": item.get_status()
-                if item.status != status[item.target][item]:
-                    print_status = True
-                    if item.status != "D":
-                        if item.status != "P":
-                            # Kill its sub items if item did not pass.
-                            item.set_sub_status("K")
-                        log.log(VERBOSE, "[%s]: [%s]: [status]\n  [%s: %s]",
-                                get_etime(), item.target, item.identifier,
-                                item.status)
-                        # Queue items' sub-items if it is done.
-                        queued_items.extend(item.sub)
-                        for sub_item in item.sub:
-                            if sub_item.target not in status.keys():
-                                status[sub_item.target] = {}
-                            status[sub_item.target][sub_item] = "Q"
-                status[item.target][item] = item.status
-
             # Check if we are done and print the status periodically.
-            all_done = track_progress(status, print_status)
+            all_done &= track_progress(status, print_status_flag)
+
+            # Advance time by 1s if there is more work to do.
+            if not all_done:
+                time.sleep(1)
+                Deploy.num_secs += 1
+                print_status_flag = ((Deploy.num_secs %
+                                      Deploy.print_interval) == 0)
 
 
 class CompileSim(Deploy):