# SystemC ## 基本process 在SystemC中,有三種主要的進程類型,每種類型適用於不同的場景: ### SC_METHOD: 表示方法進程,是SystemC中最簡單的進程類型。它在敏感事件發生時觸發執行,執行結束後即停止,不能使用`wait()`語句。 * 特點: 1. 執行時間短,不能有等待操作(`wait()`語句)。 2. 對象在每次敏感事件觸發時執行。 * 適用場景: 適用於組合邏輯、簡單的行為建模,通常用於描述不會涉及複雜時序行為的部分。 ```cpp SC_METHOD(sram_prc); sensitive << clk.pos(); ``` --- ### SC_CTHREAD: 表示時鐘線程進程,是由clock驅動的進程,可以在進程內部使用`wait()`語句以便進行suspend和rresume操作。 #### 特點: 1. 必須包含一個`wait()`語句來同步時鐘(即等待一個cycle)。 2. 可以有多個`wait()`語句,用於描述複雜的時序行為。 3. 可以進行掛起和恢復操作,適用於需要進行循環和複雜控制的場景。 #### suspend/resume: 1. Suspend: 定義:指進程在某個點暫停執行,進入等待狀態,直到某個條件或事件發生。 在SC_CTHREAD中:suspend是通過wait()語句實現的。當進程執行到wait()語句時,進程會暫停,等待下一個時鐘周期或者某個事件發生。 2. Resume: 定義:指進程從等待狀態中恢復執行,從suspend的位置繼續執行後續的代碼。 在SC_CTHREAD中:當等待的條件滿足(例如下一個時鐘周期到來)時,進程會從上一次掛起的位置繼續執行,這就是恢復操作 ```cpp //suspend, resume example SC_CTHREAD(example_process, clk.pos()); void example_process() { while (true) { // 第一個時鐘周期的操作 do_something(); wait(); // suspend,等待下一個時鐘周期 // 第二個時鐘周期的操作 do_something_else(); wait(); // suspend,等待下一個時鐘周期 // 第三個時鐘周期的操作 do_another_thing(); wait(); // suspend,等待下一個時鐘周期 } } ``` #### 適用場景: 適用於時鐘同步的過程、描述複雜時序行為,如寄存器傳輸級(RTL)設計。 ```cpp SC_CTHREAD(process, clk.pos()); ``` --- ### SC_THREAD: 表示線程進程,與SC_METHOD類似,但SC_THREAD可以在進程內部使用`wait()`語句,從而允許進程suspend or resume。 #### 特點: 1. 可以使用`wait()`語句,但不需要與時鐘同步。 2. 適合描述複雜的時序邏輯和行為建模。 3. 比SC_CTHREAD更靈活,因為它不強制要求與時鐘同步。 #### 適用場景: 適用於複雜的控制邏輯、模擬真實硬體行為、需要進行suspend/resume的場景。 ```cpp SC_THREAD(process); sensitive << clk.pos(); ``` --- ## 總結: **SC_METHOD**:適用組合邏輯。 **SC_CTHREAD**:時鐘同步,複雜時序,適用於RTL design。 **SC_THREAD**:較靈活,適用於複雜控制邏輯。 ## Constructor/Destructor function ### Constructor SystemC的建構函式為SC_CTOR,必須與module的名字相同。 ```cpp SC_CTOR(sram8x256){ men=new sc_uint<8>[256]; for (int i=0;i<256;i++) mem[i]=0; SC_METHOD(sram_prc); sensitive<<clk.pos();//對posede clk sensitive }; ``` ### Destructor 結束時執行清理工作。 在C++和SystemC中,析構函式以~符號開頭。 ```cpp ~sram8x256(){ if(mem){ delete mem; mem=0; } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up