systemC的同步時序建模
阿新 • • 發佈:2018-07-06
默認 getc type class 產生 const fine 沒有 cpp systemC的時序邏輯建模
systemc的時序邏輯方法分為兩種:
1) 靜態時序邏輯:
使用關鍵字sensitive,sensitive_pos , sensitive_neg :使得觸發為值觸發,正跳邊沿觸發,負跳變沿觸發
這種觸發方式為靜態觸發方式。
2) 動態時序邏輯:
在掛起的線程函數的wait語句中使用。
條件為port.posedge_event() port.negedge_event() port.value_changed_event() ,
並且可以結合邏輯操作符和時間表示復雜的邏輯關系。
一般在不復雜的時序邏輯中,都使用靜態時序邏輯,並且同組合邏輯相組合。
下面是一個關於檢測序列的sc程序,只有當檢測到3個連續的1時,流水檢測才輸出為1:
systemc的時序邏輯方法分為兩種:
1) 靜態時序邏輯:
使用關鍵字sensitive,sensitive_pos , sensitive_neg :使得觸發為值觸發,正跳邊沿觸發,負跳變沿觸發
這種觸發方式為靜態觸發方式。
2) 動態時序邏輯:
在掛起的線程函數的wait語句中使用。
條件為port.posedge_event() port.negedge_event() port.value_changed_event() ,
並且可以結合邏輯操作符和時間表示復雜的邏輯關系。
一般在不復雜的時序邏輯中,都使用靜態時序邏輯,並且同組合邏輯相組合。
下面是一個關於檢測序列的sc程序,只有當檢測到3個連續的1時,流水檢測才輸出為1:
#include "base.h" #ifndef STREAMCHECK #define STREAMCHECK const int size = 3 ; SC_MODULE(streamcheck){ sc_in<bool >stream_in , clk ; sc_out<bool> check ; sc_signal<sc_uint<size> > reg ; void move(); void getcheck(); SC_CTOR(streamcheck){ reg = 0 ; SC_METHOD(move); sensitive_pos<<clk; // sequential logic , triggered by the clk !!! sc_METHOD(check); sensitive<<reg ; // combinational logic , determine by the reg . // Hold one thing ! the sc_signal is equal to the reg type in the verilog hdl . } }; #endif
#include "streamcheck.h" void streamcheck::move(){ sc_uint<size> reg_temp = reg.read(); reg_temp = (reg_temp>>1,stream_in.read()); reg = reg_temp ; } void streamcheck::getcheck(){ sc_uint<size> temp = reg.read(); check = temp[0] & temp[1] & temp[2] ; // when checked the instream all are "1" , get the check port 1 !!! }
在這種同步的時序下,可以添加只由端口跳變觸發的進程函數來達到異步的目的。
同時註意一點:在進程或線程函數的條件分支沒有完全覆蓋時會產生不必要的鎖存器,這時需要通過對其取默認值的方式進行解決。
systemC的同步時序建模