チップは作る前に書き表される
スマートフォンのチップには、何十億ものスイッチが入っています。それを1つずつ描く人はいません。技術者は回路をハードウェア記述言語で文章として書き、プログラムがその文章を実行して、何かを作るずっと前に、チップがどう動くかを確かめます。
このレッスンが終わると
メモ
Verilog で書いた小さな回路をシミュレーションし、出てくる表と波形を読める。
キーワード
- モジュール:入力と出力を持つ1つの回路。
- テストベンチ:別のモジュールを動かして、出てきたものを表示するモジュール。
- クロック:一定のリズムで上がり下がりする信号。
- 波形:時間とともに信号がどう変わるか。
- シミュレーション:書き表したものをコンピューターで実行すること。
ウォームアップ:すでに知っていること
メモ
頭の中で答えましょう。1. 2進数で 1 + 1 はいくつですか。2. AND ゲートに1を2つ入れると何が出ますか。3. ビットとは何ですか。1つ目の答えはすぐに使います。
はじめる前に
メモ
このレッスンの上のバーにある ラボを開始 を押します。このラボは、あなた専用の Ubuntu マシン まるごとなので、コンテナより起動に少し時間がかかります。各 実行 ボタンは、そのコマンドをマシンのターミナルに、同じセッションで順番に入力します。マシンがまだ起動中と表示されたら、数秒待ってからもう一度押します。様子を見たり自分で入力したりするには、バーの ターミナルを開く を押します。
回路は短い文章である
あなたのファイルはフォルダー hdl にあります。最初のコマンドでそこに入り、次のコマンドで half_adder.v を表示します。半加算器は2つのビットを足します。入力 a と b、出力2つを持つ、1つのモジュールです。sum は a ^ b で XOR、carry は a & b で AND です。
cd hdlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
cat half_adder.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
テストベンチが動かして表を表示する
道具は Icarus Verilog です。iverilog は回路とテストベンチを1つのプログラムにコンパイルし、うまくいけば何も表示しません。vvp はそのプログラムを実行します。テストベンチは4通りの入力をすべて試し、真理値表を表示します。1 1 の行は carry が 1、sum が 0 で、これは2進数の 10 なので、1 + 1 = 2 です。
iverilog -o /tmp/half half_adder.v half_adder_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
vvp /tmp/halfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
チェック
ヒント
carry が 1 になる入力はどれですか。答え:a = 1 かつ b = 1 のときだけです。和が1ビットに収まらない行です。
よくある間違い
注意
Verilog のファイルは、Python のスクリプトのように1行ずつ実行されると考える人が多くいます。そうではありません。モジュールは、すべてが同じ瞬間に存在する部品を書き表したもので、assign の行は、いつも入力に従う1本の配線です。手順の一覧ではなく、図として読みましょう。
クロックと波形
counter.v は4ビットのカウンターで、clk が上がるたびに q が1ずつ増え、rst で 0 に戻ります。テストベンチはクロックを作り、すべての信号を VCD ファイル out/counter.vcd に記録します。2つ目の実行は、112 時間単位たったあとの q、つまり 10 を表示します。3つ目はファイルを文字にします。信号ごとに1行、5 時間単位ごとに1列で、# は 1、_ は 0 です。rst が高い間 q は 0 のままで、そのあと clk が上がるたびに1ずつ増えます。dut.q は、カウンターの内側にある同じ信号です。
iverilog -o /tmp/counter counter.v counter_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
vvp /tmp/counterここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
vcd2txt out/counter.vcd 5ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
チェック
ヒント
q が 0 から 10 になるまでに、clk は何回上がりましたか。答え:10 回です。数える1歩ごとに1回です。
同じ回路を VHDL で
VHDL はもう1つのよく使われる言語です。GHDL は3つの手順で実行します。ghdl -a はファイルを解析して確かめます。ghdl -e はテストベンチをエラボレートして、プログラムを作ります。ghdl -r はそれを実行し、テストベンチが同じ真理値表の4行、a、b、carry、sum を報告します。
ghdl -a half_adder.vhd half_adder_tb.vhdここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ghdl -e half_adder_tbここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ghdl -r half_adder_tbここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最後のチェック
ヒント
前に戻らずに答えましょう。1. テストベンチは何をしますか。2. vvp は何をしますか。3. GHDL の3つの手順は何ですか。4. 信号がいつ変わるかを示すものは何ですか。答え:モジュールを動かして、出てきたものを表示する。コンパイルしたシミュレーションを実行する。解析、エラボレート、実行。波形。では、ホームフォルダーの README.md を、ターミナルで cat ~/README.md として開きましょう。全加算器とカウンターは、あなたが書きます。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。ステップと実行ボタンがレッスンで、ラボは生徒それぞれのコピーです。VM ラボで行い、生徒はそれぞれ自分の Ubuntu マシンを持ち、シミュレーターが入っています。実行ボタンはそのターミナルに入力して、表示された結果を見せます。学習のポイント:1. モジュールは入力と出力を持つ回路である。2. テストベンチがそれを動かして真理値表を表示する。3. クロックが回路を1歩ずつ変え、波形がそれを見せる。よくある間違い:Verilog を順番どおりの手順として読むこと。準備するもの:ラボとブラウザー。ヒント:vvp の前に、4行の出力をクラスに予想させましょう。ラボ自体には、隠したテストベンチで3つの設計を採点するチェックがあります。レッスンは自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューでゼロから作れます。