示例#1
0
        /// <summary>
        /// 引数で与えられた命令セットをサポートし、メインメモリを持つ
        /// RISC-Vアーキテクチャの32bitCPUを生成する
        /// </summary>
        /// <param name="OptionsInstructionSet">拡張命令セットを表す文字列</param>
        /// <param name="mem">メインメモリとして使用するUInt32配列</param>
        public RV32_HaedwareThread(string OptionsInstructionSet, byte[] mem)
        {
            // 基本命令セットRV32I
            registerSet = new RV32_RegisterSet(new RV32_MemoryHandler(mem));

            alu = new RV32_Calculators(registerSet);
            lsu = new RV32_LoadStoreUnit(registerSet);

            decoder = new RV32_InstructionDecoder(registerSet, alu, lsu);
            decoder.AddDecoder(typeof(RV32I_Decoder));

            registerSet.AddMisa('I');
            registerSet.AddMisa('S');

            // 拡張命令セット
            foreach (char option in OptionsInstructionSet.ToCharArray())
            {
                registerSet.AddMisa(option);
                switch (option)
                {
                case 'M':     // RV32M 拡張命令セット
                    decoder.AddDecoder(typeof(RV32M_Decoder));
                    break;

                case 'A':     // RV32A 拡張命令セット
                    decoder.AddDecoder(typeof(RV32A_Decoder));
                    registerSet.Mem = new RV32_AtomicMemoryHandler(mem);
                    break;

                case 'C':     // RV32C 拡張命令セット
                    decoder.AddDecoder(typeof(RV32C_Decoder));
                    break;

                case 'F':     // RV32F 拡張命令セット
                    decoder.AddDecoder(typeof(RV32F_Decoder));
                    break;

                case 'D':     // RV32D 拡張命令セット
                    decoder.AddDecoder(typeof(RV32D_Decoder));
                    break;

                default:
                    break;
                }
            }
        }
 public RV32_InstructionDecoder(RV32_RegisterSet reg, RV32_Calculators alu, RV32_LoadStoreUnit lsu)
 {
     Reg      = reg;
     this.alu = alu;
     this.lsu = lsu;
 }