sc_mutexを記述してみる。

sc_mutex は相互排他制御が可能なプリミティブチャネルです。
共有で使用する資源などを lock/unlock にて制御します。

記述例では、2つのプロセス(pm0,pm1)が一つの portに対してアクセスする
場合に、重ならないようにしています。

○sc_main.cpp
 1|#include <systemc.h>
 2|using namespace sc_core;
 3|
 4|SC_MODULE (hoge) {
 5|  sc_in<bool> clock;
 6| 
 7|  sc_mutex    port;
 8|  int         cnt;
 9| 
10|  void access(int no) {
11|    cout << "!!! @" << sc_time_stamp()
12|         <<" Access by Master " << no << " !!!" << endl;
13|  }
14| 
15|  void pm0() {
16|    while (true) {
17|      wait();
18|      if (port.trylock() != -1) { // Check if mutex is available
19|        access(0);
20|        wait(2);
21|        port.unlock()// Unlock the mutex
22|        cnt++;
23|      } else {
24|        cout << "--- @" << sc_time_stamp()
25|             << " Master 0:Waiting ---"<<endl;
26|      }
27|      if (cnt>=2) {
28|        sc_stop();
29|      }
30|    }
31|  }
32| 
33|  void pm1() {
34|    while (true) {
35|      wait();
36|      port.lock();
37|      access(1);
38|      wait(3);
39|      port.unlock()// Unlock the mutex
40|    }
41|  }
42| 
43|  SC_CTOR(hoge) {
44|    cnt=0;
45|    SC_CTHREAD(pm0, clock.pos());
46|    SC_CTHREAD(pm1, clock.pos());
47|  }
48|};
49|
50|int sc_main (int argc, char* argv[]) {
51|  sc_clock clock ("clock",1.,SC_NS);
52| 
53|  hoge mHOGE("mHOGE");
54|  mHOGE.clock (clock);
55| 
56|  sc_start();
57| 
58|  return 0;
59|}
60|

実行結果はこちら

SystemC 2.3.0_pub_rev_20111121-OSCI --- Jan 18 2012 06:21:53
Copyright (c) 1996-2011 by all Contributors,
ALL RIGHTS RESERVED

!!! @1 ns Access by Master 1 !!!
--- @1 ns Master 0:Waiting ---
--- @2 ns Master 0:Waiting ---
--- @3 ns Master 0:Waiting ---
!!! @4 ns Access by Master 0 !!!

Info: (I804) /IEEE_Std_1666/deprecated: all waits except wait() and wait(N)
are deprecated for SC_CTHREAD, use an SC_THREAD instead
!!! @7 ns Access by Master 1 !!!
--- @7 ns Master 0:Waiting ---
--- @8 ns Master 0:Waiting ---
--- @9 ns Master 0:Waiting ---
!!! @10 ns Access by Master 0 !!!

Info: /OSCI/SystemC: Simulation stopped by user.

Info: (I804) /IEEE_Std_1666/deprecated: You can turn off warnings about
IEEE 1666 deprecated features by placing this method call as the
first statement in your sc_main() function:

sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING);
最初に pm1がアクセスし、その後 pm0がアクセスします。
pm1がアクセス後 3クロックは waitしているため、その間 pm0が待っています。
その後、pm0がアクセスし 2クロックwaitしている間は pm1が待っています。

とまぁ、こんな感じで書けるんですねー
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数