SYSTEMC 11: wait(sc_time) và sc_event()

Lu ROm

Administrator
Staff member
25 Tháng bảy 2014
481
119
43
31
One piece
vimach.net
1.wait(sc_time)
- wait(sc_time) thường hữu ích để trì hoãn một process trong thời gian thời gian nhất định. Method wait() cung cấp cú pháp cho phép delay trong process SC_THREAD. Khi wait() được gọi, các khối quá trình SC_THREAD được tiếp tục lại bởi scheduler vào thời điểm xác định. Method wait() tương tự như (#5,#6) trong verilog.
Mã:
wait(delay_sc_time); // wait specified amount of time
- Method wait() có tham số, một số trong đó được liệt kê dưới đây:
  • wait(): Chờ đợi các sự kiện trong danh sách độ nhạy.
  • wait(int): Chờ đợi n sự kiện xảy ra, một trong các sự kiện nằm trong danh sách độ nhạy.
  • wait(event): Chờ cho sự kiện được đề cập dưới dạng tham số.
  • wait(double,sc_time_unit): Chờ đợi theo thời gian quy định.
  • wait(double,sc_time_unit, event): Chờ cho thời gian quy định hoặc sự kiện xảy ra.
- Ví dụ:
Mã:
void simple_process_ex::my_thread_process (void) {
wait (10, SC_NS);
std:: cout<< "Now at "<< sc_time_stamp() << std:: endl;
sc_time t_DELAY(2, SC_MS); // keyboard debounce time
t_DELAY *= 2;
std:: cout<< "Delaying "<< t_DELAY<< std:: endl;
wait(t_DELAY);
std:: cout << "Now at " << sc_time_stamp()
<< std:: endl;
}
- kết qua khi chạy:
upload_2016-8-4_10-40-51.png

2. sc_event()
- sc_event() là giống như sự kiện trong Verilog. Nó được sử dụng để đồng bộ process. Một ví dụ process có thể được kích hoạt hoặc bắt đầu lại khi có sự xuất hiện của sc_event. SC_event là một cái gì đó xảy ra ở một thời điểm cụ thể. SC_event không có giá trị và không có khoảng thời gian. SystemC sử dụng lớp sc_event để mô hình sự kiện. Lớp này cho phép khởi chạy hoặc kích hoạt các sự kiện bằng một method notification(thông báo). Sơ đồ dưới đây minh họa một sự kiện e_rdy “firing” tại ba điểm khác nhau. Lưu ý rằng không giống như một dạng sóng, các sự kiện không có độ rộng thời gian.
upload_2016-8-4_11-3-50.png

- Quy tắc: Để quan sát một sự kiện, người quan sát phải được giám sát được sự kiện đó. SystemC cho phép các process chờ đợi cho một sự kiện bằng cách sử dụng độ nhạy động hoặc tĩnh mà mình sẽ giới thiệu sau. Cú pháp để khai báo một sự kiện như sau:
Mã:
sc_event event_name1 [, event namei ]...;
- event_name.notify() là một hàm thành viên tạo ra một notification ngay lập tức. Bất kỳ các cá thể trong process có liên quan đến sự kiện này sẽ được thực hiện Runnable trước khi bộ điều khiển trả về từ hàm thông báo. Nó tương tự như -> event_name trong Verilog. Hàm notify() có thể được gọi với các thông số như dưới đây.
  • notify() :Immediate notification
  • notify(SC_ZERO_TIME) :Delta notification
  • notify(1, SC_NS) :Timed notification
- event_name.cancel() là một hàm thành viên nó sẽ xóa bất kỳ thông báo chưa xử lý cho sự kiện đó.
**** Ví dụ về sc_event() trong một chương trình SystemC:
Mã:
#include <systemc.h>

SC_MODULE (events) {
  sc_in<bool> clock;

  sc_event  e1;
  sc_event  e2;

  void do_test1() {
    while (true) {
      // Wait for posedge of clock
      wait();
      cout << "@" << sc_time_stamp() <<" Starting test"<<endl;
      // Wait for posedge of clock
      wait();
      cout << "@" << sc_time_stamp() <<" Triggering e1"<<endl;
      // Trigger event e1
      e1.notify(5,SC_NS);
      // Wait for posedge of clock
      wait();
      // Wait for event e2
      wait(e2);
      cout << "@" << sc_time_stamp() <<" Got Trigger e2"<<endl;
      // Wait for posedge of clock
      wait();
      cout<<"Terminating Simulation"<<endl;
      sc_stop(); // sc_stop triggers end of simulation
    }
  }

  void do_test2() {
    while (true) {
      // Wait for event e2
      wait(e1);
      cout << "@" << sc_time_stamp() <<" Got Trigger e1"<<endl;
      // Wait for 3 posedge of clock
      wait(3);
      cout << "@" << sc_time_stamp() <<" Triggering e2"<<endl;
      // Trigger event e2
      e2.notify();
    }
  }

  SC_CTOR(events) {
    SC_CTHREAD(do_test1,clock.pos());
    SC_CTHREAD(do_test2,clock.pos());
  }
};

int sc_main (int argc, char* argv[]) {
  sc_clock clock ("my_clock",1,0.5);

  events  object("events");
    object.clock (clock.signal());

  sc_start(0); // First time called will init schedular
  sc_start();  // Run the simulation till sc_stop is encountered
  return 0;// Terminate simulation
}
:
-- Kết quả khi chạy:
upload_2016-8-4_11-14-16.png