信号の変化を記録した波形
波形は、信号が時間とともにどう変わったかを記録したものです。回路が間違えた瞬間を見つけるのに、波形を読む力が一番役に立ちます。
VCD という波形ファイルは、人が読めるただのテキストです。読み方を覚えれば、特別な道具がなくても調べられます。
このレッスンのゴール
メモ
波形ファイルを読んで、クロックごとに何が起きたかを言える。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 波形 | 信号の値が、時間とともに変わる様子 | |
| VCD | 信号の変化を、テキストで記録するファイル | |
| 識別子 | VCD の中で、信号を指す短い記号 | ! |
| 時刻 | #のあとの数。変化が起きた時間 | |
| vcd2txt | 波形を、文字の表にする、ラボの道具 |
学生が入力するセルは、このプレビューでは空白です。
VCD はテキストのファイル
まず、波形をつくります。ラボの counter_tb.v は、すべての信号を out/counter.vcd に記録します。
次に、そのファイルを sed で読みます。sed は、enddefinitions の行から先を表示します。説明の部分を飛ばして、変化の部分だけを見られます。
ラボのフォルダに入る
cd ~/hdlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
カウンターを準備する
iverilog -o /tmp/counter counter.v counter_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
動かして波形を作る
vvp /tmp/counterここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
変化の部分を読む
sed -n '/enddefinitions/,$p' out/counter.vcd | head -n 14ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
信号の宣言を探す
grep '[$]var' out/counter.vcdここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
VCD の行の読み方
| 行 | 意味 |
|---|---|
| $var wire 4 ! q [3:0] $end | 識別子 ! は、4ビットの信号 q |
| #5 | 時刻が5になった |
| 1" | 識別子 " の信号が、1になった |
| b0 ! | 識別子 ! の4ビットの信号が、0になった |
| bx ! | 識別子 ! の信号が、まだ決まっていない |
学生が入力するセルは、このプレビューでは空白です。
短い VCD の例を読む
$var wire 4 ! q [3:0] $end
$var reg 1 " clk $end
#0
0"
bx !
#5
1"
b0 !
vcd2txt が波形を表にする
生の VCD は読みにくいので、ラボの vcd2txt が表にします。1行が1つの信号、1列が一定の時間です。
1ビットの信号は、0を _、1を # で表します。複数ビットの信号は、数をそのまま書きます。まだ決まっていない値は x です。列の幅は、2つ目の引数で決まります。
1列を5単位にする
vcd2txt out/counter.vcd 5ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1列を10単位にする
vcd2txt out/counter.vcd 10ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
波形を絵にする
vcd2svg out/counter.vcd out/counter.svgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
表の1列が、クロックの1周期だと思いがちです。1列は、渡した列の幅の時間です。10にすると、クロックの立ち上がりを飛ばして、clk がずっと下がったままに見えます。