Posts Tagged with "Design"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on February 8, 2022 #455

パイプラインステージ

プロセッサに話を戻して、一連の処理を複数のパイプラインステージに分解します。一般的にみられるのは、 ステージを<>で表示する約束として、

  • <IF>: 命令フェッチステージ
  • <ID>: 命令デコード, レジスタリードステージ
  • <EX>: 演算ステージ
  • <MA>: メモリアクセスステージ
  • <WB>: ライトバックステージ

の5段に分割するものです。

このような5段のパイプラインの説明が一般的ですが、いきなり命令フェッチすることはできないので、実は<IF>の前段にはプログラムカウンタ演算の

  • <PC>: PC演算ステージ

が必要になります。<PC>の前はといえば、それはその前の<PC>なので、パイプラインの開始はやはり<PC>からです。命令パイプラインなのでプログラムカウンタが原点です。

従って、<PC><IF><ID><EX><MA><WB>の6段ステージと考えるほうが考えやすいです。

1: <PC><IF><ID><EX><MA><WB>
2:         <PC><IF><ID><EX><MA><WB>
3:                  <PC><IF><ID><EX><MA><WB>
4:                           <PC><IF><ID><EX><MA><WB>

各命令の<PC>は通常PCの+4インクリメントを実行します。ここで1の命令が無条件相対分岐命令だった時、分岐命令とオフセットが判明するのが1の<ID>の最後です。従って、それからPC計算を実行すれば、分岐先は4の命令ストリームとなります。

マイクロアーキテクチャによっては、IFの中でPC計算を実施する場合もあります。その場合は<PC>は<IF>に隠蔽され5段パイプラインとなります。このあたりは、マイクロアーキテクチャの考え方で、32bitの加算に$1\tau$かかるのであれば、<PC>も$1\tau$かかるのが妥当ということになります。

投機的実行

従って1の分岐命令は3サイクル命令となります。つまり1の分岐命令のレイテンシは$3\tau$となってしまうので、裏技的な手法を使います。それは、1の命令を<IF>でフェッチしたら、次の<ID>のデコードと同時に投機的に分岐命令だと思って分岐先を計算します。こうすれば分岐先は3の命令から始めることができ、分岐命令のレイテンシは$2\tau$となります。この場合、ほとんどは分岐命令でないので、その場合は<PC>で実行した投機的な実行結果を捨てます。

<PC>では本来次の命令アドレスであるPC+4か、または分岐命令の場合はPC+オフセットのいずれかを計算すれば良いのですが、このように、常に両方計算することで高速化を図ります。

パイプラインプロセッサにはこのような投機的な(ある意味無駄な)実行は良く使われ、例えばレジスタリードも同様です。<ID>でリードするのですが、本来はレジスタ演算命令の場合だけリードすれば良く、レジスタをリードしない命令でレジスタをリードする必要はありません。

投機的実行の場合は<ID>と同時にレジスタリードを行い、<ID>の完了後に不要だった場合は実行結果を捨てます。このためにレジスタリードのための命令のビットフィールドは固定されています。


左矢前のブログ 次のブログ右矢

posted by sakurai on February 7, 2022 #454

プロセッサパイプライン

本稿ではコンピュータの設計が主題なので、社内メール処理ではなく、プロセッサパイプラインについて解説します。プロセッサの命令にはRISC形式、CISC形式が存在しますが、ここではRISC形式を取り上げます。

RISCとCISC

このRISC/CISCの別は、実はパイプライン構造から発しており、パイプラインステージ中にメモリアクセスが1回のものをRISC、2回以上のものをCISCと呼びます。元々はメモリ上のデータを書き換えるのがプロセッサの役目なので、CISCが先に発明されたのですが、パイプライン化を考えた場合にパイプラインステージ中に複数のメモリアクセスステージが存在すると、パイプラインハザードが起こりやすくなるのが欠点でした。

これに対して演算をレジスタに限り、メモリアクセスをロードストアのみに限定したのがRISCです。パイプラインステージ中にメモリアクセスが1か所で固定されているため、メモリアクセスにはRAWハザードがありません。レジスタのRAWハザードのみを考慮すれば良いことになります。

RISCのメリット・デメリット

RISCのメリットは種々あり、

  • 32bit固定長命令によるデコードの簡略化
  • レジスタフィールドの固定により、デコードせずにソースレジスタの読み出しが可能
  • 複雑な命令の排除による命令デコーダの高速化

等がありますが、その根本はメモリ演算の廃止によるものです。メモリアクセスはロードストアのみと割り切り、演算はレジスタを対象とすることでパイプライン制御を単純化し、上記の特徴も併せて高速化が可能となりました。

一方で命令長が32bit固定でかつ複雑な命令を単純な命令の組み合わせで実行することから、命令コード効率はあまり良くありません。ワークステーション等では問題なかったこの欠点は、16/32bit混合の導入により組み込み向けの応用では改善が行われています。


左矢前のブログ 次のブログ右矢

posted by sakurai on February 4, 2022 #453

パイプラインハザード

それでは100段でも1,000段でも細かく切れば性能は100倍、1,000倍になるかというと、そう単純には行きません。それには複数の理由があります。

  • パイプラインステージは同じレイテンシ$\tau$である必要がある。
  • ステージ間の箱(パイプラインレジスタ)によるレイテンシ($\alpha$)が増加する
  • パイプラインハザードの存在により、性能向上できない

ひとつの大きな処理の中を均等に細かい時間間隔の$\tau$で切るのは、ハードウエア構成上限界があります。また、パイプラインレジスタのレイテンシの追加は、性能低下原因となります。最後にパイプラインハザードの存在により、後続ステージの待ち合わせが発生し、パイプライン中に隙間(バブル)が生まれます。これも性能低下原因となります。

RAWハザード

パイプラインハザードのひとつにRAW(Read After Write)ハザードがあります。これは、パイプラインステージの前半、例えばAの処理において使用する封筒に、Cの処理において投函される封筒が必要だったとします。すると、処理としてはCが終了しないとAが開始できませんが、パイプラインステージ中ではAのほうが先になっているので、図453.1の左のようには2番目の処理が開始できず、図453.1の右のように、$2\tau$のバブル(=無駄サイクル)が発生してしまいます。これをパイプラインハザードと呼びます。

図%%.1
図453.1 パイプラインハザード


左矢前のブログ 次のブログ右矢

posted by sakurai on February 3, 2022 #452

機械の場合

人間であれば器用に3つの処理を一人で実行することができますが、コンピュータは機械なので一つのことしかできません。つまり、A専用、B専用、C専用の3つの機械を並べて処理することになります。

  • 社内メール封筒を取りに行く ----- A専用機
  • 宛名を書いて書類を入れて封をする ----- B専用機
  • 社内メール投函箱に投函しに行く ----- C専用機

図%%.1
図452.1 システム構成図とレイテンシ

レイテンシは前稿の3人がかりと同じように$3\tau$で、スループットはその逆数である$\frac{1}{3\tau}$です。これを表452.1にまとめます。

表452.1
個別/全体 レイテンシ スループット
A, B, C個別 $\tau$ $\frac{1}{\tau}$
A+B+C全体 $3\tau$ $\frac{1}{3\tau}$

パイプライン化

さて、ここでシステムのスループット(システム性能)は$\frac{1}{3\tau}$ですが、その向上を考えてみます。

性能向上のためレイテンシ短縮を考えると、$3\tau$以下にするのは困難です。ところが、AとB、BとCの間に箱を置いて、$3\tau$ではなく、$\tau$毎に処理を入力したらどうでしょうか。ちょうどバケツリレーのように$\tau$毎に処理が可能です。

スループットから見てみましょう。元々A, B, Cの機械単体でのスループットは$\frac{1}{\tau}$だったのですが、システムで組み合わせると$\frac{1}{3\tau}$のように33%に低下していました。

例えばA機械は、BとCが働いているときには遊んでいたわけです。これを間に箱を入れて切り離すようにした結果、レイテンシはほとんど変わらずに、スループットは3倍の100%に向上しました。つまり、A, B, Cそれぞれの機械の能力を100%出し切ることができたわけです。

表452.2
個別/全体 レイテンシ スループット
A+B+C全体をパイプライン化 $3\tau$ $\frac{1}{\tau}$

このように、パイプライン化はあまりコストをかけることなく、性能を大幅に向上できる特長があります。一般的には、全体を$n$ステージのパイプラインで構成すれば、レイテンシはあまり変わらず$n\tau+\alpha$と若干増加するだけです。一方、スループット(性能)を$n$倍のように大幅に引き上げることができます。


左矢前のブログ 次のブログ右矢

posted by sakurai on February 2, 2022 #451

パイプラインとは

ノイマン型計算機の進歩の中で命令パイプライン技術が考案されました。パイプライン制御はコンピュータの性能向上の手法の重要な技術のひとつです。詳細は命令パイプライン制御を見てください。

本稿ではパイプライン制御を解説していきます。このパイプライン制御を理解するには、まずスループットレイテンシについて、正しく理解する必要があります。

スループットとレイテンシ

まずスループットとは、Wikipediaにもあるように、単位時間当たりの処理量です。コンピュータの処理能力は上げるほうが良いので、スループットを上げることを考えます。

次にレイテンシとは、端的に言えば入力から出力までの処理時間のことで、普通はその逆数がスループットになります。従って、処理能力を上げるにはレイテンシを小さくすることを考えます。

ところが、レイテンシを短くするのは非常に大変です。単純な仕事で見てみましょう。会社で社内メールを出すのに、

  • 社内メール封筒を取りに行く ----- A処理と呼ぶ
  • 宛名を書いて書類を入れて封をする ----- B処理と呼ぶ
  • 社内メール投函箱に投函しに行く ----- C処理と呼ぶ

上記のA~C処理の3ステップがあるものとします。どれも同じ時間$\tau$だけかかるとすれば、レイテンシは$3\tau$です。一人の人間がフルに働いても$3\tau$に1通しか処理できません。処理能力であるスループットは、上記から$\frac{1}{3\tau}$となります。

3人でやってもレイテンシは$3\tau$と変わりません。Cを実行するにはBが完了していなければならない依存性があり、Bを実行するにはAが完了していなければならない依存性があるからです。これがレイテンシを短縮するのが困難な理由です。


左矢前のブログ 次のブログ右矢

posted by sakurai on February 1, 2022 #450

だいぶ前の記事ですが、テストベンチのBSVと、モジュールのBSVからVerilogを生成し、Verilogシミュレーションを実施しました。BSVではテストベンチにおいてクロックとリセットが自動生成され、暗黙的にモジュールに供給されます。一方、Verilogでは明示的にテストベンチにクロックとリセットを供給する必要があります。前の記事では、テストベンチ内にその処理を行う記述をインクルードする方法を用いました。

ここでは、最上位からそれらの信号を供給する手法をとります。これにより、よりスマートにVerilogシミュレーションが実行できます。まず、原始最上位ファイルを用意します。最上位からはテストベンチを呼び出しています。

最上位ファイル:mkTop.v

module mkTop () ;
   /*AUTOREGINPUT*/
   mkTb Tb_inst(/*AUTOINST*/);
  initial begin
    RST_N = 1'b0;
    #30;
    RST_N = 1'b1;
  end
  initial begin
    CLK = 1'b0;
    forever begin
       #5 CLK = ~CLK;
    end
  end
endmodule // mkTop  

これに対して、Verilog-modeのオートコネクションコマンドであるC-c C-aを用いてポートの追加を行えば、

最上位ファイル:mkTop.v

module mkTop () ;
   /*AUTOREGINPUT*/
   // Beginning of automatic reg inputs (for undeclared instantiated-module inputs)                
   reg                  CLK;                    // To Tb_inst of mkTb.v                            
   reg                  RST_N;                  // To Tb_inst of mkTb.v                            
   // End of automatics                                                                            
   mkTb Tb_inst(/*AUTOINST*/
                // Inputs                                                                          
                .CLK                    (CLK),
                .RST_N                  (RST_N));
  initial begin
    RST_N = 1'b0;
    #30;
    RST_N = 1'b1;
  end
  initial begin
    CLK = 1'b0;
    forever begin
       #5 CLK = ~CLK;
    end
  end
endmodule // mkTop              

のように、テストベンチに対してクロックとリセットが接続されます。

最上位、テストベンチ、モジュールを結合した実行ファイルを生成します。エラーが出ることもなく実行ファイルが生成され、実行ファイルによりVerilogシミュレーションを実行すれば、

\$ iverilog mkTop.v mkTb.v mkFibOne.v -o mkFibOne.exev
\$ ./mkFibOne.exev
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946

このように、正しくVerilogシミュレーションが行われ、前記事と同じ結果となります。

結論としては、この記事のように自動結合を使用すれば、前記事のようにincludeを埋め込む必要はありませんでした。


左矢前のブログ 次のブログ右矢

posted by sakurai on November 16, 2021 #445

BoktechからレベコンICのみ実装のV10ボードが届きました。図445.1のように、基板は5枚でわずか1.0 USD、レベコンICの実装は最低2枚からで、その費用は部品代が6.64 USD、実装費その他を加えて29.83 USDでした。今回はDHLを使用したので若干輸送費が高く34.0 USDで、合計64.83 USDでした。

図%%.1
図445.1 BokTechオーダ内容

他の部品を半田付けして組み立て動作させたところ、フルハードウェア(マイコン、ソフトウェアは一切使用しない)によるSpace Invadersが正常に動作しました。

図%%.2
図445.2 Ultra96toPMODV10システム

図445.2のように、使用機材はAvnet製Ultra96ボードに弊社Ultra96toPMODボードの他、インタフェースのためのPMODボード類です。これでUltra96toPMODボード回路はようやくfixとなります。

V10ボードデータ一式はこの場所にあります。以下はデータのREADMEです。


Gerber data and Pick&Place data for Ultra96toPMOD mezzanine board.

https://qiita.com/mocapapa/items/a2faa710503e4affa88b

  • BokTech-Bom-Ultra96toPMODV10_minimum.xlsx ---- BOM file for BockTech
  • Ultra96toPMODV10.brd ---- EAGLE layout data
  • Ultra96toPMODV10.sch ---- EAGLE schematic data
  • Ultra96toPMODV10_2021-10-22.zip ---- Gerber data for two layer production (SeedFusion 2layer)
  • Ultra96toPMODV10.mnt.zip ---- Pick & Place file for PCBA
  • JLCPCB-PP-Ultra96toPMODV10_minimum.xlsx ---- Pick&Place file for JLCPCB
  • JLCPCB-Bom-Ultra96toPMODV10_minimum.xlsx ---- BOM file for JLCPCB

image

image


左矢前のブログ 次のブログ右矢

posted by sakurai on October 25, 2021 #442

BoktechにオーダーしていたV9基板が届いたので、組み立て火を入れたところ、JoystickスイッチONのタイミングで垂直同期にノイズが乗る現象が再発しました。

図442.1の上側黄色トレースが、X_RIGHT_SW信号(ボードへの入力、負論理)、下側青色トレースがVSYNC(ボードからの出力、負論理)です。スイッチのチャタリングが、本来無関係のはずの同期信号にクロストークしています。

実際にこのVSYNCのノイズにより、外付けモニタが誤動作しています。具体的には同期が乱れるため、それを自動的に検知し、一定期間ブランキングしています。

図%%.1
図442.1 オシロスコープ波形

レベコンICのVSYNCの隣接端子であるX_RIGHT_SW信号からノイズが回り込んでおり、一つ離れたX_LEFT_SW信号からの回り込みはありません。

この現象は、開発初期のV4で起きていたため、V5からスイッチ信号と同期信号を同じレベコンICに入力しないようにしていました。その後、配線に近い場所があったため、ロジカルには大丈夫だろうと、V9で同じレベコンICに入れたのですが再発しました。論理的には問題ないはずなので、あとは以下の2つ程度が考えられます。

  • チャタリング⇒レベコンICの電源・グラウンドの揺れ⇒同期信号にノイズ
  • レベコンICの内部でのクロストーク

ところが、4chオシロで観測したところ、電源・グラウンドの揺れはありませんでした。従って、原因はレベコンIC内部でのクロストークと考えられます。修正がここまでかかった原因は、メーカー製ICを信用し過ぎていたことに依るものです。

以上より、信号を入れ替え、ズイッチ信号と同期信号のレベコンICを別々に変更しました。これをV10とします。V10の基板図を図442.2及び3に示します。

図%%.2
図442.2 Ultra96toPMODV10ボード基板図(表面)

図%%.3
図442.3 Ultra96toPMODV10ボード基板図(裏面)


左矢前のブログ 次のブログ右矢

posted by sakurai on September 21, 2021 #437

改版中のV9ボードの基板図を図437.1及び2に示します。

図%%.1
図437.1 Ultra96toPMODV9ボード基板図(表面)

図%%.2
図437.2 Ultra96toPMODV9ボード基板図(裏面)


左矢前のブログ 次のブログ右矢

posted by sakurai on September 20, 2021 #436

V8基板が到着しました。今回も実装が安いBokTechに依頼しました。

図%%.1
図436.1 Ultra96toPMODV8基板

部品を並べたものが図436.2です。

図%%.2
図436.2 Ultra96toPMODV8ボード及び部品

組み立てたものが図436.3です。

図%%.3
図436.3 Ultra96toPMODV8ボード完成

正常に動作したものの、デバッグ途中で修正箇所を発見したため、V9として改版中です。具体的には、

  • Dip SWの入力がレベル変換ICにより1.8Vに変換されて入力されていた(Dip SWはスタティック信号のため、レベル変換ICの必要無し)⇒Dip SWの電源を1.8Vに変更し、ダイレクト入力に変更
  • Joy SWの入力が3.3Vダイレクト入力だった⇒1.8Vにレベル変換して入力(ラッチアップの可能性有るため)

Joy SWはV3において、1.8Vへのレベル変換ICを通すように変更したのですが、その際にSW信号が水平・垂直同期信号に悪影響を与えたため、V4以降で元に戻したものです。ただし動作しているとはいえ、1.8V入力に3.3Vを加えています。今回は再度V3と同様に修正します。ちなみにV3での悪影響の理由は、レベル変換ICで混信したのではなく、図436.4のように、レイアウト上同期信号がSW信号の間を通っていたためのようです。 【追記】レベル変換ICの端子間もしくはIC内部での混信のようでした。

図%%.4
図436.4 V3でのHSYNC/VSYNCのSWとの混信

V9ではV3と同様、再度JoySW信号を1.8Vへのレベル変換ICに入れるように修正しました。合わせて、レイアウト上SWの間を水平・垂直同期信号が通らないように注意して配線しています。


左矢前のブログ 次のブログ右矢


ページ: