VCDファイルを階層ごとに修正する
SystemCで信号波形をダンプする際には、VCD形式で出力することが多いと思います。
SystemCのダンプ形式だと、「階層.信号」といった感じでフラットに出力されてしまうのでどうしても波形ビューワーで見ると、見づらいかと思います。
そこで、こんなものがあります。
Manipulate the Hierarchy of VCDs generated by ASI (OSCI) PoC SystemC Simulator
ダウンロード&ビルド
$> git clone git://github.com/yTakatsukasa/vcd_hierarchy_manipulator.git $> cd vcd_hierarchy_manipulator/ $> make
これで、「vcd_hier_manip.x」が生成されると思います。
実際に使ってみる。
予め用意していた「systemc.vcd」を試してみました。
$> vcd_hier_manip.x systemc.vcd --output output.vcd
オリジナルとの差分がこちらになります。
--- systemc.vcd 2013-03-15 09:42:38.523658600 +0900 +++ output.vcd 2013-05-01 13:40:59.340473416 +0900 @@ -10,35 +10,40 @@ 1 ps $end -$scope module SystemC $end -$var wire 1 aaa utop.w_clk $end -$var wire 1 aab utop.w_xrst $end -$var wire 4 aac utop.w_addr [3:0] $end -$var wire 32 aad utop.w_wdata [31:0] $end -$var wire 1 aae utop.w_ce $end -$var wire 1 aaf utop.w_we $end -$var wire 32 aag utop.w_rdata [31:0] $end -$var wire 1 aah utop.uTB.we $end -$var wire 1 aai utop.uTB.ce $end -$var wire 32 aaj utop.uTB.wdata [31:0] $end -$var wire 4 aak utop.uTB.addr [3:0] $end -$var wire 1 aal utop.uTB.xrst $end -$var wire 1 aam utop.uTB.clk $end -$var wire 32 aan utop.uTB.rdata [31:0] $end -$var wire 32 aao utop.uRAM.rdata [31:0] $end -$var wire 1 aap utop.uRAM.we $end -$var wire 1 aaq utop.uRAM.ce $end -$var wire 32 aar utop.uRAM.wdata [31:0] $end -$var wire 4 aas utop.uRAM.addr [3:0] $end -$var wire 1 aat utop.uRAM.xrst $end -$var wire 1 aau utop.uRAM.clk $end -$upscope $end -$enddefinitions $end + $scope module SystemC $end + $scope module utop $end + $var wire 4 aac w_addr [3:0] $end + $var wire 1 aae w_ce $end + $var wire 1 aaa w_clk $end + $var wire 32 aag w_rdata [31:0] $end + $var wire 32 aad w_wdata [31:0] $end + $var wire 1 aaf w_we $end + $var wire 1 aab w_xrst $end + $scope module uRAM $end + $var wire 4 aas addr [3:0] $end + $var wire 1 aaq ce $end + $var wire 1 aau clk $end + $var wire 32 aao rdata [31:0] $end + $var wire 32 aar wdata [31:0] $end + $var wire 1 aap we $end + $var wire 1 aat xrst $end + $upscope $end + $scope module uTB $end + $var wire 4 aak addr [3:0] $end + $var wire 1 aai ce $end + $var wire 1 aam clk $end + $var wire 32 aan rdata [31:0] $end + $var wire 32 aaj wdata [31:0] $end + $var wire 1 aah we $end + $var wire 1 aal xrst $end + $upscope $end + $upscope $end + $upscope $end +$enddefinitions $end $comment All initial values are dumped below at time 0 sec = 0 timescale units. $end - $dumpvars 0aaa 0aab
確かに階層化されてますね。
これは便利ですね!!!
unite:bookmarkを使って Vimfilerをもっと快適に使う
この記事は Vim Advent Calendar 2012の218日目の記事です。
217日目は @deris0126 さんによる
「NeoBundleの相対パスからVim pluginのURLをブラウザで開く」でした。
さて、本日は自分が使って便利だなって思ったことを書いてます。
(Vimfilerを最近真剣に使い始めたばかりです。)
気軽に VACにエントリーしても良いって聞きました!!!
あと完走まで147日?
結果
先に結果だけ書いときます。
「bookmarkを利用することで、Vimfilerの移動がもっとスムーズになった!」
ただそれだけのこと。
unite.vim bookmark
unite.vim に bookmark機能があります。
ファイルやディレクトリに「マーク」をつけとくイメージです。
.oO(オススメできる helpがなかった・・・)
:Unite bookmark
ってやると、bookmarkされた一覧が表示されます。
.oO(あっ!ここで fileなのか directoryなのか表示欲しいかも)
bookmarkの登録は
:UniteBookmarkAdd
とか、Vimfiler上だと、「action:bookmark」で登録できます。
実践
- Vimfiler開く
- bookmark一覧開く
- 選択して「Enter」キーで移動
手順3では、defaultアクションを使用しています。
「directory」の defaultアクションは「narrow」になっているので、
設定を変更います。(.vimrcなどに追記)
autocmd FileType vimfiler call unite#custom_default_action('directory', 'lcd') " もしくは autocmd FileType vimfiler call unite#custom_default_action('directory', 'cd')
※ autocmdは個人の趣味で。
改めて、
- Vimfiler開く
:VimFiler
- bookmark一覧開く
:Unite bookmark
- 選択して「Enter」キーで移動
まぁ簡単!
もちろん、わざわざ入力するのは面倒くさい場合はショートカットキーを作りましょう。
まとめ
bookmarkを利用することで、Vimfilerの移動がもっとスムーズになった!
最後に
「cd」か「lcd」かは選びたい時があるので、早く欲しいかも。
明日の Vim Advent Calendar 2012は @daisuzuさんです。
追記(2013.7.6-9:20)
Vim Advent Calendar 2012 も 長く続けば色々起きるんですね。
本日
子ども産まれましたぁぁぁ!!!
Vimmerにそだ・・・
virtual interface paramter記述
引数にinterfaceで思い出したのですが、interfaceにparameter持たせた時に 仮引数の宣言の仕方がさっぱりわからなかった記憶が。
ってなことだったので、試してみました。
interface if_hoge#(parameter BW = 8)(); logic [BW-1:0] data; endinterface : if_hoge class fuga; virtual if_hoge#(9) vif; function void assign_vi(virtual if_hoge#(9) vi); vif = vi; endfunction task write(int data); vif.data = data; endtask function int read(); read = vif.data; endfunction endclass : fuga module testbench (); if_hoge#(9) if_test(); fuga utest = new; initial begin utest.assign_vi(if_test); if_test.data = 'hff; #100; $display("if_test.data = %0d", if_test.data); #100; $display("utest.vif.data = %0d", utest.vif.data); #100; $display("utest.read data = %0d", utest.read()); utest.write('h1ff); #100; $display("if_test.data = %0d", if_test.data); #100; $display("utest.vif.data = %0d", utest.vif.data); #100; $display("utest.read data = %0d", utest.read()); $finish(); end endmodule: testbench
- 実行結果
# if_test.data = 255 # utest.vif.data = 255 # utest.read data = 255 # if_test.data = 511 # utest.vif.data = 511 # utest.read data = 511
もちろんパラメータ(#(9))を書かなければデフォルト値(8)が入ります。
しかし、これだとパラメータ(BW)を設定する箇所が非常に多いですね。(3箇所)
たぶん、1箇所にまとめることが出来ると思いますのでそこはケース・バイ・ケースで。
固定小数点型において、動的に整数幅を変える
SystemC Forumにて、
How to change the word length of "sc_fix" dynamically? Any examples?
高位合成(RTLへの実装)とかを考えると、どうしてもデータ幅(bit幅)を意識します。
予め bit幅が決まりきっている場合だと問題ないかもしれませんが、
bit幅を見積もる場合だと何回もシミュレーションを行い確認する必要があります。
もしかしたら、スレッドを立てた人はそういったことをやりたいのかもしれません。
さて、その中で、sc_context_switch が出てきます。
詳細は LRMの 7.2.3章、7.11章の部分です。
sc_context_switch
固定小数点型 ⇔ 浮動小数点型に切り替えられます。
「SC_OFF」- flotingですね。
sc_fxtype_params
defaultのパラメータを変更出来るみたい。
ココら辺って闇の領域ですよね・・・
せっかくなので、記述してみました。
#include <systemc.h> int sc_main( int argc, char* argv[] ) { sc_fxtype_params fxt(32,16); sc_fxtype_context fcxt(fxt); sc_fix A,B,res; // wl = 32, iwl = 16 A = 10.0; B = 0.1; res = A * B; // res = .999908447265625 cout << "A = " ; A.print(); cout << ", "; cout << "B = " ; B.print(); cout << ", "; cout << "res = " ; res.print(); cout << endl; sc_fxtype_params fxt2(16,8); sc_fxtype_context fcxt2(fxt2); sc_fix C,D; // wl = 16, iwl = 8 C = 10.0; D = 0.1; res = C * D; // res = .9765625 cout << "C = " ; C.print(); cout << ", "; cout << "D = " ; D.print(); cout << ", "; cout << "res = " ; res.print(); cout << endl; return 0; }
- 実行結果
A = 10, B = .0999908447265625, res = .999908447265625 C = 10, D = .09765625, res = .9765625
といった感じで、bit幅を色々と変えれるみたいです。
うーん。。。闇っぽい。
最初にあった bit幅を選定するですが、GDB使ってやることもできます。
見積もる変数の数が多くなるとなかなか厳しいですが。
$countones で bitランダム
きっかけはこちらの Verification Academyにて
このスレッドにCVCの方が回答したものが、こちらになります。
Smart constraint modeling in SystemVerilog
class c; rand bit[31:0] vec_1; constraint cst_max_2_hot_bits { $countones(vec_1) inside {1,2}; }
この記述すごく簡素ですよね。
$countones 使うとこんなに簡単に出来るとは。
one hotだと $onehot を使えば良いと思います。