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.
- Method wait() có tham số, một số trong đó được liệt kê dưới đây:
- kết qua khi chạy:
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.
- 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:
- 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.
**** Ví dụ về sc_event() trong một chương trình SystemC:
:
-- Kết quả khi chạy:
- 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
- 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.
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;
}
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.
- 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 ]...;
- notify() :Immediate notification
- notify(SC_ZERO_TIME)
elta notification
- notify(1, SC_NS) :Timed notification
**** 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: