2024年3月14日 星期四

*******SystemC--時鐘模型

在 SystemC 中,時脈被當作一個特殊的物件處理,它就是 sc_clock 類別。


時鐘端口作為一個特殊的端口,如:

  • sc_in_clk clk1;
  • sc_in<bool> clk1;
// 兩種方式等價

在 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 clk1("clk1", 20, 0.5 5, true);
    upload successful
    upload successful

  • sc_clock clk2("clk2", 20, 0.5, 0, true);
upload successful


另一種定義時鐘的方法:
sc_signal<bool> clock;
sc_initialize();
for (int i = 0; i < 1000; i++)
{
    clock = 1;
    sc_cycle(5);
    clock = 0;
    sc_cycle(5);
}

採用這種方法初始化時脈的好處是可以同時插入對其他訊號的初始化:
clock = 1;
sc_cycle(2.5);
rst = 1;
sc_cycle(2.5);

clock = 0;
sc_cycle(5);

clock = 1;
sc_cycle(2.5);
rst = 0;
sc_cycle(2.5);

clock = 0;
sc_cycle(5);

等價於:

sc_clock clk("main clock", 10, 0.5);
sc_start(10000);





時間模型


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 聲明之前設置
在時間單位設定為 100ps 的情況下,下面的 clk1 的週期為 100*100ps=1ns:
sc_clock clk1("clk1", 10);

沒有留言:

張貼留言

*******【WSL教學】在Windows上執行Linux + VSCode

安裝WSL: 以管理員身份運行PowerShell來開啟此功能。要做到這一點,您可以在Windows搜索欄中輸入“PowerShell”,然後右鍵單擊Windows PowerShell,選擇“以管理員身份運行”。 在PowerShell中,輸入以下指令以安裝WSL。 wsl -...