フラグ出力は4ビットのバスであり、符号フラグ"S"、零フラグ"Z"、オーバー フローフラグ"V"、キャリーフラグ"C"があります。バスにおけるビットの順序 は上位桁から、この順序にしておきます。
この部分を alu.v として Verilog で記述してみましょう。
なお、ALUの設計からプロセッサの動作確認までは同じディレクトリ内で作業す ることに注意してください。
module alu (A, B, CB, Y, F); input [15:0] A; input [15:0] B; input [ 3:0] CB; output [15:0] Y; output [ 3:0] F; reg [16:0] tmp; // 演算結果 reg V; // for Overflow always @( A or B or CB ) begin case ( CB ) `IADD : tmp <= { 1'b0, A } + { 1'b0, B }; // 加算 ... ... ... ... ... ... ... ... ... `ILSR : tmp <= { A[0], 1'b0, A[15:1] }; // 論理右シフト ... ... ... ... default : tmp <= { 1'b0, A }; // パス演算(IPAS) endcase end assign Y = 結果の再代入; always @( A or B or tmp or CB ) case ( CB ) `IADD : V <= ( ( 条件式 ) && ( 条件式 ) ) ? 1 : 0; `ISUB : V <= ( ( 条件式 ) && ( 条件式 ) ) ? 1 : 0; `IINC : V <= ( ( 条件式 ) && ( 条件式 ) ) ? 1 : 0; `IDEC : V <= ( ( 条件式 ) && ( 条件式 ) ) ? 1 : 0; `IASL : V <= ( A[15] != tmp[15] ) ? 1 : 0; default : V <= 0; endcase assign F[3] = ...... ; // 符号フラグ assign F[2] = ...... ; // ゼロフラグ assign F[1] = V; // オーバーフローフラグ assign F[0] = ...... ; // キャリーフラグ endmodule
次は、 演算コードの定義 についてみていきます。