Awesome
SVGameBoy
A systemVerilog implementation of the Game Boy on DE1-SoC
This was for CSEE 4840 Embedded System Design @ Columbia University
To make target files for DE1-SoC
make qsys && make quartus && make rbf
Accuracy
Blargg's tests
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
cpu instrs | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
dmg sound | :x: | :+1: | N/A | N/A | N/A | N/A | :x: |
instr timing | :+1: | :+1: | N/A | N/A | N/A | N/A | :+1: |
interrupt time | N/A | :x: | N/A | N/A | N/A | N/A | :x: |
mem timing | N/A | :+1: | N/A | N/A | N/A | N/A | :+1: |
mem timing 2 | :+1: | :+1: | N/A | N/A | N/A | N/A | :+1: |
oam bug | :x: | :x: | N/A | N/A | N/A | N/A | :x: |
Mooneye GB acceptance tests
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
add sp e timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
call timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
call timing2 | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
call cc_timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
call cc_timing2 | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
di timing GS | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
div timing | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
ei sequence | :+1: | :+1: | :+1: | :+1: | :x: | :+1: | :+1: |
ei timing | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
halt ime0 ei | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
halt ime0 nointr_timing | :+1: | :+1: | :+1: | :+1: | :+1: | :x: | :+1: |
halt ime1 timing | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
halt ime1 timing2 GS | :+1: | :+1: | :+1: | :+1: | :+1: | :x: | :+1: |
if ie registers | :+1: | :+1: | :+1: | :+1: | :+1: | :x: | :+1: |
intr timing | :+1: | :+1: | :+1: | :+1: | :+1: | :x: | :+1: |
jp timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
jp cc timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
ld hl sp e timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
oam dma_restart | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :x: |
oam dma start | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
oam dma timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :x: |
pop timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
push timing | :+1: | :x: | :x: | :+1: | :+1: | :+1: | :+1: |
rapid di ei | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
ret timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
ret cc timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
reti timing | :+1: | :x: | :+1: | :+1: | :+1: | :+1: | :+1: |
reti intr timing | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
rst timing | :+1: | :x: | :x: | :+1: | :+1: | :+1: | :+1: |
Instructions
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
daa | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
Interrupt handling
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
ie push | :+1: | :x: | :x: | :x: | :x: | :+1: | :+1: |
OAM DMA
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
basic | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
reg_read | :+1: | :+1: | :+1: | :x: | :x: | :+1: | :+1: |
sources dmgABCmgbS | :+1: | :+1: | :x: | :x: | :x: | :x: | :+1: |
Serial
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
boot sclk align dmgABCmgb | :x: | :+1: | :+1: | :x: | :x: | :+1: | :+1: |
PPU
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
hblank ly scx timing GS | :+1: | :+1: | :x: | :x: | :+1: | :x: | :x: |
intr 1 2 timing GS | :+1: | :+1: | :+1: | :+1: | :+1: | :x: | :x: |
intr 2 0 timing | :+1: | :+1: | :x: | :+1: | :+1: | :x: | :x: |
intr 2 mode0 timing | :+1: | :+1: | :x: | :x: | :+1: | :x: | :+1: |
intr 2 mode3 timing | :+1: | :+1: | :x: | :x: | :+1: | :x: | :+1: |
intr 2 oam ok timing | :+1: | :+1: | :x: | :x: | :+1: | :x: | :+1: |
intr 2 mode0 timing sprites | :x: | :+1: | :x: | :x: | :+1: | :x: | :x: |
lcdon timing dmgABCmgbS | :x: | :+1: | :x: | :x: | :x: | :x: | :x: |
lcdon write timing GS | :x: | :+1: | :x: | :x: | :x: | :x: | :x: |
stat irq blocking | :x: | :+1: | :+1: | :x: | :+1: | :x: | :+1: |
stat lyc onoff | :x: | :+1: | :x: | :x: | :x: | :x: | :x: |
vblank stat intr GS | :+1: | :+1: | :x: | :+1: | :+1: | :x: | :+1: |
Timer
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
div write | :+1: | :+1: | :x: | :+1: | :+1: | :+1: | :+1: |
rapid toggle | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tim00 div trigger | :+1: | :+1: | :+1: | :x: | :+1: | :+1: | :+1: |
tim00 | :+1: | :+1: | :x: | :+1: | :+1: | :+1: | :+1: |
tim01 div trigger | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tim01 | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: | :+1: |
tim10 div trigger | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tim10 | :+1: | :+1: | :x: | :+1: | :+1: | :+1: | :+1: |
tim11 div trigger | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tim11 | :+1: | :+1: | :x: | :+1: | :+1: | :+1: | :+1: |
tima reload | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tima write reloading | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
tma write reloading | :+1: | :+1: | :x: | :x: | :+1: | :+1: | :+1: |
MBC
Test | mooneye-gb | BGB | Gambatte | Higan | MESS | VerilogBoy | Ours |
---|
MBC1 | N/A | :+1: | N/A | N/A | N/A | N/A | :+1: |
MBC5 | N/A | :+1: | N/A | N/A | N/A | N/A | :+1: |
Note: MBC3 test ROM was not created at the time of testing.