H8/300H Tinyでアセンブリ言語の勉強をしてます。
このCPUも当然ノイマン・アーキテクチャだと思うので、その動作において、フェッチ(F)、デコード(D)、エグゼキュート(E)のステップを繰り返していると思い、そのタイミングについてマニュアルを調べてみたのですがよくわかりません。
システムクロックのパルス(ステート)と同期して、movやjmpなどの各命令毎にF、D、Eが繰り返されていると思っていたのですが、どうも違うようです。もしかして、命令フェッチや分岐アドレスリードなどの実行状態(サイクル)と呼ばれるもの毎にF、D、Eが繰り返されているではないかと思えてきました。
正しい知識をお持ちの方、ご教授お願いします。
http://japan.renesas.com/fmwk.jsp?cnt=Documentation.jsp&fp=/prod...
H8/36024グループ、H8/36014グループハードウェアマニュアル
P287 付録 A. 命令 A.3 命令実行ステート数
上記を参照ねがいます。
最近の16BitCPUなどは高速に動くよう最適化されており、最小2ステートくらいで動作します。
これには当然パイプラインなどが行われております。
フェッチの部分はデータバスを占有するため時間を取りますが、一度CPU内部に取り込んだデータは別な命令を読み込んでいる間にパイプラインで並列処理されます。
重なる回答ありがとうございます。
回答を受けて疑問に思ったのは次のようなところです。
これまで、CISCであるH8は、制御の流れがわかっている処理において正確な実行時間を見積もれる、(そこが、RISCにはないちょっとしたメリットでもある)と認識していました。これは間違ってますかね?
そうでないのなら、マニュアルに命令実行ステート数の求め方がまるでそれが絶対であるかのように解説してある事実に違和感を感じますし、そのページには「最小のステート数」なんて言葉は見当たりません。また、おそらくパイプラインを多用していないので、パイプラインハザードが発生しないから、というのが、なんとなく考えていた根拠です。
いろいろと混乱してきましたが、さらなるご教授お願いいたします。
>これまで、CISCであるH8は、制御の流れがわかっている処理において正確な実行時間を見積もれる、
>(そこが、RISCにはないちょっとしたメリットでもある)と認識していました。これは間違ってますかね?
命令分岐がなければあっています。
>そのページには「最小のステート数」なんて言葉は見当たりません。
上記は勘違いですね。同じ命令の処理時間が変わると読まれたのだと思います。
特定の命令の実行時間が変動するわけではありません。同じ命令は同じ処理時間がかかります。
1の回答のマニュアルのP31 2. CPUを参照願います。
RISCと違いCISCは命令毎に実行時間に差があります。(これがCISCの特徴であることはお分かりだと思います)
で、「最小2ステートくらいで動作します。」というのは
「早い命令は2ステートで実行できますし、遅い命令は例えば22ステートかかる」という意味です。
• 高速動作
頻出命令をすべて2~4ステートで実行
8/16/32ビットレジスタ間加減算:2ステート
8×8ビットレジスタ間乗算:14ステート
16÷8ビットレジスタ間除算:14ステート
16×16ビットレジスタ間乗算:22ステート
32÷16ビットレジスタ間除算:22ステート
>特定の命令の実行時間が変動するわけではありません。同じ命令は同じ処理時間がかかります。
なるほど。これについては、考えていたとおりで安心しました。
しかし、パイプライン処理をしつつ、そうであるのは、CPUの内部というのはよほど複雑なのだなー、と思った次第です。
はずしてるかもしれませんが・・。
パイプラインとか考えなくても良い、昔のCISCライクに考えては駄目なんですかね。
------------
>「命令フェッチ、分岐アドレスリード、スタック操作、バイトデータアクセス、ワードデータ
>アクセス、内部動作」がフェッチ、デコード、エグゼキュートに相当するものということで
>しょうか?
------
たぶん、YES。
------
この考え方でタイミングとかを合わせた場合に、支障がでるのなら考え方が
間違ってると思いますが、マニュアルを見る限りはそうは思えません。
ステート数とクロック数の関係がどうなってるのか、私には分からないのでなんとも
いえませんが・・。
マニュアルに書いてあるのかもしれませんが、そこまで見てないので。
------
>たぶん、YES。
なるほど。フェッチぐらいしか名前が一致していないので、違和感がありましたが、納得です。
ステート数=クロック数ですね。これはマニュアルにあり、私にも理解できました:-)
回答ありがとうございます。上記マニュアルは参照しました。
上記ページ 表A.3に掲載されている「命令フェッチ、分岐アドレスリード、スタック操作、バイトデータアクセス、ワードデータアクセス、内部動作」がフェッチ、デコード、エグゼキュートに相当するものということでしょうか?
これに関連して、
「H8/300H シリーズ プログラミングマニュアル」
ドキュメントナンバー:RJJ09B0141-0400
p.197
# 上記ドキュメントへのリンクはどのようにして作るのでしょうか?
# ルネサス社のドキュメント検索のフォームがPOST送信なので、リンクを作成できません。。。
を見てますが、同ページの図2.1を見ると、左から、フェッチ、フェッチ、内部動作、フェッチ、フェッチ、で命令が終了しており、デコード、エグゼキュートしている様子が見受けられません。
これで実行できるのか??? と、何か考え違いしているのか? と思った次第です。