Edited at

Python で FPGA/テストベンチ ってなんでしょう?


テストベンチって何でしょう?

Polyphony ではテストプログラムを FPGA の世界の伝統に従ってテストベンチと表現してます。Lチカの例で実際のプログラムとテストベンチを図示します。

image.png


テストプログラムを眺める


テストベンチ

@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です)で実行してみましょう。うまくいけば何事もなかったように終了します。


pythonで実行

shell$ python blink.py


あるいはWindows なら


Windowsのcmdで実行

> 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 を追加してみます。


test

@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

地味な感じですが表示されました。