はじめに
最近 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 以下ぐらいで使う分には十分実用的な速度が出ていそうに思いました。 中のアーキテクチャはどうなっているのでしょうね。資料があるならいつかまた時間のある時に見てみたいと思います。
