コード例 #1
0
        /// <summary>Risc-V CPU例外のインスタンスを初期化します</summary>
        public RiscvException(RiscvExceptionCause cause, UInt32 tval, RV32_RegisterSet reg) : base(Enum.GetName(typeof(RiscvExceptionCause), cause))
        {
            // nullチェック
            if (reg is null)
            {
                throw new ArgumentNullException("reg");
            }

            Data.Add("pc", reg.PC);
            Data.Add("cause", cause);
            Data.Add("tval", tval);
            reg.HandleException(cause, tval);
        }
コード例 #2
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;
                }
            }
        }
コード例 #3
0
        /// <summary>指定したメッセージおよびこの例外の原因となった内部例外への参照を使用して、Risc-V CPU例外のインスタンスを初期化します</summary>
        /// <param name="message">エラーを説明するメッセージ</param>
        /// <param name="innerException">現在の例外の原因である例外</param>
        public RiscvException(RiscvExceptionCause cause, UInt32 tval, RV32_RegisterSet reg, string message, Exception innerException) : base(Enum.GetName(typeof(RiscvExceptionCause), cause) + "\r\n" + message, innerException)
        {
            // nullチェック
            if (reg is null)
            {
                throw new ArgumentNullException("reg");
            }
            if (message is null)
            {
                throw new ArgumentNullException("message");
            }
            if (innerException is null)
            {
                throw new ArgumentNullException("innerException");
            }

            Data.Add("pc", reg.PC);
            Data.Add("cause", cause);
            Data.Add("tval", tval);
            reg.HandleException(cause, tval);
        }
コード例 #4
0
 /// <summary>
 /// Risc-V 32bitCPU ALU
 /// </summary>
 /// <param name="registerSet">演算入出力用レジスタ</param>
 public RV32_Calculators(RV32_RegisterSet registerSet)
 {
     reg = registerSet;
 }
コード例 #5
0
 /// <summary>
 /// Risc-V 倍精度浮動小数算術論理演算 FPU
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 public RV32_DoubleFpu(RV32_RegisterSet reg) : base(reg)
 {
 }
コード例 #6
0
 /// <summary>
 /// Risc-V Atomic Memory Operate LSU
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 public RV32_AmoLsu(RV32_RegisterSet reg, RV32_AbstractMemoryHandler mainMemory) : base(reg, mainMemory)
 {
 }
コード例 #7
0
 /// <summary>
 /// Risc-V ロードストアユニット
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 /// <param name="mainMemory">メインメモリ</param>
 public RV32_IntegerLsu(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory) : base(registerSet, mainMemory)
 {
 }
コード例 #8
0
 protected internal RV32_AbstractLoadStoreUnit(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory)
 {
     reg = registerSet;
 }
コード例 #9
0
 /// <summary>
 /// Risc-V 32bitCPU LSU
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 /// <param name="registerSet">メインメモリ</param>
 public RV32_LoadStoreUnit(RV32_RegisterSet registerSet)
 {
     reg = registerSet;
 }
コード例 #10
0
ファイル: RV32_Mac.cs プロジェクト: roy-n-roy/rv32Emulator
 /// <summary>
 /// Risc-V 乗除算ALU
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 public RV32_Mac(RV32_RegisterSet reg) : base(reg)
 {
 }
コード例 #11
0
 /// <summary>
 /// Risc-V 単精度浮動小数算術論理演算 FPU
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 public RV32_SingleFpu(RV32_RegisterSet reg) : base(reg)
 {
 }
コード例 #12
0
 /// <summary>指定したメッセージおよびこの例外の原因となった内部例外への参照を使用して、Risc-V CPU 環境呼び出し例外のインスタンスを初期化します</summary>
 /// <param name="message">エラーを説明するメッセージ</param>
 /// <param name="innerException">現在の例外の原因である例外</param>
 public RiscvEnvironmentCallException(PrivilegeLevel currentLevel, RV32_RegisterSet rs, string message, Exception innerException)
     : base((RiscvExceptionCause)((byte)currentLevel | 0x8U), 0, rs, message, innerException)
 {
 }
コード例 #13
0
 /// <summary>Risc-V CPU 環境呼び出し例外のインスタンスを初期化します</summary>
 public RiscvEnvironmentCallException(PrivilegeLevel currentLevel, RV32_RegisterSet rs) : base((RiscvExceptionCause)((byte)currentLevel | 0x8U), 0, rs)
 {
 }
コード例 #14
0
 protected internal RV32_AbstractCalculator(RV32_RegisterSet registerSet)
 {
     reg = registerSet;
 }
コード例 #15
0
 /// <summary>
 /// Risc-V 浮動小数ロードストアユニット
 /// </summary>
 /// <param name="registerSet">入出力用レジスタ</param>
 /// <param name="mainMemory">メインメモリ</param>
 public RV32_FloatPointLsu(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory) : base(registerSet, mainMemory)
 {
 }
コード例 #16
0
 public RV32_InstructionDecoder(RV32_RegisterSet reg, RV32_Calculators alu, RV32_LoadStoreUnit lsu)
 {
     Reg      = reg;
     this.alu = alu;
     this.lsu = lsu;
 }
コード例 #17
0
        /// <summary>
        /// Risc-V 算術論理ALU
        /// </summary>
        /// <param name="registerSet">入出力用レジスタ</param>

        public RV32_IntegerAlu(RV32_RegisterSet reg) : base(reg)
        {
        }