systemc: Change how sc_clock creates processes to match the tests.
authorGabe Black <gabeblack@google.com>
Sat, 8 Sep 2018 01:22:18 +0000 (18:22 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:43:32 +0000 (21:43 +0000)
Accellera sets up the mechanism which toggles sc_clock differently
than it's set up in gem5. This change moves things around a little to
more closely match the order things are done by Accellera so that the
test output matches.

Change-Id: Ia6d327f4cd5d689f6969398f02a66278a3dc010c
Reviewed-on: https://gem5-review.googlesource.com/c/12609
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/channel/sc_clock.cc

index 25c07b3b2328c2f608a913c437858fcd8aa045b0..2a412351f24723c31fd407116125eeafa78599b9 100644 (file)
@@ -46,22 +46,26 @@ class ClockTick : public ScEvent
   private:
     ::sc_core::sc_clock *clock;
     ::sc_core::sc_time _period;
-    std::string _name;
+    std::string name;
     Process *p;
     ProcessMemberFuncWrapper<::sc_core::sc_clock> funcWrapper;
-    std::string _procName;
 
   public:
     ClockTick(::sc_core::sc_clock *clock, bool to,
             ::sc_core::sc_time _period) :
         ScEvent([this]() { tick(); }),
-        clock(clock), _period(_period), _name(clock->name()),
+        clock(clock), _period(_period), name(clock->basename()), p(nullptr),
         funcWrapper(clock, to ? &::sc_core::sc_clock::tickUp :
                                 &::sc_core::sc_clock::tickDown)
     {
-        _name += (to ? ".up_tick" : ".down_tick");
-        _procName = _name + ".p";
-        p = new Method(_procName.c_str(), &funcWrapper, true);
+        name += std::string(to ? "_posedge_action" : "_negedge_action");
+        name = ::sc_core::sc_gen_unique_name(name.c_str());
+    }
+
+    void
+    createProcess()
+    {
+        p = new Method(name.c_str(), &funcWrapper, true);
         scheduler.reg(p);
         scheduler.dontInitialize(p);
     }
@@ -70,7 +74,8 @@ class ClockTick : public ScEvent
     {
         if (scheduled())
             scheduler.deschedule(this);
-        p->popListNode();
+        if (p)
+            p->popListNode();
     }
 
     void
@@ -156,6 +161,8 @@ sc_clock::time_stamp()
 void
 sc_clock::before_end_of_elaboration()
 {
+    _gem5UpEdge->createProcess();
+    _gem5DownEdge->createProcess();
     if (_posedgeFirst) {
         ::sc_gem5::scheduler.schedule(_gem5UpEdge, _startTime);
         ::sc_gem5::scheduler.schedule(_gem5DownEdge,