Articles

32 ビット ALU

回答欄に数値を入力する際には、整数(1000、0x3E8、0b1111101000)、浮動小数点数(1000.役に立つリンク:

  • Jadeの紹介
  • 標準セルライブラリ

問題1. Design Problem: 32-bit Arithmetic and Logic Unit以下の説明を参照してください。以下のJadeインスタンスを使用して、デザインを入力してください。 このデザイン問題を完了するには、/alu/aluモジュールを選択し、Jadeツールバーをクリックして、内蔵のtesterwillは、期待される出力と実際の出力の間の不一致を報告するか、または、あなたのデザインが正しい場合、それはテストが合格したと記録します.{ “shared_modules”: , “hierarchical”: “true”, “parts”: , “tools”: , “editors”: , “edit”: “/alu/alu”, “required_tests”: }この実習では、ベータ・プロセッサのALU(arithmetic and logic unit)を作ります。 ALUは、2つの32ビット入力(”A “と “B “と呼びます)を持ち、1つの32ビット出力を生成します。 まず、ALUの各部分を独立した回路として設計し、それぞれが32ビットの出力を出すようにします。 そして、これらの出力を1つのALUの結果にまとめます。回路を設計する際には、最適化できる3つの要素があります。

  1. 最大性能(最小レイテンシ)の設計
  2. 最小コスト(最小面積)の設計
  3. 最良のコスト/性能比(最小面積*レイテンシ)の設計

幸いなことに、3つすべてを同時に行うことが可能な場合が多いのですが、回路の一部では、ある種の設計上のトレードオフを行う必要があります。 回路を設計する際には、3つの要素のうちどれが最も重要であるかを選択し、それに応じて設計を最適化する必要があります。 スタンダードセルライブラリ & ゲートレベルシミュレーションこの研究室のビルディングブロックは、ロジックゲートのライブラリから来ています。ICメーカーは、モスフェットや配線を作成するために使用されるマスク層の詳細なジオメトリを気にすることなく、顧客が簡単に設計できるように、「スタンダードセルライブラリ」やさまざまな設計ツールを持っていることがよくあります。

インバーター、バッファー、トライステート・ドライバー
2入力、3入力、4入力のAND、OR、NAND、NORゲート
2入力のXOR、XNORゲート
2:1および4:1マルチプレクサー
Dレジスタ、Dラッチ

各ゲートの適切な接続の詳細については、ライブラリのドキュメントを参照してください。

ゲートレベルで設計しているので、(トランジスタや電圧ではなく)ゲートと論理値のみを知る高速シミュレーターを使用することができます。 ゲートレベルのシミュレータは、スタンダードセルライブラリのゲートプリミティブのみをサポートしているため、デザインにはモスフェット、抵抗、コンデンサなどは含まれません。入力は電圧で指定されますが (他のシミュレータとのネットリストの互換性を保つため)、ゲートレベルシミュレータは、デザインファイルの最初に指定された vil と vih のしきい値を使用して、電圧を 3 つの可能な論理値のいずれかに変換します。

0 logic low (vilしきい値以下の電圧)
1 logic high (vihしきい値以上の電圧)
X unknown or undefined (しきい値の間の電圧、または未知の電圧)

4番目の値「Z」は、どのゲート出力によっても駆動されていないノードの値を表すために使用されます。g., 4つ目の値 “Z “は、どのゲート出力によっても駆動されていないノードの値を表します。) 次の図は、これらの値が波形表示されている様子を示しています。

波形
ALUの仕様今回製作する32ビットALUは、この後の研究室で取り組むベータプロセッサの構成要素となります。 このALUの論理記号を右に示します。 これは、2つの32ビットのデータワードAとBを入力とし、AとBの入力に対して指定された算術関数または論理関数を実行して32ビットの出力Yを生成する組み合わせ回路である。 実行される特定の機能は6ビットの制御入力FNで指定され、その値は次の表のように機能をコード化します。

FN Operation Output Value Y
00-!011 CMPEQ Y = (A == B)
00-101 CMPLT Y = (A < B)
00-!111 CMPLE Y = (A ≤ B)
01–0 32ビットADD Y = A + B
01-?-1 32ビットSUBTRACT Y = A – B
10abcd ビットワイズ・ブーリアン Y = Fabcd(A,B)
11–00 ロジカルシフトレフト(SHL) Y = A << B
11-!-01 ロジカル・シフト・ライト(SHR) Y = A >> B
11–11 Arithmetic Shift right (SRA) Y = A >> B (sign extended)

なお、6ビットのFN入力に適切な値を指定することで、ALUは様々な処理を行うことができます。 ALUは、6ビットのFN入力に適切な値を指定することで、Betaプロセッサが必要とする様々な算術演算、比較、シフト、ビットごとのブール演算の組み合わせを行うことができます。

td

Bi Ai Yi
0 d
0 1 c
1 0 b
1 a

ビット単位のブール演算はFN=10で指定されています。 この場合、FNの残りのビットabcdは、右図のように、Yの各ビットがAとBの対応するビットによってどのように決定されるかを記述した真理値表の項目として扱われます。3つの比較演算は、それぞれブール値を出力します。 これらの場合、Yはすべて0で、下位ビットのYは32ビットのAとBのオペランドの比較結果を反映して0または1になります。ALUの設計は、以下のように、算術演算、比較、ブール演算、シフト演算のサブシステムに分けてアプローチすることができます。

ALU のような複雑なシステムの設計は、個々のサブシステムを一度に設計してデバッグできるように、段階的に行うのが最適です。 以下のステップは、上記のALUブロック図を実装するためのアプローチです。 まず、4つの主要なサブシステム(BOOL、ARITH、CMP、SHIFT)それぞれのダミーモジュールを備えたALUフレームワークを実装し、その後、各サブシステムの実働版を実装してデバッグします。 注意:ALU回路の動作を制御するためのFN信号は、ALU回路の設計を簡単にするために選ばれたエンコーディングを使用しています。 このエンコーディングは、Beta命令の6ビットのオペコードフィールドをエンコードするものとは異なります。 研究室5では、命令のオペコードフィールドを適切なFN制御ビットに変換するロジック(実際にはROM)を作ります。以下に、各サブモジュールの設計方法を示す設計上の注意点を示します。 BOOLユニット ALUのブール演算を実装する回路を設計し、Y出力をグランドに接続するジャンパーとワイヤーの代わりに使用します。提案された実装では、4対1のマルチプレクサ(mux4)のコピーを32個使用しています。BFNは実行する演算をエンコードし、AとBはマルチプレクサのセレクト入力にフックされます。

ヒント:Jadeは論理ゲートを自動的に複製し、ゲートの入出力の幅をゲートに接続する信号の幅と一致させます。 例えば、上図のMUX4ゲートは1ビットの出力信号を持ちますが、この回路図では幅32の信号であるYに接続されています。 そこでJadeは、MUX4を32回複製し、1つ目のMUX4の出力がYにつながり、2つ目のMUX4の出力がYにつながる、というようにします。 その後、入力信号は(必要に応じて)複製され、32個のMUX4ゲートそれぞれの入力となります。 各MUX4ゲートには2つのセレクト信号が必要で、これは64個の信号の中から選択されます。 BとAは第1のMUX4のセレクトラインに接続し、BとAは第2のMUX4のセレクトラインに接続し、以下同様です。 各MUX4ゲートには4つのデータ信号が必要です。 例えば、BFNは32個のMUX4のそれぞれのD0入力として使用されます。

次の表は、テスト用治具で使用されるBFN制御信号のいくつかのエンコーディングを示しています(我々の典型的なBetaimplementationでも使用されます)。

動作 BFN
AND 1000
OR 1110
XORtd 0110
“A” 1010

BOOLテストは実際に引数の選択で16のすべてのブール演算をチェックします。 そして、エラーがあれば報告します。BOOL回路の入力が完了したら、緑のチェックマークをクリックしてテストを実行します。 Jadeは回路の結果を予想される値のリストと照合し、不一致があれば報告します。 失敗の通知は、どの信号が検証に失敗したかと、実測値と期待値の不一致が発生したシミュレーション時間を知らせてくれます。 テストは実際には100nsのテストサイクルの連続であり、報告される時間は、出力値が正しいかどうかをチェックしたサイクルの最後の時点になります。 適切な信号波形のプロット上にマウスを移動させ、垂直方向のタイムカーソルが故障時間のほぼ中央にくるようにします。 その後、ダブルクリックして、その時刻付近のプロットを拡大し、そのテストサイクルのすべての信号が読めるように十分に拡大します。 ARITHユニット32ビットの2の補数入力で動作し、32ビットの出力を生成する加算器/減算器(ARITH)ユニットを設計します。 CMPユニットで使用される他の3つの出力信号を生成することが有用です。 S出力がすべてゼロの場合に真となるZ、加算演算がオーバーフローした場合(結果が大きすぎて32ビットで表現できない場合)に真となるV、および合計が負の場合(S = 1)に真となるNです。 2つのオペランドの符号が異なる場合にはオーバーフローは起こらず、2つのオペランドの符号が同じであれば、結果の符号がオペランドの符号と異なる場合にオーバーフローが検出されます。 + V = XA_{31}cdot XB_{31}\cdot S_{31}) なお、この式ではXBを使用していますが、これは加算器本体のBオペランドの上位ビット(XORゲート後のビット)です。 XAは単純にAです。以下の回路図は、設計を進める上での一つの提案です。
AFNは、ADD(S = A+B\)の場合は0、SUBTRACT(S = A-B\)の場合は1に設定されます。 AとBは32ビットの2の補数の入力オペランド、Sは32ビットの結果、Z/V/Nは上述の3つの条件コードビットです。 ARITHの心臓部である32ビットリップルキャリー加算器を構成する際に使用する全加算器(第1研究室の問題8参照)のゲートレベル回路図を入力するためのFAモジュールを用意しました。 AFN入力信号は、演算がADDかSUBTRACTかを選択します。 SUBTRACTを行う場合、回路はまずBを反転させてBオペランドの2の補数の否定を計算し、次に1を加えます(32ビット加算のキャリーインを強制的に1にすることで可能です)。 まず、32ビット加算をアリプルキャリーアーキテクチャーで実装してみましょう(この方法はコースの後半で改善します)。 Zを計算するために必要な32入力のNORゲートは、より小さなファンインゲートのツリーを使って構築する必要があります(部品ライブラリには4入力までのゲートしかありません)。回路を入力する際には、出力をグランドに接続していた元のジャンパーとワイヤを削除することを忘れないでください。 CMPユニットALUは、AとBのオペランドに対して3つの比較演算を行います。 上で設計した加算器ユニットを使用して\(A-B\)を計算し、その結果(実際にはZ、V、Nの条件コードのみ)を見て、A=B、A < B、A ≤ Bのいずれかを判断します。比較演算では、0がfalse、1がtrueを表す32ビットの結果を生成します。CFN制御信号(実行する比較を選択するために使用される)と、加算器/減算器ユニットのZ、V、N出力に応じて、2つの定数(0または1)のいずれかを生成する32ビット比較(CMP)ユニットを設計します。 明らかに、出力の上位31ビットは常に0です。 出力の最下位ビット(LSB)は、実行される比較と、加算器/減算器によって実行される減算の結果によって決定されます。

比較 LSBの計算式th CFN
A = B LSB = ˶(Z˶) 01
A < B LSB = “\\” 10
A ≤ B LSB = “⏺️”(Z + (N ⏺️) 11

ALUモジュールのレベルでは。 加算器/減算器ユニットを制御して強制的に減算するにはFNを使用する必要があるため、FNはコンペアユニットの制御に使用されます。性能上の注意:この回路のZ、V、Nの入力は、32ビットの加算が完了した後に、加算器/減算器ユニットによってのみ計算されます。 つまり、これらの入力はかなり遅れて到着し、このモジュールでさらに処理が必要となるため、Yはかなり遅れて表示されることになります。 モジュールテストでは、Z、V、N、CFNのすべての組み合わせで正解が得られるようになっています。 SHIFTユニット論理左シフト(SHL),論理右シフト(SHR),算術右シフト(SRA)を実行する32ビットシフタを設計します。Aオペランドにはシフトするデータを入力し,Bオペランドの下位5ビットをシフトカウント(0から31ビットまでのシフト)として使用します。 以下のようにSFNにコード化することで、目的の動作を実現します。

操作 SFN
SHL (左シフト) 00
SHR (シフト 右シフト) 01
SRA(符号拡張による右シフト) 11

このエンコーディングでは。 SFNは、左シフトの場合は0、右シフトの場合は1で、右シフト時の符号拡張ロジックを制御します。 SHLおよびSHRでは、空いたビット位置に0がシフトされます。 SRA(shift right arithmetic)では、空いたビットに元のデータの符号ビットであるAを入れ、元のデータを適切な2の累乗で割ったのと同じ結果になるようにします。最も簡単な実装は、左シフト用と右シフト用の2つのシフターを作り、2ウェイ32ビットマルチプレクサを使って適切な答えをモジュールの出力として選択することです。 例えば、13ビットのシフトは、8のシフト、4のシフト、1のシフトの順に実行されます。 下の図は、左シフトロジックの可能な実装を示しています。右シフトロジックも同様ですが、SFNの値に応じて、0(すなわち「GND」)またはAのいずれかにシフトしなければならないという、若干の複雑さがあります。 ゲートを節約する別の方法として、左シフトロジックを左と右の両方のシフトに使用し、右シフトではAオペランドのビットを入力時に反転させ、出力時にビットを反転させます。
モジュールテストでは、3種類のシフトが正しく動作していることを確認します。 最終テスト4つのサブモジュールの設計が完了したら、ALUモジュールを選択し、そのテストを実行します。 このテストでは、各サブ回路のデバッグに使用したテスト・スイートが実行されるので、ブロック間の予期せぬ相互作用がない限り、テストをパスすることができます。 このテストが正常に終了すると、システムはデザインが完成したことを示します。 問題2. ALUのテストこの実験室の設計問題(上記)では、32ビットの演算子と論理演算を行い、32ビットの結果を出す32ビットのALU(算術論理演算装置)を作ります。 この実験室のテストでは、186個の異なる入力値を適用して、ALU回路を検証します。 私の知る限り、テストを楽しいと思う設計者はいません。回路を設計することは、それが動作するかどうかを確認することよりもはるかに面白いようです。 組み合わせ回路をテストするには、可能な限りの入力の組み合わせを試し、それぞれの入力の組み合わせを適用した後に正しい出力値が得られるかどうかを確認するのが分かりやすい方法です。 このような網羅的なテストは、組合せ回路の真理値表を列挙することで、正しい動作を証明するものです。 これは、入力数が少ない回路では有効な方法ですが、入力数が多い回路ではすぐに実用的ではなくなります。 設計問題で提案されているリップルキャリー加算器アーキテクチャは、32個の完全加算器モジュールを使用して32ビット加算器を作成します。
full adder

  1. 全加算器の1つのテストベクターは、3つの入力値(A、B、CIに各1つ)と2つの出力値(S、CO)で構成されています。 テストを実行するには、現在のテストベクターからの入力値を被試験デバイスに適用し、実際の出力値をテストベクターに記載されている期待値と比較します。 このプロセスは、すべてのテストベクターが使用されるまで繰り返されます。 全加算器の内部回路について何も知らないと仮定して、その機能を網羅的にテストするには、いくつのテストベクタが必要でしょうか。 全加算器を徹底的にテストするためのテスト ベクトルの数は?
  2. 64 個の入力 (2 つの 32 ビット入力オペランド、CIN は下の図のようにグランドに接続されていると仮定) と 32 個の出力 (32 ビットの結果) を持つ 32 ビット加算器を考えます。 内部の回路については何も知らないので、入力の組み合わせによっては間違った結果が出る可能性を排除できないとします。 つまり、2+3で正しい答えが出たからといって、2+7でどのような答えが出るのか、結論を出すことはできないのです。 100nsごとに1つのテストベクターを適用できるとしたら、加算器を網羅的にテストするにはどれくらいの時間がかかるでしょうか。 32 ビット加算器を網羅的にテストする時間は?
  3. 明らかに、入力値のすべての組み合わせを試して32ビット加算器をテストすることは、良い計画ではありません。 以下に、32 ビットのリップルキャリー加算器の回路図を示します。 右隣のビットからのキャリーインを除いて、加算器の各ビットは独立して動作しています。 この観察結果を利用して、加算器をビットごとにテストすることができ、少し考えれば、実際にこれらのテストの多くを並行して実行することができます。 この場合、加算器が2 + 3に対して正しい答えを出したという事実は、実際に2 + 7に対して出す答えについて多くのことを教えてくれます。 加算器のビット0とビット1で行われる計算はどちらも同じなので、2+3の答えが正しければ、2+7の答えの下位2ビットも正しいことになります。 そこで、リップルキャリー加算器をテストする計画は、各全加算器を独立してテストすることです。 ビットNをテストするときは、テストベクターから直接AとBを設定します。 CIを0にしたい場合、AとBはどのような値にすればよいでしょうか。 CIを1にしたい場合は? CIの値については何も仮定できないとする。 C=0にするためのAとBの値? A=0, B=0 A=1, B=0 A=0, B=1 A=1, B=1 C=1にするためのAとBの値は? A=0, B=0 A=1, B=0 A=0, B=1 A=1, B=1 この方法では、加算器の偶数ビットを1組のテストベクターで並列にテストし、奇数ビットを別のテストベクターで並列にテストすることができます。 ここでは、32ビットのリップルキャリー加算器の各FAの入力値のすべての組み合わせをテストするための10個のテストベクターのセットを紹介します。

    ビット0、2、… ビット1、3、…。 A B
    A=0, B=0, CI=0 A=0, B=0, CI=0 0x00000000 0x00000000
    A=1, B=0, CI=0 A=0, B=0, CI=0 0x555555 0x00000000
    A=0, B=1, CI=0 A=0, B=0, CI=0 0x00000000 0x555555
    A=1, B=1, CI=0 A=0, B=0, CI=1 0x555555
    A=0, B=0, CI=0 A=1, B=0, CI=0 0xAAAAAAAA 0x00000000
    A=0, B=0, CI=0 A=0, B=1, CI=0 0x00000000 0xAAAAAAAA
    A=0, B=0, CI=1 A=1, B=1, CI=0 0xAAAAAAAA
    A=1, B=0, CI=1 A=1, B=0, CI=1 0xFFFFFFFF 0x00000001
    A=0, B=1, CI=1 A=0, B=1, CI=1 0x00000001 0xFFFFFFFF
    A=1,B=1,CI=1 A=1,B=1, CI=1 0xFFFFFFFF

  4. コンペアユニットの入力のうち3つ(Z、V、N)は、A-Bを計算する減算モードで動作する加算器/減算器から来ています。
  5. A-Bが0の場合はZ = 1 N = 1 A-Bが負(OUT = 1)の場合はV = 1 オーバーフローがあった場合はV = 1。 加算器しか持っていないALUは、A-BをA+(-B)=A+(~B)+1として計算します。 結果(OUT)の符号が加算器のオペランド(A, XB)の符号と異なる場合、オーバーフローが発生します。 コンペアユニットをテストするには、Z、V、Nのすべての可能な組み合わせを生成する加算器/減算器のオペランドを選択する必要があります。Z = 1とN = 1の組み合わせは不可能であることは容易に理解できます(加算器の出力が同時にマイナスとゼロになることはありません!)。 以下に示すZ、V、Nの組み合わせについて、条件コードの指定された組み合わせになるような減算方法を選びなさい。 Z=0、V=0、N=0となる引き算は? 0x12345678 – 0x12345678 0x7FFFFFFF – 0xFFFFFFFF 0x00000005 – 0xDEADBEEF 0xDEADBEEF – 0x00000005 0x80000000 – 0x00000001 Z=1, V=0, N=0 を生成する減算は? 0x12345678 – 0x12345678 0x7FFFFFFF – 0xFFFFFFFF 0x00000005 – 0xDEADBEEF 0xDEADBEEF – 0x00000005 0x80000000 – 0x00000001 Z=0, V=1, N=0 を生成する減算は? 0x12345678 – 0x12345678 0x7FFFFFFF – 0xFFFFFFFF 0x00000005 – 0xDEADBEEF 0xDEADBEEF – 0x00000005 0x80000000 – 0x00000001 Z=0, V=0, N=1 を生成する減算は? 0x12345678 – 0x12345678 0x7FFFFFFF – 0xFFFFFFFF 0x00000005 – 0xDEADBEEF 0xDEADBEEF – 0x00000005 0x80000000 – 0x00000001 Z=0, V=1, N=1 を生成する減算は? 0x12345678 – 0x12345678 0x7FFFFFFF – 0xFFFFFFFF 0x00000005 – 0xDEADBEEF 0xDEADBEEF – 0x00000005 0x80000000 – 0x00000001 問題3. 万能BOOLユニット

    Bi Ai Yi
    0 0 d
    0 1 c
    1 0 b
    1 1 a

    ALUの命令で見たように。ビット単位のブール演算はFN=10で指定されています。 この場合,FNの残りのビットabcdは,右図のように,Yの各ビットがAとBの対応するビットによってどのように決定されるかを記述した真理値表の項目として扱われます。以下に示す各ブール演算\(F(A,B)\)について,Boolユニットが必要な演算を行うようにFNの設定を決定します。 AND(A,B): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 or(A,B): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 XOR(A,B): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 NAND(A,B): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 nor(a,b): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 xnor(a,b): FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 A: FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 B: FN= 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

div

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です