Polyphony で 64bit Fibonacci (本編スピンアウト 64bit Fibonacci the movie)
あらすじ ~ TV とは違う Movie ならではの展開 ~
32bit で気を良くした Polyphony サポートチームは 64bit の Fibonacci にチャレンジした。64bit は 32 を2つにしたというだけではない。次から次へと襲う難題。チームは問題を解決できるのか?本編からスピンアウトした 64bit 対応。最後に笑うのは誰だ?そして翔太は?
まずは Polyphony 0.3.0 の 64bit 化
env.py にある default_int_width=32 を 64 に変更。なお、64bit 対応は 0.3.0 から。master の 0.2.2 は未対応。
default_int_width = 64
test bench を 64bit 化
from polyphony import testbench def fib(n): if n <= 0: return 0 if n == 1: return 1 r0 = 0 r1 = 1 for i in range(n-1): prev_r1 = r1 r1 = r0 + r1 r0 = prev_r1 return r1 @testbench def test(): expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610] for i in range(len(expect)): result = fib(i) assert expect[i] == result print(i, "=>", result) expect2 = [ 0, 55, 6765, 832040, 102334155, 12586269025, 1548008755920, 190392490709135, 23416728348467685, 2880067194370816120, 354224848179261915075, 573147844013817084101, 927372692193078999176, 1500520536206896083277, 2427893228399975082453 ] j = 0 for i in range(105): if i % 10 != 0 and i < 100 : continue result = fib(i) #print("{i} => {result}({rhex}) vs {expect2}({ehex})".format(i = i, result = result, rhex = hex(result), expect2 = expect2[j], ehex = hex(expect2[j]))) print(i, "=>", result, "(", expect2[j], ")") #print(i, "=>", hex(result), "(", expect2[j], ")") assert expect2[j] == result j += 1 test()
そして、Python3 で動くことを確かめる。
> python3 fib.py 0 => 0 ざっくり中略 90 => 2880067194370816120 ( 2880067194370816120 ) 100 => 354224848179261915075 ( 354224848179261915075 ) 101 => 573147844013817084101 ( 573147844013817084101 ) 102 => 927372692193078999176 ( 927372692193078999176 ) 103 => 1500520536206896083277 ( 1500520536206896083277 ) 104 => 2427893228399975082453 ( 2427893228399975082453 )
64bit の int では 93 まで。(uint なら 94)。上の結果はなぜか 104 まで
msgpack-rpc vhdl を 64bit 化
たぶん create_project で generate する際のパラメタを渡せると思うだが、力及ばず、/src/test/vhdl/test_bench.vhd を直接編集。
> git diff ../../../src/test/vhdl/test_bench.vhd diff --git a/examples/fibonacci/src/test/vhdl/test_bench.vhd b/examples/fibonacci/src/test/vhdl/test_bench.vhd index 11f6861..7eabfbf 100644 --- a/examples/fibonacci/src/test/vhdl/test_bench.vhd +++ b/examples/fibonacci/src/test/vhdl/test_bench.vhd @@ -66,13 +66,13 @@ architecture MODEL of TEST_BENCH is constant CLOCK_PERIOD : time := 10 ns; constant DELAY : time := 1 ns; constant MATCH_PHASE : integer := 8; - constant I_BYTES : integer := 4; + constant I_BYTES : integer := 8; constant I_WIDTH : AXI4_STREAM_SIGNAL_WIDTH_TYPE := ( ID => 4, USER => 4, DEST => 4, DATA => 8*I_BYTES); - constant O_BYTES : integer := 4; + constant O_BYTES : integer := 8; constant O_WIDTH : AXI4_STREAM_SIGNAL_WIDTH_TYPE := ( ID => 4, USER => 4,
これは polyphony では入力も 64 ビットになるから。Synthesijer では入力 32ビット、出力 64bit みたいなことができる。
あとcreate_project.tcl 内のシナリオも test_42.snr から test_92.snr に変えておく
Vivado でシミュレーション
結果は 7540113804746346429 でウェブで検索したらあたったので、OK とします。
そのころ翔太は
Ikalog をとることに没頭していた。