390 likes | 743 Views
マイクロプロセッサ. 第 8 回. プロセッサ:データパスと制御(その 2 ) HDL の導入. 関根 優年 田向 権. R 形式命令とメモリ参照命令用のデータパス統合. ALU 操作. 3. MemtoReg. 読出 reg 1. 読出 reg 1. レジスタ. ゼロ判定. 命令. MemWrite. 読出 reg2. ALUSrc. ALU. ALU 結果. M U X. 読出 reg2. 読出 データ. データ メモリ. M U X. 書込 reg. アドレス. 書込 データ. 書込 データ.
E N D
マイクロプロセッサ 第8回 プロセッサ:データパスと制御(その2) HDLの導入 関根 優年 田向 権
R形式命令とメモリ参照命令用のデータパス統合R形式命令とメモリ参照命令用のデータパス統合 ALU操作 3 MemtoReg 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 MemWrite 読出 reg2 ALUSrc ALU ALU結果 M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg アドレス 書込 データ 書込 データ RegWrite 符号 拡張 MemRead 32 16
命令フェッチ部分の追加 加算 4 命令 メモリ 命令アドレス PC ALU操作 3 MemtoReg 読出 reg1 読出 reg1 レジスタ ゼロ判定 MemWrite 命令 読出 reg2 ALUSrc ALU ALU結果 M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg アドレス 書込 データ 書込 データ RegWrite 符号 拡張 MemRead 32 16
MIPSアーキテクチャの単純なデータパス PCSrc M U X 加算 4 加算 2ビット 左に シフト 命令 メモリ 命令アドレス PC ALU操作 3 MemtoReg 読出 reg1 読出 reg1 レジスタ ゼロ判定 MemWrite 命令 ALUSrc 読出 reg2 ALU ALU結果 M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg アドレス 書込 データ 書込 データ RegWrite 符号 拡張 MemRead 32 16 条件分岐のデータパスを追加
ALUの制御 6ビット 5ビット 5ビット 6ビット 5ビット 5ビット 主制御部で opコードからALUop(2ビット)を作る ALU op(2ビット) 00:(load,store),01:beq, 10:機能コードfunctの演算(6ビット) キャリーイン a 複数レベルによる デコード法 0 入力 結果 1 b + 0 2 1 3 より小 セット オーバー フロー オーバーフロー 検出 最上位ビットの1ビットALU
ALU制御ユニット ALU制御ビットの構成
ALU制御ユニット ALUの制御入力とその機能 X : don’t care
主制御ユニットの設計 R形式 31-2625-2120-1615-1110-65-0 ロード/ストア 31-2625-2120-1615-0 分岐 31-2625-2120-1615-0 • 命令操作コード(opecode) :31-26 • 読み出しレジスタ: rsとrt:(25-21), (20-16) • ロード/ストアのベースアドレス: 25-21 • Beqのオフセットは15-0 • Dest(書き込み先)は20-16(ロード),15-11(rd)
マルチプレクサとALU制御線を加えたデータパスマルチプレクサとALU制御線を加えたデータパス PCSrc M U X 0 加算 4 加算 2ビット 左に シフト 1 命令 メモリ 命令アドレス PC RegWrite 命令 [25:21] MemtoReg 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] MemWrite ALUSrc 読出 reg2 命令[31:0] ALU 0 ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 1 3 命令 [15:11] 1 書込 データ 符号 拡張 RegDst 命令 [15:0] MemRead 32 16 ALU 制御 命令 [5:0] ALUOp
制御ユニットを加えたデータパス 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0]
他の制御信号について 命令操作コードと制御信号 Branch : 条件分岐を起こすかどうかを指定する制御信号。ALUからのゼロ判定との論理和をPCSrcへ
RegDst R形式 31-2625-2120-1615-1110-65-0 ロード/ストア 31-2625-2120-1615-0 分岐 31-2625-2120-1615-0 命令 メモリ 命令アドレス 命令 [25:21] 読出 reg1 読出 reg1 レジスタ 命令 [20:16] 読出 reg2 M U X 読出 reg2 書込 reg 命令[31:0] 0 1 書込 データ 命令 [15:11] RegDst 命令 [15:0] 16
RegWrite R形式 31-2625-2120-1615-1110-65-0 ロード/ストア 31-2625-2120-1615-0 分岐 31-2625-2120-1615-0 命令 メモリ RegWrite 命令アドレス 命令 [25:21] 読出 reg1 読出 reg1 レジスタ rd で指定されたレジスタ に書き込みを行う 命令 [20:16] 読出 reg2 M U X 読出 reg2 書込 reg 命令[31:0] 0 1 書込 データ 命令 [15:11] RegDst 命令 [15:0] 16
ALUSrc R形式 31-2625-2120-1615-1110-65-0 ロード/ストア 31-2625-2120-1615-0 分岐 31-2625-2120-1615-0 命令 メモリ RegWrite 命令アドレス 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ALUSrc 命令 [20:16] 読出 reg2 ALU結果 ALU M U X 0 M U X 読出 reg2 書込 reg 命令[31:0] 0 ALU操作 1 R形式の演算か 実行アドレス 計算をするか 3 書込 データ 1 命令 [15:11] 符号 拡張 RegDst 命令 [15:0] 16
MIPS命令の形式 II R形式(算術命令) I形式 J形式
R形式命令の最初の実行ステップ 加算 加算 M U X M U X 4 4 0 0 RegDst RegDst 制御 制御 Branch Branch 加算 加算 MemRead MemRead 命令 [31:26] 命令 [31:26] 2ビット 左に シフト 2ビット 左に シフト 1 1 MemtoReg MemtoReg ALUOp ALUOp 命令 メモリ 命令 メモリ 命令アドレス 命令アドレス MemWrite MemWrite PC PC AND AND ALUSrc ALUSrc RegWrite RegWrite 命令 [25:21] 命令 [25:21] 命令 [25:21] 読出 reg1 読出 reg1 読出 reg1 読出 reg1 レジスタ レジスタ ゼロ判定 ゼロ判定 命令 [20:16] 命令 [20:16] 読出 reg2 読出 reg2 命令[31:0] 命令[31:0] 1 ALU ALU 1 ALU結果 ALU結果 M U X M U X M U X M U X 読出 reg2 読出 reg2 読出 データ 読出 データ データ メモリ データ メモリ M U X M U X 書込 reg 書込 reg 0 0 アドレス アドレス 0 0 ALU操作 ALU操作 1 1 書込 データ 書込 データ 0 0 3 3 命令 [15:11] 命令 [15:11] 1 1 書込 データ 書込 データ 符号 拡張 符号 拡張 命令 [15:0] 命令 [15:0] 32 32 16 16 ALU 制御 ALU 制御 命令 [5:0] 命令 [5:0] 命令メモリからのフェッチとPCの繰り上げ
R形式命令の2番目の実行ステップ 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0] 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0] レジスタファイルからの2つのソースレジスタの読出し
R形式命令の3番目の実行ステップ 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] ALU 1 ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0] レジスタデータに対するALU演算
R形式命令の最後の実行ステップ 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0] 結果の書込み
ロード命令でのデータパス 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0]
Branch-on-equal命令用のデータパス 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0]
制御ユニットの仕上げ 制御関数の真理値表
ジャンプ命令の追加 ジャンプ先のアドレス[27-0] 2ビット 左に シフト ジャンプ先のアドレス[31-28] || [27-0] 命令[25-0] 26 28 PC+4[31-28] 1 M U X M U X 4 加算 0 RegDst Jump 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 0 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] ALU 1 ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0]
回路図から記述へ • ブロック図,論理回路図:作成が大変 • 回路の動作は明記されていない • 動作を読み解く必要がある. • 同時に多数のブロックの動作理解が必要 • ソフトの様に記述したい • 逐次的な動作順序の記述 • 並列的な動作の記述 • 階層的な記述 • データーの流れを記述
Hardware Description Language(HDL) • LSI設計を計算機で処理するために考案されてきた • 1960年頃,大型計算機の設計時に提案された.Design Description Language (DDL) ⇒ 当時は,計算機の能力が乏しく提案だけで終わってしまった. • 1980年代,LSI設計自動化ツールに使用され急速に発展 • 配置配線ツール,論理合成,RTLシミュレータ • ソフトからの高位合成,テスト生成 • 各企業毎に独自の言語, • 例)Hierarchical Hardware Design Language(H2DL) 東芝 • Verilog-HDL, VHDL: • 90年代,米国のEDAベンダーが市場を席捲.2つの言語が支配. 技術的理由より政治的,経済的に米国製言語が選択された.
モジュールの記述(Verilog) • 回路は入力出力があり,内部と外部との境界が必ずある. module LSI_A (in1, in2, in3, …, out1,out2,out3,…,); input in1,in2,in3,…, ; output out1,out2,out3,…,; 内部の回路構造の記述 endmodule
抽象レベルの異なる記述方法 module AND2 (in1, in2, out); input in1,in2; output out; wire in1, in2, out; //---------------------------------------------------// and u1 ( out, in1, in2 ); // 構造記述 //---------------------------------------------------// assign out = in1 & in2 ;//Register Transfer Level 記述 //---------------------------------------------------// reg out; always @(in1, in2) //Behavior (動作) 記述 out = in1 & in2 ; //---------------------------------------------------// endmodule;
4bit 加算器の例 module adder4( in1, in2, sum, zero); endmodule input [3:0] in1, in2; output [4:0] sum; output zero; reg [4:0] sum; assign zero = (sum == 0)? 1 : 0; initial sum = 0; always @(in1 or in2) // in1またはin2が変化したら sum = in1 + in2;
Half Adder module half_adder (iX, iY, oS, oC); endmodule input iX, iY; // 二つの1ビット入力 output oS, oC; // Sum, Carry,二つの1ビット出力 assign oS = iX ^ iY; // iX xor iY を oSに代入 assign oC = iX & iY; // iX and iY を oCに代入 harf_adder iX oS oC iY
Full Adder module full_adder (iX, iY, iC, oS, oC); endmodule input iX, iY; // 二つの1ビット入力 input iC; // Carry 入力 output oS, oC; // Sum, Carry,二つの1ビット出力 assign oS = 0; // 右辺を正しい論理式にせよ assign oC = 0; full_adder iX oS iY oC iC
half_adder half_adder u2 u1 iX iX oS oS oC oC iY iY Half Adderを組み合わせて作ったFull Adder module full_adder (iX, iY, iC, oS, oC); endmodule input iX, iY; // 二つの1ビット入力 input iC; // Carry 入力 output oS, oC; // Sum, Carry,二つの1ビット出力 wire s1, c1, c2; half_adder u1 (.iX(iX), .iY(iY), .oS(s1), .oC(c1)); half_adder u2 (.iX(s1), .iY(iC), .oS(oS), .oC(c2)); assign oC = c1 | c2; // c1 or c2 full_adder iC oS c2 s1 iX oC c1 iY
4bit adder 構造記述 module adder4( in1, in2, sum, zero); endmodule input [3:0] in1, in2; output [4:0] s; output zero; reg [4:0] s; wire c0, c1, c2; Full adderをカスケード接続し, 4ビット加算器を完成せよ. ※in1[1] // in1の1ビット目を指定 half_adder u1( .iX(in1[0]), .iY(in2[0]), .oC(c0), .oS(s[0])); full_adder u2 ( .iX( ), .iY( ), .iC( ), .oC( ), .oS( )); full_adder u3 ( .iX( ), .iY( ), .iC( ), .oC( ), .oS( )); full_adder u4 ( .iX( ), .iY( ), .iC( ), .oC( ), .oS( )); nor u5 ( zero, s[0], s[1], s[2], s[3], s[4] ); // zero = s[0] nor s[1] nor s[2] nor s[3] nor s[4]
マルチプレクサの例 module mult4to1( in1, in2, in3, in4, sel, out); endmodule input [31:0] in1, in2, in3, in4; // 32bit 入力4つ input [1:0] sel; // セレクタ信号 output reg [31:0] out; // 32bit 出力 always @ (in1, in2, in3, in4, sel) case (sel) // 4対1マルチプレクサ 0: out <= in1; 1: out <= in2; 2: out <= in3; default: out <= in4; // 0~2のどれでもない場合 endcase
32ビットALU ALU操作 a ゼロ判定 結果 オーバーフロー b キャリーアウト 冬休み課題 必須課題 • 以下は,これまでに説明したMIPSアーキテクチャ・データパスに含まれるALUである. このALUをVerilog HDLを用いて記述せよ. ※モジュールや信号名は適当に設定せよ. 配点上,未提出者は単位取得が困難になるので,全員必ず提出すること.
冬休み課題 挑戦課題 • 次ページに示す,MIPSアーキテクチャについて,可能な限りVerilog HDLで記述してみよ.提出は任意. 以下注意事項(必須,挑戦課題共通) • モジュール単位で部品を設計すること • ソースコードのみではなく,読みやすいように適宜コメントを入れること • 文法ミスや細かい記述ミスによる減点は行わない • 加点方式で評価するので,Verilogでの記述が分からない場合でも,どのような設計を行いたいのかを記すと良い • ワープロ可であるが友人やネットからのコピペは絶対禁止,発覚した際には試験のカンニングと同様の対応を取る • 提出日:2012年1月12日
制御ユニットを加えたデータパス 加算 M U X 4 0 RegDst 制御 Branch 加算 MemRead 命令 [31:26] 2ビット 左に シフト 1 MemtoReg ALUOp 命令 メモリ 命令アドレス MemWrite PC AND ALUSrc RegWrite 命令 [25:21] 読出 reg1 読出 reg1 レジスタ ゼロ判定 命令 [20:16] 読出 reg2 命令[31:0] 1 ALU ALU結果 M U X M U X 読出 reg2 読出 データ データ メモリ M U X 書込 reg 0 アドレス 0 ALU操作 1 書込 データ 0 3 命令 [15:11] 1 書込 データ 符号 拡張 命令 [15:0] 32 16 ALU 制御 命令 [5:0]