FPGA開発日記

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

ISSからハードウェアデコーダを自動生成してみる(2)

github.com

MIPSデコーダISSのデコードテーブルから自動生成してみる。MIPSISSは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']]
...

配列の要素はそれぞれ以下のようになっている。

  1. NAME 命令の名前
  2. OPCODE 31-26ビット
  3. OPCODE 25-21ビット
  4. OPCODE 20-16ビット
  5. OPCODE 15-11ビット
  6. OPCODE 10-06ビット
  7. OPCODE 05-00ビット
  8. INST_TYPE 制御信号を生成すべき命令のタイプ
  9. 生成すべき制御信号
  10. デコードキー (ISSデコーダを生成するのに使用する

この中で、8. のINST_TYPEは命令の種類を示し、ハードウェアがどのReservation Stationに命令を格納すべきかを指定している。Reservation Stationは以下の4つだ。 * ALU * BRANCH * LOAD * STORE ただしLOAD/STOREはハードウェア側で同じRSに格納するようにする。

さて、次回はこれで各命令の制御信号を生成してみる。