close

這篇文記錄一下自己在看EAN1這份文件的Chap. 8時的一些心得。

Chap. 8中主要是示範如何實作一個有時間資訊的"loosely timed" model.

 

目前認為loosely timed的model,就是在每次做一次data的transaction前wait一段時間

這段時間就是由designer來設定,在這個範例裡有下面3種不同的設定:

. wait一段時間,讓目前的模擬時間和ISS所執行的時間同步。

. wait一個predefined的時間,可用在已知某個module會跑多久的情況下,

  例如已經知道AES加密會跑10個cycle,則讓AES這個module在傳輸資料之前先wait 10個cycle的時間。

. wait一個算出來的時間,其實跟上面一點很像,用在如果你知道一個channel的bit rate是多少,

  那麼你就可以算出要傳一筆多少bit的資料會花多少時間。

 

Cycle accurate model就是實際一個cycle一個cycle的執行,不同module之間的溝通必須cycle-by-cycle銜接好,

而loosely-timed model則不用那麼仔細,只要記錄好每個動作或是資料的transaction之間花了多少時間即可。

 

以下分別就不同module如何去model時間做說明:

1. Or1ksimSyncSC module:

    . or1ksim_set_time_point(), 這個function是用來記下目前這個時間點ISS的模擬時間,

      由ISS模擬執行的# of cycles乘上configuration file裡的clkcycle得到。

  (如果去改configuration file裡的clkcycle的值會發現跑範例程式report出的時間會有變,

   # of cycles應該是由所執行的指令數來推的)

    . or1ksim_get_tim_period(), 這個function可以傳回傳上次執行or1ksim_set_time_point()後,

  到現在經過多少時間模擬時間。

    . 在constructor裡加上or1ksim_set_time_point()可以用來初始化模擬一開始的時間。

    . 在doTrans()這個function裡加上下面這一行

          wait( sc_core::sc_time( or1ksim_get_time_period(), sc_core::SC_SEC ));

      可以讓目前SystemC的模擬時間再度跟ISS的執行時間同步。

      在執行這一行之前SystemC的模擬是看它執行的function裡wait了多少時間,

      在SystemC在執行這些function時,ISS還是一直在執行指令(時間一直過),

  這一行可以讓SystemC和ISS的執行時間再度同步。

 

2. UartSyncSC module:

    . 在busThread()這個function裡有wait(charDelay),這就是去看它要傳的資料量在目前的bit rate時,

  要花多少時間,用"totBits/baudRate"來算。

    . 在busReadWrite()裡,有wait UART_READ_NS或UART_WRITE_NS,這些就是預先定義好的時間。

 

3. TermSyncSC module:

    . 在xtermThread()這個function中有wait(charDelay),這個和2.1是一樣的。

arrow
arrow
    全站熱搜

    jylai1982 發表在 痞客邦 留言(0) 人氣()