----------------------------
2009 . 8 . 30
----------------------------
之前試著把這整個放入到SystemC library提供的simplebus範例裡面
master用nonblocking的方式傳data給負責跟ModelSim溝通的module
可以正常跑
現在要把它放入宗胤學長寫得TLM2.0.1 SimpleMultiCoreBus
然後作個跑DCT的範例
目前還在看TLM2.0.1的傳輸
----------------------------
2009 . 8 . 18
----------------------------
因為先前的架構在client端必須等待pipe傳輸完畢後才繼續動作 擔心會影響模擬的速度
所以就想說在client端多一條thread來跑pipe,然後把SystemC module想丟的資料暫存到linking list
之後thread在逐一從linking list上讀取並用pipe傳送
Server端也一樣用一條thread跑pipe,把收到資料先暫存到linking list上,然後module需要資料時再自行讀取
但是老師提到說,由於SystemC 的kernel沒有multithread,所以這樣可能還是會影響模擬速度
我目前還感覺不太出來速度上有沒有比較快,可是改成這樣之後有個優點是
ModelSim的module收到的每一筆data,間隔的時間比較短,都可以控制在下一個clock就能收到下一筆資料,因為data都暫存在linking list上,所以只要pipe收的速度夠快,每筆data進入verilog module的時間就可以控制為每個clock都收到一筆data
原先的架構 - verilog module收到的每筆資料時間間隔比較大 :
目前的架構 - verliog module能在每一個clock收到一筆:
----------------------------
2009 . 8 . 14
----------------------------
上次那個波形圖只有收到0和11的值,其實是因為我直接按Zoom full
然後中間那些值都疊在一起看起來像沒有值.........抱歉是我呆了........
原圖一直Zoom in後就可以看到那些值了:
後來才發現說只會掉一兩個值,然後原因是我pipe部份的bug,當client偵測到server正在忙碌或尚未有server在等待client時,整個client pipe要關掉重連,不然會有錯誤
SystemC module裡面要確定上一筆資料送出後才送下一筆,不然還是會有data沒收到的情形
這邊我寫成在Server收到資料後就先把pipe鎖起來,等到module送出data後,再將pipe解開
目前已經可以正常傳資料並顯示波形圖
----------------------------
2009 . 8 . 11
----------------------------
為了要測試OpenESL和ModelSim之間的連接 , 做了以下的測試
在ModelSim裡面跑一個SystemC module與Verilog module的System(簡稱MS_system)
MS_system沿用7.17號的架構,並在main_sysc.cpp裡面加入 win32的 thread來執行pipe,
以便於跟另外一個SystemC module組成的系統(簡稱SysC_system)溝通
大致上整個的架構圖如下:
我原先是希望SysC_system裡的fsm module一直丟int的data給SysC_to_MS module
然後SysC_to_MS module透過pipe將data送給MS_system , 並由MS_system的main_sysc.cpp接收
PIPE分成Server端和Client端 , 這邊我把SysC_system裡的SysC_to_MS module視為Client端
MS_system裡的main_sysc.cpp視為Server端
Server端寫在thread中 , 一直block住等待Client端的連接 , 一旦有Client連接上 , 並立即接收資料
然後將接收的資料丟給load.v
Client端原本我是寫成當有資料要傳遞時 , 就產生一個thread來傳資料 , 傳完後此thread就關閉
然後因為怕說會有因為等待Server接收的時間 , 造成傳送的順序打亂的情形 , 我加入了Semaphore在 Client端控制 , 但是順序一樣還是亂的 , 後來發現說Semaphore只能確保一次只有一個thread進行傳送 , 不能確保thread的傳送順序
所以後來就把thread和Semaphore拿掉,變成Client端的整個系統要等待PIPE傳輸完資料後才繼續執行
PIPE目前我寫成一次只傳一筆的資料 , 目前只是測試 , 之後如果有影響執行速度的話會在改成
累積多筆data再一起傳送
[目前遇到的問題是]
MS_system裡負責跑PIPE Server的thread能夠正常的接收到Client傳送的資料
我是寫成當Server接收到一筆資料就立刻丟給跟load.v相連的port
然後load.v在clk的posedge時接收 , 進行處理後在丟給接下去的module
但是波形圖跑出來卻實際上在MS_system裡面傳送的只有部份的data
也就是說 Server接收到每一筆資料 , 並丟給verilog module 但是verilog module卻沒有接收到完整的資料
如下圖:
跑PIPE的thread確實接收到每一筆資料 1~11
波形圖跑出來卻只有收到兩個 0和11
我猜測 應該是Server傳送給load.v的速度太快 導致它來不存取
我有試著用Sleep去卡Client端的傳送速度 發現說有比較改善 load.v有收到較多的資料
所以可能會看看加入一個port來判斷說load.v確實接收到Server的資料後才允許Server繼續丟下一筆來自client的資料
----------------------------
2009 . 7 . 17
----------------------------
補充一下測試的方式
連接的架構如下:
cclk使用SystemC產生的clock
main_sysc.cpp用finite state machine不斷的把值從aadder送出去
然後load.v單純接收 再丟給decrease.v
decrease.v接收到資料後 把值減1 將結果存在 dec
跑出來的波形圖如下:
找到 modelsim 6.3 g
modelsim裡面使用的gcc compiler版本 : modelsim-gcc-3.3.1-mingw32.zip
(安裝方法:直接解壓縮把資料夾丟入modelsim的安裝路徑即可)
單純測試在modelsim中連接verilog module和SystemC module
可以成功跑出模擬