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

19 則留言:

匿名 提到...

SystemC 執行時,不是就可以dump出VCD格式的檔案了?
還是我記錯了? @@a

long 提到...

@.@
喔那我再找看看資料
謝謝巴肥特帥哥

Soar 提到...

RPA這麼久還不知道,
你一定很少用圖書館的資源! XD
我可以偷偷爆料嗎?

SCREAMLab 提到...

照理應該有這個function, 因為SystemC可以做到cycle-accurate以及pin-accurate的, 而且VCD格式行之有年, 身為HDL的接班人, SystemC應該可以輸出VCD格式的資料.

逼逼逼 提到...

印象中之前好像有玩過,SystemC應該可以dump VCD格式。
systemC function: sc_create_vcd_trace_file,可再加入你要看的signal,相關function你再自己找看看。

SCREAMLab 提到...

那麼SystemC可以支援lxt格式嗎?

逼逼逼 提到...

不確定,我稍微查了一下,似乎沒有。
要用的話要請人去做更detail的搜尋吧

long 提到...

我有找到systemc dump vcd的方法了
已更新內容~

SCREAMLab 提到...

謝謝!

我舉兩個會需要dump vcd的地方.

1. 在module裡, 要是要看某一個變數(好吧! 假裝是暫存器),

2. 在Interface/channel裡, 這個部分假如是用Virtual Platform提供的,

那麼怎麼加這段codes把資料dump出來呢?
好吧! 我的真正用意是:

前一種是在codegen裡自動幫user加, 後一者是在user 呼叫我們提供的介面時, 依據他的意思讓他dump他要看的訊號.

oh! 跟ruru說, 我還在等他的文章. 請他直接用學校的email去ocp網站註冊就行, 要不然用我的也OK.

long 提到...

我知道了
我會轉告魯魯
謝謝大家^^

Unknown 提到...

我有收到啦 今天也去找老師
有更換新的主題
所以可能晚點吧

SCREAMLab 提到...

看起來不錯, 可以跟Gary一起來demo一下嗎?

long 提到...

喔可以阿!
什麼時候要過去demo呢?

SCREAMLab 提到...

我希望是看port的information, 而不是link上. 假如可以, 可以看module裡的資訊.

請整合到Eclipse環境裡, 我想需要小幅修改kernel, GEF, wizard,..., 當然user manu要修一下.

我們五月底announce, 可以嗎?

SCREAMLab 提到...

請問GtkWave是否已經整進OpenESL了呢?

SCREAMLab 提到...

Thx, 可以在OPenSource那邊把這資訊更新嗎?

SCREAMLab 提到...

I have not seen the update in the open source blog!!

I think I need to check the document and let me do that. Please sedn to me.

匿名 提到...

因工作需要,請問可否將win32版GTKWave 3.3.0的執行檔寄給我,官網已無法下載。感謝!

mail:free_city@pchome.com.tw

long 提到...

To 老師
我現在才發現老師的回應>< 抱歉
因為之前還有些地方在修
所以就文件就沒有一起update
我再另外拿傳給你看一下

To somebody
我試了還可以下載
link