在 SystemC 中,時脈被當作一個特殊的物件處理,它就是 sc_clock 類別。
時鐘端口作為一個特殊的端口,如:
// 兩種方式等價在 SystemC2.0.1 中,sc_clock 一共有 6 個重載的建構函數,如:
sc_clock(sc_module_name name, const sc_time& period, double duty_cycle = 0.5,const sc_time& start_time = SC_ZERO_TIME, bool posedge_first = true);
定義實例:
- sc_clock clk2("clk2", 20, 0.5, 0, true);
另一種定義時鐘的方法:
sc_signal<bool> clock;
sc_initialize();
for (int i = 0; i < 1000; i++)
{
clock = 1;
sc_cycle(5);
clock = 0;
sc_cycle(5);
}
採用這種方法初始化時脈的好處是可以同時插入對其他訊號的初始化:
SystemC 採用基於整數的時間模型,系統時間採用一個 64 位元無符號整數來表示。
時間解析度是模擬系統能夠處理的時間的最小精度,比時間解析度更精細的時間將被四捨五入。
假設系統的時間解析度為 10ps,則 wait(33.667, SC_NS) 實際上等效於 wait(33.67, SC_NS)。
SystemC 預設時間解析度為 1ps,同時提供了 sc_set_time_resolution(double, sc_time_unit) 函數來修改系統的時間解析度。 如下面的程式碼將系統的時間解析度設定為 10ps:
sc_set_time_resolution(10, SC_PS);
SystemC 預設時間單位是 SC_NS,同時允許透過 sc_set_default_time_unit(double, sc_time_unit) 來修改trace的時間單位。 如下面的程式碼將時間單位設定為 100ps:
sc_set_default_time_unit(100, SC_PS);
SystemC 對時間解析度和時間單位的設定有以下的要求:
- 必須是 10 的冪
- 只能在仿真開始前設定
- 只能設定一次
- 時間單位必須大於等於時間分辨率
- 時間解析度必須在任何的非零的 sc_time 聲明之前設置
sc_clock clk1("clk1", 10);
沒有留言:
張貼留言