最初から、つまり命令の読み取り->命令のデコード->レジスタファイルの読み取りなどから、プロセッサがマルチサイクルデータパスで乗算を行う方法を知りたかったのです。
言い換えれば、乗算用のブースのアルゴリズムが個別に実装されている場合 (回路が与えられている場合)、最小限のリソースを使用して乗算命令をサポートするためにマルチサイクル データパスをどのように拡張するかを知りたかったのです。
分割についても教えていただけますか?
最初から、つまり命令の読み取り->命令のデコード->レジスタファイルの読み取りなどから、プロセッサがマルチサイクルデータパスで乗算を行う方法を知りたかったのです。
言い換えれば、乗算用のブースのアルゴリズムが個別に実装されている場合 (回路が与えられている場合)、最小限のリソースを使用して乗算命令をサポートするためにマルチサイクル データパスをどのように拡張するかを知りたかったのです。
分割についても教えていただけますか?
単純なCPUの場合、乗算はCPUパイプラインのフェーズEXで行われます。したがって、命令をフェッチし、デコードし、RegisterFileに入力オペランドを要求し、ALUで実際の乗算を実行します。
ALUバリアントによっては、乗算に1 CPUサイクル以上かかる場合があります(各cpuサイクルに部分和を格納すると、CPUパイプラインのEX0、EX1、EX2などのステージになります)。低速のALUはパイプライン化できるため、最初の操作の結果がNティックで表示され、Mごとに異なる操作が開始されます。
http://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.htmlページで入手できる乗数のさまざまなハードウェアバリアント
もう 1 つの適切なリンクは、オープンソースの OpenFire マイクロプロセッサ コア、MicroBlaze のバリアント/アナログ (DLX ベース) です。
ALU と Multiplier ユニットのデータパスの一部はopenfire_primitives.v
ファイルにあります。
パイプラインのストールとバブルの説明が充実した DLX データパスのマニュアルは、
http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/hazards.html
そして、マルチサイクル オペレーション (DLX) に関する情報があります。
http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/multicycle.html
したがって、パイプラインにとどまることができる操作 (より多くのティックが必要) は、ストール (またはバブル) をパイプラインに挿入します。これは、いくつかのティッシュに対して長い操作を行う EX 以外のパイプラインのすべてのステージを停止することと考えることができます。
オープンソース Verilog の別の Mul/Div ユニットはこちら: http://opencores.org/websvn,filedetails?repname=openrisc&path=%2Fopenrisc%2Ftrunk%2For1200%2Frtl%2Fverilog%2For1200_mult_mac.v