Ryuz's tech blog

FPGAなどの技術ブログ

GOWINで加算の性能を調べてみる

はじめに

最近 GOWIN を触る機会も多いのですが、他のベンダーさんの FPGA とくらべてあまり深いところまでは触っていません。

また、 AMD の CARRY8 のようなものが無いのではという噂も聞いたのと、LUT4 であるという点なども加味して、大雑把に性能を調べておこうと思って触ってみました。

やったこと

合成に時間がかかるのは嫌なので、 Tang Nano 4k (GW1NSR-LV4CQN48PC6/I5) をターゲットに、カウンタの幅を変えて合成し、レポートの Fmax を調べるという事をやりました。

GOWIN EDA は V1.9.11.02 (64-bit) [Windows版]を使っています。

合成したコードは下記の通りで、WIDTH を変えて実験します。

`default_nettype none

module tang_nano_4k_adder
        #(
            parameter int   WIDTH = 32
        )
        (
            input   var logic           in_reset_n,
            input   var logic           in_clk,     // 27MHz

            output  var logic   [0:0]   led_n
        );
    

    logic   [WIDTH-1:0]  counter;
    always_ff @(posedge in_clk) begin
        if ( !in_reset_n ) begin
            counter <= 0;
        end
        else begin
            counter <= counter + 1;
        end
    end
    assign led_n[0] = ~counter[WIDTH-1];

endmodule


`default_nettype wire

合成結果のレポートで fmax を探すとこのように出てくるようです。

結果

本格的にやるならスクリプト書いても良かったのですが、 手っ取り早く手動で合成を繰り返しました(笑)。

bit数 MHz LUT Regs
1 レポート無し 1 1
2 368.474 3 2
3 322.238 4 3
4 296.991 5 4
5 342.906 7 5
6 378.582 8 6
7 330.006 9 7
8 326.435 10 8
9 318.041 11 9
10 348.501 12 10
11 306.913 13 11
12 335.184 14 12
16 311.387 18 16
32 203.419 34 32
64 148.368 66 64
128 67.424 132 128
256 39.306 262 256

おわりに

なんとなく素直に LUT の数が増えていきながら fmax も順調に下がっていくようですね。ただレジスタは桁数ぴったりですが LUT は時々余分に増えているので、単純な全加算器が連なっていくのではなく、何かしらキャリールックアヘッドみたいなのがあるのでしょうか?

とりあえずRISC-V なんかを作る場合、RV32 はいいけど RV64 は大変そうだという気がしてきます。

また Tang Nano には無縁ですが、最近は FPGA に繋ぐメモリも 4G 以上になるケースも増えていて、DAMのアドレッシングも 64bit じゃ足りなんないなんてこともあるので、大きな数を扱うときは気にしておいた方がいいのかもしれません。

逆に、へんなことせずに 32bit 以下ぐらいで使う分には十分実用的な速度が出ていそうに思いました。 中のアーキテクチャはどうなっているのでしょうね。資料があるならいつかまた時間のある時に見てみたいと思います。