這篇文記錄一下自己在看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是一樣的。
留言列表