少し前にWaveDromというJSONで波形を表示するツールについて調査していたのだが、ある程度使いこなすことが出来るようになってきた。 今作っている自作RISC-V CPUの仕様書を書くために波形を書いているのだが、結構便利に使うことが出来ている。
例えば、以下のようなJSONファイルを書けば自動的にPNGとSVGを作ることが出来た。
{ "signal": [ { "name": "i_clk", "wave": "p................." }, [ "Request", { "name": "valid", "wave": "0.1.0..10........." }, { "name": "PA", "wave": "0.340..50.........", "data": "PA0 PA1 PA2" } ], [ "Store Buffer", [ "Entry[0]", { "name": "PA", "wave": "0..3..0...........", "data": "PA0", }, { "name": "state", "wave": "2..6782...........", "data": "INIT L1D RSP UPD INIT", "node": "...a.f................" }, ], [ "Enry[1]", { "name": "PA", "wave": "0...4..........0..", "data": "PA1" }, { "name": "state", "wave": "2...678.....6782..", "data": "INIT RD RSP REFILL RD RSP UPD INIT", "node": "....b.......d.g........" }, ], [ "Entry[2]", { "name": "PA", "wave": "0........5.0......", "data": "PA2" }, { "name": "state", "wave": "2........672......", "data": "INIT RD RSP INIT", "node": ".........c.H......" }, ], ], {}, [ "L1D Interface", [ "Read", { "name": "Read.Valid", "wave": "0..1..0..10.10....", "node": "...AB....C..D......" }, { "name": "PA", "wave": "0..340...50.40....", "data": "PA0 PA1 PA2 PA1" }, { "name": "Resp", "wave": "0...340..50.40....", "data": "HIT MISS HIT HIT HIT" }, ], [ "Write", { "name": "Write.Valid", "wave": "0....10.......10..", "node": ".....F........G..." }, { "name": "PA", "wave": "0....30.......40..", "data": "PA0 PA1 PA2 PA1 PA2" }, ], ], {}, [ "L1D Req", { "name": "Evict Line Hit", "wave": "0.........10......", "node": "..........h..........." }, { "name": "refill_done", "wave": "0..........10.10..", "node": "...........I..J......" } ], {} ], "edge": [ "a->A", "b->B", "c->C", "d->D", "e->E", "f->F", "g->G", "h~>H", "I~>d Refill Wakeup", "J~>e Refill Wakeup" ], "head": { "text": "Store Buffer Behavior", "tick": 0 }, "config": { "hscale": 1 } }
ポイントとしては、
[]
を使って階層的に波形を管理できる。node
とedge
を使って波形の間に矢印とコメントを出力することができる。hscale
へ波形の横幅を調整できる。ただし整数のみらしい。
というあたりを使いこなせば、十分に役に立つ気がしている。