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 でシミュレーション

f:id:ryos36:20170322184239p:plain
結果は 7540113804746346429 でウェブで検索したらあたったので、OK とします。

そのころ翔太は

Ikalog をとることに没頭していた。