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なのか表示欲しいかも)

f:id:kocha2012:20130705133717p:plain

bookmarkの登録は

:UniteBookmarkAdd

とか、Vimfiler上だと、「action:bookmark」で登録できます。

実践

  1. Vimfiler開く
  2. bookmark一覧開く
  3. 選択して「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にて

"hot bit" randomization

このスレッドに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 を使えば良いと思います。