# 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;
}
}
```