Update extra authored by Toru Koizumi's avatar Toru Koizumi
...@@ -13,15 +13,15 @@ ...@@ -13,15 +13,15 @@
* 難易度:1~4 * 難易度:1~4
プロセッサの性能を上げる最も簡単な方法はクロック周波数を上げることです。クロック周波数を上げるためには、回路が複雑でないことが要求されます。Vivadoでクリティカルパス(レジスタからレジスタへの経路のうちで、最も長い遅延を生み出す経路)を探しながらソースコードを書き換えていくことになります。 プロセッサの性能を上げる最も簡単な方法はクロック周波数を上げることです。回路が複雑だとクロック周波数を上げることが困難なので、なるべく簡単になるよう、工夫したHDLコードを書く必要があります。どこが複雑になっているかをHDLコード上だけで判断するのは困難なので、基本的には、HDLコードの書き換えとVivadoで合成してクリティカルパス(レジスタからレジスタへの経路のうちで、最も長い遅延を生み出す経路)を確認、というのを繰り返していくことになります。
以下に、大きな高速化ポイントのヒントを示します。 以下に、高速化のヒントを示します。
**RAMが大量の分散RAMで構築されている場合、それをBlockRAMに置き換えてみる** **命令メモリやデータメモリが大量の分散RAMで構築されている場合、それをBlockRAMに置き換えてみる**
* 難易度:1 * 難易度:1
非常に効果が高いです。シングルサイクルプロセッサだと不可能そうに見えますが、`negedge`で駆動することで可能です(本当は、素直にマルチサイクル化orパイプライン化するのが正しい)。 非常に効果が高いです。シングルサイクルプロセッサだと不可能そうに見えますが、命令メモリとデータメモリを駆動するクロックタイミング(`posedge``negedge`)を異なるものにすることで可能です(本当は、素直にマルチサイクル化orパイプライン化するのが正しいですが)。
**`always`文で書かれている組み合わせ論理回路を、条件演算子とfunctionに書き換えてみる** **`always`文で書かれている組み合わせ論理回路を、条件演算子とfunctionに書き換えてみる**
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
Verilog HDL の記述として`a + b`などを複数個所に書いてしまうと、書いた数だけの加算器が合成されてしまいます。しかし、それらは同時に使われないことが多いのでもったいないです。加算器への入力を切り替える回路を追加することで、加算器自体は一つだけしか生成されないようにしましょう。 Verilog HDL の記述として`a + b`などを複数個所に書いてしまうと、書いた数だけの加算器が合成されてしまいます。しかし、それらは同時に使われないことが多いのでもったいないです。加算器への入力を切り替える回路を追加することで、加算器自体は一つだけしか生成されないようにしましょう。
なお、比較演算や減算も加算器に合成されてしまいます。これらも上記唯一の加算器を使って実行できるようにしても面白いカモれません。 なお、比較演算や減算も加算器に合成されてしまいます。これらも上記唯一の加算器を使って実行できるようにしても面白いかもしれません。
どこまで資源消費量が少ないプロセッサが書けるでしょうか? どこまで資源消費量が少ないプロセッサが書けるでしょうか?
...@@ -51,6 +51,7 @@ Verilog HDL の記述として`a + b`などを複数個所に書いてしまう ...@@ -51,6 +51,7 @@ Verilog HDL の記述として`a + b`などを複数個所に書いてしまう
* 難易度:4 * 難易度:4
FPGAの中身がどのような構成になっているかを勉強すると、FPGAが得意なことと不得意なことがあることが分かります。その知識を使って、限界まで周波数を上げてみましょう。 FPGAの中身がどのような構成になっているかを勉強すると、FPGAが得意なことと不得意なことがあることが分かります。その知識を使って、限界まで周波数を上げてみましょう。
参考:[FPGAの詳しい中身](FPGAAbyss) 参考:[FPGAの詳しい中身](FPGAAbyss)
### パイプライン化 ### パイプライン化
... ...
......