Evaluation of OPENRISC CPU
1. Environment
Let's make environment under cygwin.
Here is a makefile on hello_uart. You need to change the
following line for your environment on each makefile.
cp *.ihex f:/orp_soc/rtl/verilog/mem_if
ifndef CROSS_COMPILE
CROSS_COMPILE = or32-uclinux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
endif
export CROSS_COMPILE
.SUFFIXES: .or32
all: hello.or32
reset.o: reset_with_cache.S Makefile board.h
$(CC) -g -c -o $@ $< $(CFLAGS) -Wa,-alnds=$*.log
hello.o: hello.c Makefile board.h
$(CC) -g -c -o $@ $< $(CFLAGS) -Wa,-alnds=$*.log
hello.or32: reset_with_cache.o hello.o Makefile
$(LD) -Tram.ld -o $@ reset_with_cache.o hello.o $(LIBS)
$(OBJCOPY) -O srec $@ $*.srec
$(OBJCOPY) -O ihex $@ $*.ihex
$(OBJDUMP) -S $@ > $*.S
cp *.ihex f:/orp_soc/rtl/verilog/mem_if
System.map: hello.or32
@$(NM) $< | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
sort > System.map
#########################################################################
clean:
find . -type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o' -o -name '*.a' -o -name '*.tmp' \
-o -name '*.or32' -o -name '*.bin' -o -name '*.srec' -o -name '*.ihex' \
-o -name '*.mem' -o -name '*.img' -o -name '*.out' \
-o -name '*.aux' -o -name '*.log' \) -print \
| xargs rm -f
rm -f System.map
rm -f onchip_ram_bank?.mif
rm -f onchip_ram_bank?.v
rm -f hello.S
distclean: clean
find . -type f \
\( -name .depend -o -name '*.srec' -o -name '*.bin' \
-o -name '*.pdf' \) \
-print | xargs rm -f
rm -f $(OBJS) *.bak tags TAGS
rm -fr *.*~
2. C source Execution
2.1 hello_uart

Here is a simple c source (main routine only)
char *str = "Hello OR1200 world!!!\n";
int main (void)
{
char *s;
int i;
for (i=0;i<10;i++) {
print("Debug Port Test\n");
}
uart_init ();
for (s = str; *s; s++)
uart_putc (*s);
print("$finish");
return 0;
}
2.2 count

2.3 Dhrystone

Test Start 209360ns
Test Stop 2902860ns
(gcc -O3 is used. cache instruction 8KB/Data 8KB)
Since 100 cycles was done,
1 Cycle Time=(2902860-209360)/100=26935ns
This means
37100iterations/Sec at 50MHz Clock
=>742iterations/sec/MHz
(YACC is 59600iterations/Sec at 50MHz Clock =>1192iterations/sec/MHz
)
You can see the comparison report of LEON2, microblaze, and OPENRISC cpus.
2.4 Reed Solomon

This bench takes about 1.3msec, which means 2times slower than YACC(650usec)
at 50MHz clock. You should understand YACC uses Dual PORT RAM, while Openrisc
uses One-Port RAM with cache mechanism and MMU. As you know this is not
fair comparison.