2009年9月4日 星期五

DAFx @ Italy

I’ve just finished my poster presentation at the vanue. There were so many interesting guys coming with many interesting thoughts. I prepared my business cards and the papers which were proposed by 義崧 and 維城 for the audiences who need.

Because our paper includes the fields such as pitch detection, partials tracking, score alignment, and also synthesis, there are many people coming to ask me some questions. The most popular question is the octave note (or overtone) of the multiple pitch detecion. The tracking algorithm is also the well-liked topic.

I also got the name card from Keita (the supervisor of Center for Advanced Sound Technologies in YAMAHA Corp.) and Juhan Nam (Ph.D candidate in CCRAM). There are also some guys coming from IRCAM and even know 維城.

Finally, Perry Cook is a really interesting guy who may give you a whistle whenever your demostration is impressive !

2009年9月3日 星期四

GTKWave and VCD - 哲榮

2009/9/3
已經把OpenESL的GEF部分加好GtkWave了
選擇port是否要trace 只要點選connection
然後在屬性欄位更改Trace的選項(From_port_trace ,To_port_trace)
Trace的選項是一個下拉式選單,有兩個選項: Traced , Not Traced
如下圖:
























多加了一個按鈕來啟動GtkWave:









按下按鈕後:





















2009/8/30
GtkWave目前已經整進command line的部份
剩下GEF這邊目前打算在connection裡面多加個兩個屬性
TraceSrc
TraceDes
可是還有遇到connection無法連接的問題 還要再問一下學長

2009/6/1一
更新指令
tr [MODULE's NAME].[PORT_NAME] :追蹤指定的port
detr [MODULE's NAME].[PORT_NAME] : 刪除已追蹤的port

list顯示trace變更成顯示link的兩個port之追蹤狀態

















儲存trace資訊的xml改為只儲存要追蹤的port









追蹤變數的進度目前還沒弄好
ModelSim跟esl之間的連結 目前有電機系學長的資料
大致上已經知道SystemC跟verilog怎麼互通 但是還沒有實際測過



2009/5/1五
OpenESL加入gtkwave大致上已經弄好了

我多加了三個指令
trln [link_num] : 追蹤指定的link
detr [link_num] : 把已設為追蹤的link 改成不要追蹤
vcd : 把產生的vcd檔案用gtkwave打開

儲存link是否要追蹤的xml跟儲存project的xml分開 其格式如下










在輸入指令list會多顯示link是否要追蹤


















vcd指令開啟vcdfile




















2009/3/24二
1.
關於上周的[法三]
只要把它看作是普通的傳pointer進去建構子就可以了,不需要繼承 fp()
[法三]在main裡面產生vcd file 將此file pointer傳到module中 :
int sc_main(int argc, char* argv[])
{
sc_trace_file *fp;
fp=sc_create_vcd_trace_file("wave");

// Instantiate DUT, pass on filepointer during dff instantiation
dff DUT("dff",fp);

sc_close_vcd_trace_file(fp);
}

SC_MODULE(dff) {
sc_in clk;
sc_out dout;

dff(sc_module_name _n, sc_trace_file* fp) : sc_module(_n){

sc_trace(fp,clk,"clk");
sc_trace(fp,dout,"dout");
}
};

2.
我後來發現說sc_trace();也可以用來trace一般的變數 比如說:int bool sc_int...
而且sc_trace() 必須在模擬之前就預先給定要追蹤的變數 也就是在sc_start()之前就要先設定好
所以我目前想使用以下方法來追蹤 interface裡的傳遞資料的變數

對於每一個在interface裡面想要追蹤的變數
我都新增一個共用變數 然後在每個interface的function裡面把想追蹤的變數assign給對應的共用變數
這樣我就可以只追蹤共用變數的變動狀況 也就可以在sc_start()之前先設定好要追蹤的變數

例如:
global.h :
extern sc_int<8> t_data; //每個module 包括main都可以看到的變數

global.cpp :
sc_int<8> t_data;

main.cpp :
int sc_main(int argc, char* argv[])
{
sc_trace_file *fp;
fp=sc_create_vcd_trace_file("wave");

sc_trace(fp,t_data,"t_data");
...............

sc_start();
sc_close_vcd_trace_file(fp);
}

bus.cpp :
........
//bus的interface function
void test_bus::write(unsigned addr, sc_int<8> *data,unsigned int priority)
{
t_data = data->to_int();
..............
}
........

小弟愚昧,目前只想到這樣作,之後再看看有沒有更聰明的方法XD



2009/3/17 二
有找到關於systemc dump vcd的資料了

以下是範例

[法一]在sc_main()裡面直接抓sc_signal :
int sc_main(int argc, char* argv[])
{
// signal declaration
sc_clock clk("clk", 1, SC_SEC, 0.5);
sc_signal ss;
sc_signal mm;
sc_signal hh;

// module declaration

// signal connection

//file trace
sc_trace_file *tf;
tf = sc_create_vcd_trace_file("trace");
sc_trace(tf,ss,"second");
sc_trace(tf,mm,"minute");
sc_trace(tf,hh,"hour");

// run simulation
sc_start(3700, SC_SEC);
sc_close_vcd_trace_file(tf);

return 0;
}


[法二]在各module中 :
SC_MODULE(dff) {
sc_in
clk;
sc_out
dout;

// Declare Local VCD filepointer
sc_trace_file *fp;

// Constructor
SC_CTOR(dff) {

fp=sc_create_vcd_trace_file("wave");

sc_trace(fp,clk,"dff.clk");
sc_trace(fp,dout,"dff.dout");
}

~dff() {
sc_close_vcd_trace_file(fp);
}
};

[法三]在main裡面產生vcd file 將此file pointer傳到module中 :
(可是這個我測了似乎不行,還要在看一下哪邊用錯)
int sc_main(int argc, char* argv[])
{
sc_trace_file *fp;
fp=sc_create_vcd_trace_file("wave");

// Instantiate DUT, pass on filepointer during dff instantiation
dff DUT("dff",fp);

sc_close_vcd_trace_file(fp);
}

SC_MODULE(dff) {
sc_in clk;
sc_out dout;

sc_trace_file *fp;

dff(sc_module_name _n, sc_trace_file* _fp) : sc_module(_n), fp(_fp) {

sc_trace(fp,clk,"clk");
sc_trace(fp,dout,"dout");
}
};

粉紅色的部分就是dump vcd file的方法
可是以上只能trace sc_in<> , sc_out<> , sc_signal<>的資料
如果是使用interface的 sc_port<> 我還要找看看有沒有可用的函式



2009/3/14 六
之前一直沒有PO進度,是因為IEEE的資料要付費 我抓不下來
後來才知道用學校當代理伺服器就可以抓了!!

1. GTKWave :

GTKWave 是一個用來檢測說模擬的output 有沒有錯誤的 digital waveform viewer
它可以讀取VCD的檔案 我先做windows的版本

他的網頁在此
http://gtkwave.sourceforge.net/

win32版程式取得
http://www.dspia.com/gtkwave.html

把執行檔和dll檔抓下來後 放在同一個資料夾就可以了

執行方式:
命令提示字元 移到目的資料夾 輸入 gtkwave yourfile.vcd
即可顯示yourfile.vcd的波形圖

2. Value Change Dump (VCD)

contains information about value changes on selected variables in the
design stored by value change dump system tasks

它是verilog跑完模擬之後,用來記錄每個variables數值變化的一種格式



VCD有兩種type
a) Four state: to represent variable changes in 0, 1, x, and z with no strength information.
b) Extended: to represent variable changes in all states and strength information.

如果要用VCD來記錄Open ESL的訊號值 應該是要用Extended

關於VCD詳細的資料要到IEEE官網下載PDF,目前我還在看

VCD的詳細資料載點:
http://ieeexplore.ieee.org/xpl/standardstoc.jsp?isnumber=20656&isYear=2001

2009年8月31日 星期一

禮拜二打羽球

禮拜二打羽球, 下午四點, 中愛羽球館
沒球拍, 小新跟巴菲特會借你

HDL Simulator with ESL Platform - 哲榮

----------------------------
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
可以成功跑出模擬