MIPSのデコーダをISSのデコードテーブルから自動生成してみる。MIPSのISSはC版しかないのだが、RISC-V版のデコーダだけ書き換えて一時的に作ってみた。
とりあえずこんな感じになっている。arch_tableとして表現されているArrayに、それぞれに命令の情報が格納されている。
module ARCH NAME = 0 OPCODE = 1 RS = 2 RT = 3 RD = 4 SHAMT = 5 FUNCT = 6 INST_TYPE = 7 INST_CTRL = 8 KEY_TABLE = 9 TAIL = 10 end ## start of RISC-V instructions # ['BITFIELD' 31-26, 25-21, 20-16 15-11 10-06 05-00 ] # ['DECODE-KEY', 'OPCODE', 'RS' 'RT', 'RD', 'SHAMT', 'FUNCT' 'KEY_TABLE' ] $arch_table[ 0] = Array['add d[15:11],d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100000', 'ALU', Array[ 'DST_RD', 'R1_RS', 'R2_RT', 'SIGN_ADD' ], Array['OPCODE', 'FUNCT', 'SHAMT'], ] $arch_table[ 1] = Array['addi d[20:16],d[25:21],h[15:0]', '001000', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ 'DST_RT', 'R1_RS', 'IMM', 'SIGN_ADD' ], Array['OPCODE']] $arch_table[ 2] = Array['addiu d[20:16],d[25:21],h[15:0]', '001001', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ 'DST_RT', 'R1_RS', 'IMM', 'USIGN_ADD' ], Array['OPCODE']] $arch_table[ 3] = Array['addu d[15:11],d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100001', 'ALU', Array[ 'DST_RD', 'R1_RS', 'R2_RT', 'USIGN_ADD' ], Array['OPCODE', 'FUNCT', 'SHAMT']] $arch_table[ 4] = Array['clo d[15:11],d[25:21]', '011100', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100001', 'ALU', Array[ 'DST_RD', 'R1_RS', 'COUNT_ONE' ], Array['OPCODE', 'FUNCT', 'SHAMT']] $arch_table[ 5] = Array['clz d[15:11],d[25:21]', '011100', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100000', 'ALU', Array[ 'DST_RD', 'R1_RS', 'COUNT_ZERO'], Array['OPCODE', 'FUNCT', 'SHAMT']] $arch_table[ 6] = Array['div d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', '00000', '00000', '011010', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'SIGN_DIV' ], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] $arch_table[ 7] = Array['divu d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', '00000', '00000', '011011', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'USIGN_DIV' ], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] $arch_table[ 8] = Array['madd d[25:21],d[20:16]', '011100', 'XXXXX', 'XXXXX', '00000', '00000', '000000', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'SIGN_MADD' ], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] $arch_table[ 9] = Array['maddu d[25:21],d[20:16]', '011100', 'XXXXX', 'XXXXX', '00000', '00000', '000001', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'USIGN_MADD'], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] $arch_table[ 10] = Array['msub d[25:21],d[20:16]', '011100', 'XXXXX', 'XXXXX', '00000', '00000', '000100', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'SIGN_MSUB' ], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] $arch_table[ 11] = Array['msubu d[25:21],d[20:16]', '011100', 'XXXXX', 'XXXXX', '00000', '00000', '000101', 'ALU', Array['SEPARATE', 'DST_M', 'R1_RS', 'R2_RT', 'USIGN_MSUB'], Array['OPCODE', 'FUNCT', 'RD', 'SHAMT']] ...
配列の要素はそれぞれ以下のようになっている。
- NAME 命令の名前
- OPCODE 31-26ビット
- OPCODE 25-21ビット
- OPCODE 20-16ビット
- OPCODE 15-11ビット
- OPCODE 10-06ビット
- OPCODE 05-00ビット
- INST_TYPE 制御信号を生成すべき命令のタイプ
- 生成すべき制御信号
- デコードキー (ISSがデコーダを生成するのに使用する
この中で、8. のINST_TYPEは命令の種類を示し、ハードウェアがどのReservation Stationに命令を格納すべきかを指定している。Reservation Stationは以下の4つだ。 * ALU * BRANCH * LOAD * STORE ただしLOAD/STOREはハードウェア側で同じRSに格納するようにする。
さて、次回はこれで各命令の制御信号を生成してみる。