スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

sc_semaphoreを記述してみる。


sc_semaphore は相互排他制御が可能なプリミティブチャネルです。
sc_mutex との違いは複数の要素が持てることです。
つまり、sc_mutexは sc_semaphoreの要素:1と見ることができます。
wait/trywait/post/get_valueなどのメンバ関数を用いて制御します。

記述例では、2つのプロセス(do_read,do_write)が一つの Busに対して
アクセスする場合に、重ならないようにしています。
○sc_main.cpp
 1|#include <systemc.h>
 2|
 3|SC_MODULE (hoge) {
 4|  sc_in<bool> clock;
 5|
 6|  sc_semaphore bus;
 7|  int          cnt;
 8|
 9|  void bus_semaphore() {
10|    while (true) {
11|      wait();
12|      if (bus.get_value() == 0) {
13|        cout << "--- @" << sc_time_stamp()
14|             <<" Posting 2 to semaphore ---" << endl;
15|        bus.post();
16|        bus.post();
17|        if (cnt >= 3) {
18|          sc_stop();
19|        }
20|        cnt ++;
21|      }
22|    }
23|  }
24|
25|  void do_read() {
26|    while (true) {
27|      wait();
28|      if (bus.trywait() != -1) { // Check if semaphore is available
29|        cout << "!!! @" << sc_time_stamp()
30|             << " Action do_read() !!!" << endl;
31|        wait(2);
32|      }
33|    }
34|  }
35|
36|  void do_write() {
37|    while (true) {
38|      wait();
39|      bus.wait(); // Wait till semaphore is available
40|      cout << "!!! @" << sc_time_stamp()
41|           << " Action do_write() !!!" << endl;
42|      wait(3);
43|    }
44|  }
45|
46|  SC_CTOR(hoge) : bus(0){
47|    cnt = 0;
48|    SC_CTHREAD(do_read,clock.pos());
49|    SC_CTHREAD(do_write,clock.pos());
50|    SC_CTHREAD(bus_semaphore,clock.pos());
51|  }
52|}; 
53|
54|int sc_main (int argc, char* argv[]) {
55|  sc_clock clock ("my_clock",1,SC_NS);
56|
57|  hoge semaphore("semaphore");
58|  semaphore.clock (clock);
59|
60|  sc_start();
61|
62|  return 0;
63|}

実行結果はこちら

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 Posting 2 to semaphore ---
!!! @1 ns Action do_write() !!!
!!! @1 ns Action do_read() !!!
--- @2 ns Posting 2 to semaphore ---
!!! @4 ns Action do_read() !!!
!!! @5 ns Action do_write() !!!
--- @6 ns Posting 2 to semaphore ---
!!! @7 ns Action do_read() !!!
!!! @9 ns Action do_write() !!!
--- @10 ns Posting 2 to semaphore ---
!!! @10 ns Action do_read() !!!

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

動作タイミングはこんな感じです。
         1ns  2ns 3ns...
          |  |  |  |  |  |  |  |  |  |  |  |  |
 post     ↑  ↑              ↑              ↑

 do_read  ↑          ↑          ↑          ↑
          |<-------->|<--- wait(2) & wait
 do_write ↑              ↑              ↑              ↑
          |<------------>|<--- wait(3) & wait

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

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
08 | 2017/09 | 10
- - - - - 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
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。