#テストベンチって何でしょう?
Polyphony ではテストプログラムを FPGA の世界の伝統に従ってテストベンチと表現してます。Lチカの例で実際のプログラムとテストベンチを図示します。
テストプログラムを眺める
@testbench
def test(dut):
for i in range(4):
wait_value(1, dut.led)
wait_value(0, dut.led)
device_under_test = Blink(10000)
test(device_under_test)
@testbench
と test 関数
@testbench
というデコレータで修飾された関数がテスト用の関数です。ここでは test という名称にしていますが、別の名前でも構いません。
test 関数内では引数 dut に対象となるテストのオブジェクトが入ってきます。dut は実は Lチカ プログラムです。Lチカだけに dut の led のポートは 1 (点灯) 0 (消灯) を繰り返します。Polyphony が用意する wait_value 関数でその変化を待つようになってします。それを 4 回繰り返すと終了です。
オブジェクトの生成とテストベンチの実行
Blink クラス(Lチカでした)のオブジェクトを生成し、グローバル変数 device_under_test に入れ、テスト関数を呼びます。
device_under_test = Blink(10000)
test(device_under_test)
Python で実行する
Python (バージョン 3です)で実行してみましょう。うまくいけば何事もなかったように終了します。
shell$ python blink.py
あるいはWindows なら
> py -3.6 blink.py
なお、上の -3.6 という引数はWindowsで複数の Python がインストールされている場合に指定する Python のバージョンです。もし1つしかインストールしていないのなら必要ありません。
エラーです
Polyphony がインストールされていない場合は次のエラーが出ます。私の環境では Python の 3.5 にはインストールしていなかったのでエラーになりました。
>py -3.5 blink.py
File "blink.py", line 14
led_bit:bit = 1
^
SyntaxError: invalid syntax
print の追加
うまくいってもなんの表示もしないので print を追加してみます。
@testbench
def test(dut):
v = 0
for i in range(4):
print("loop:", i)
wait_value(1, dut.led)
wait_value(0, dut.led)
print("finished")
実行すると
> python blink.py
loop: 0
loop: 1
loop: 2
loop: 3
finished
地味な感じですが表示されました。