FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Rocket Chip on ZedBoardはどこまで周波数を上げられるのか?(1. DefaultFPGAConfigの場合)

f:id:msyksphinz:20170923120007p:plain

Rocket ChipをFPGAインプリメントして動作させているが、動作周波数が25MHzに設定されているというのに驚愕した。 ZedBoard自体は100MHzで動くはずだし、HiFive1だって320MHzで動作するような設計だ。 なぜこんなに遅い周波数で設計されているのだろう?

調査してみると、Rocket Chipの動作周波数をコンフィグレーションで変更できることが分かった。 では、Violationが出ない程度に周波数を上げていくとどこまで動作させることができるのだろう?

ZedBoard向けコンフィグレーションにて、Rocket Chipコアの動作周波数を決定しているのはfpga-zynqリポジトリの以下のファイルになる。

`ifndef _clocking_vh_
`define _clocking_vh_


`define ZYNQ_CLK_PERIOD 10.0

`define RC_CLK_MULT     10.0

`define RC_CLK_DIVIDE   40.0

コメントにも書いてあったが、このパラメータを変えることで、Rocket Chipの動作周波数を変えることが出来る。

 \text{Rocket Chipの動作周波数} = \dfrac{1000}{\text{ZYNQ_CLK_PERIOD}}\times\dfrac{\text{RC_CLK_MULT}}{\text{RC_CLK_PERIOD}}

従って、現在は  \text{Rocket Chipの動作周波数} = \dfrac{1000}{10.0}\times\dfrac{10.0}{40.0} で、25MHzに設定されている。では、RC_CLK_DIVIDEを30.0に設定するとどうなるだろう(つまり33MHzで動かす)?

結論としては、Rocket CoreのFMAパイプラインが盛大にViolationした。こりゃ、25MHzの動作でもギリギリなんだろうな。

Max Delay Paths
--------------------------------------------------------------------------------------
Slack (VIOLATED) :        -5.617ns  (required time - arrival time)
  Source:                 top/FPGAZynqTop/DefaultCoreplex/tiles_0/fpuOpt/FPUFMAPipe/in_in2_reg[61]/C
                            (rising edge-triggered cell FDRE clocked by host_clk_i  {rise@0.000ns fall@15.000ns period=30.000ns})
  Destination:            top/FPGAZynqTop/DefaultCoreplex/tiles_0/fpuOpt/FPUFMAPipe/_T_205_data_reg[53]/S
                            (rising edge-triggered cell FDSE clocked by host_clk_i  {rise@0.000ns fall@15.000ns period=30.000ns})
  Path Group:             host_clk_i
  Path Type:              Setup (Max at Slow Process Corner)
  Requirement:            30.000ns  (host_clk_i rise@30.000ns - host_clk_i rise@0.000ns)
  Data Path Delay:        34.976ns  (logic 17.118ns (48.943%)  route 17.858ns (51.057%))
  Logic Levels:           55  (CARRY4=29 DSP48E1=3 LUT2=2 LUT3=3 LUT4=2 LUT5=3 LUT6=12 MUXF7=1)
  Clock Path Skew:        -0.125ns (DCD - SCD + CPR)
    Destination Clock Delay (DCD):    6.163ns = ( 36.163 - 30.000 )
    Source Clock Delay      (SCD):    6.792ns
    Clock Pessimism Removal (CPR):    0.505ns
  Clock Uncertainty:      0.087ns  ((TSJ^2 + DJ^2)^1/2) / 2 + PE
    Total System Jitter     (TSJ):    0.071ns
    Discrete Jitter          (DJ):    0.159ns
    Phase Error              (PE):    0.000ns

ただし、FMAだけならば、浮動小数点を使わないデザインだったらさらに高速化できる気がする。64bitでFPUを除去したデザインとか、Chiselのコンフィグレーションを変えると作れないかしら。