FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

MIPSのシステムレジスタを実装するための環境変更

前回、xv6の実装を確認するためにISSをバイナリで実行させたが、システムレジスタを実装していないことや、いくつかの命令を実装していないことが問題になった。 (そのときは緊急回避したが)。

msyksphinz.hatenablog.com

そこで、MIPSのシステムレジスタを実装するためのスケルトンを作成した。 ちなみに、MIPSアーキテクチャ仕様書はImagination Technologyのサイトからダウンロードできる。僕はこれを印刷して製本している(笑)

imgtec.com

imgtec.com

さて、RISC-Vでは既にシステムレジスタを実装しているため、それを元に拡張することにしよう。新たにmips_sysreg_table.rbを作成した。

github.com

...
                                                             Array[12, 8,'ASE','R'],
                                                             Array[ 4, 0,'MCCause','R']]]
$sysreg_table[ 9] = Array[0x52, 'RW', 'SegCtl0',       Array[Array[31,16,'CFG1', 'RW'],
                                                             Array[15, 0,'CFG0', 'RW']]]
$sysreg_table[10] = Array[0x53, 'RW', 'SegCtl1',       Array[Array[31,16,'CFG3', 'RW'],
                                                             Array[15, 0,'CFG2', 'RW']]]
$sysreg_table[11] = Array[0x54, 'RW', 'SegCtl2',       Array[Array[31,16,'CFG5', 'RW'],
                                                             Array[15, 0,'CFG4', 'RW']]]
$sysreg_table[12] = Array[0x55, 'RW', 'PWBase',        Array[Array[31, 0,'PWBase', 'RW']]]
$sysreg_table[13] = Array[0x56, 'RW', 'PWField',       Array[Array[29,24,'GDI', 'RW'],
                                                             Array[23,18,'UDI', 'RW'],
                                                             Array[17,12,'MDI', 'RW'],
                                                             Array[11, 6,'PTI', 'RW'],
                                                             Array[ 5, 0,'PTEI', 'RW']]]
$sysreg_table[14] = Array[0x57, 'RW', 'PWSize',        Array[Array[29,24,'GDW', 'RW'],
                                                             Array[23,18,'UDW', 'RW'],
                                                             Array[17,12,'MDW', 'RW'],
                                                             Array[11, 6,'PTW', 'RW'],
                                                             Array[ 5, 0,'PTEW', 'RW']]]
$sysreg_table[15] = Array[0x60, 'RW', 'Wired',         Array[Array[ 4, 0,'Wired', 'RW']]]
$sysreg_table[16] = Array[0x66, 'RW', 'PWCtl',         Array[Array[31,31,'PWEn', 'RW'],
                                                             Array[ 7, 7,'DPH', 'RW'],
                                                             Array[ 6, 6,'HugePg', 'RW'],
                                                             Array[ 5, 0,'PSn', 'RW']]]
$sysreg_table[17] = Array[0x70, 'RW', 'HWRena',        Array[Array[31,30,'Impl', 'RW'],
                                                             Array[29, 0,'Mask', 'RW']]]
$sysreg_table[18] = Array[0x80, 'R',  'BadVAddr',      Array[Array[31, 0,'BadVAddr','R']]]
$sysreg_table[19] = Array[0x81, 'R',  'BadInstr',      Array[Array[31, 0,'BadInstr','R']]]
$sysreg_table[20] = Array[0x82, 'R',  'BadInstrP',     Array[Array[31, 0,'BadInstrP','R']]]
$sysreg_table[21] = Array[0x90, 'RW', 'Count',         Array[Array[31, 0,'Conut','RW']]]
$sysreg_table[22] = Array[0x100,'RW', 'EntryHi',       Array[Array[31,13,'VPN2','RW'],
                                                             Array[12,11,'VPN2X','RW'],
                                                             Array[10,10,'EHINV','RW'],
                                                             Array[ 9, 8,'ASIDX','RW'],
                                                             Array[ 7, 0,'ASID','RW']]]
$sysreg_table[23] = Array[0x110,'RW', 'Compare',       Array[Array[31, 0,'Compare','RW']]]
$sysreg_table[24] = Array[0x120,'RW', 'Status',        Array[Array[31,28,'CU','RW'],
                                                             Array[27,27,'RP','RW'],
                                                             Array[26,26,'FR','RW'],
                                                             Array[25,25,'RE','RW'],
...

各システムレジスタの定義を記述している。これをRubyに掛けると、スケルトンを生成してくれるようにした。

ruby ./gen_sysreg_table.rb mips

すると、以下のファイルが自動生成されるようにした。

さらに、手動で読み書きの制御をするファイルを追加しておく。

  • mips_sysreg_func.cpp
...
}


int32_t CsrEnv::Read_PAGEGRAIN (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_SEGCTL0 (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_SEGCTL1 (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_SEGCTL2 (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_PWBASE (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_PWFIELD (Word_t *data)
{
    return 0;
}


int32_t CsrEnv::Read_PWSIZE (Word_t *data)
{
    return 0;
}

...

とりあえずこれでコンパイルはできるようになった。次は、これを命令側から読み込んで実行できるようにする。