AEMB core

It's become apparent that using an Ethernet PHY and Wishbone is really the realm of a microprocessor. Try as I might, I can't get anything intelligent out of my PHY and everyone else is just using a soft core. Since I'm loosely basing my implementation on that of the USRP2, I'll use the same aeMB core as them!

  • Download aeMB code from github, dump into the ISE proejct's ipcore_dir
  • Add all of the rtl and sim files to the project, fiddle with implementation/simulation tags so that I'm not overwhelmed
  • Wish there was an example application for it - the USRP2 code is pretty complex.
  • Attempt simulation
    • To make life easier (hopefully), I'll use the GCC that comes with EDK. Start the EDK bash shell.
    • cd to the ipcore_dir/aemb/sw/
    • Run gccrom script. Fails due to missing main() reference. Why isn't there a makefile or anything useful like that?
    • Try this instead: ./gccrom c/aeMB_testbench.c. Fails due to an invalid pointer conversion.
    • Fix this by changing line 277 to alloc = (int *)malloc(8 * sizeof(int)); // allocate 32 byte
    • This works, but I don't have srecord, which is used to generate a vmem file.
    • Download and try to compile with mingw, which I have installed. Don't have the C++ compiler installed!
    • Reinstall mingw with C++ and more stuff. Re-run configure.. requires Boost.
    • Find another distribution that has Boost, but not libtool and no mingw-get. Give up!
    • Try again later with Cygwin. This totally works! I'm back on track!
    • Give up on simulation for now!
  • Look at USRP2 implementation. An inferred block RAM is wrapped in a Wishbone interface and instruction and data caches.
  • Just use the USRP2 bits for now!
  • The USRP2 instruction RAM image is designed to be loaded using a CPLD - I just want to use it with a memory image file. Replace dpram32.v with a coregen?
    • stekern's orpsocv Atlys implementation of Openrisc uses MIG with Wishbone. Not sure I'll actually need megabytes of memory though!
    • The aeMB2 seems to implement its own instruction and data caches, whereas USRP has its own. Maybe it'd be better to use aeMB2? I wrote to the developers to ask if they had any advice on which top level to use.
      • The author says, "aeMB_edk32 is a single-threaded 3-stage pipeline core while the aeMB_edk62 is a dual-threaded 5-stage pipeline core. However, only the dual-threaded version is supported as the single-threaded version is deprecated."
    • Just wrapping the core generator in a Wishbone interface seems to be annoyingly tricky. Actually, it's not too bad!
  • Finish doing that - attempt to compile test program, but even with some fiddling it's enormous (32 KB). Actually it's not - that's just the vmem file, which is a big ASCII one
  • Actually, what the heck is an vmem file? It's a file that the Verilog $readmemh function can load, but does that work with BRAMs? Coregen wants a coe file.


Let's try simulating sim/verilog/edk62.v

  • Get rid of the aeMB_* files, add all of the aeMB2_* ones.
  • Add sim/verilog/edk62.v
  • Modify $readmemh lines to include the path of the vmem file.
  • Run!
  • It looks like it's retrieving the first word from iram, which according to rom.dump is the location of the start of the program.
  • It then tries to retrieve data from iram[1], which is undefined, and stops.
  • Possibly a mis-match between the EDK compiler and the aeMB compiler? Let's try replacing the first few instructions with NOPs.. or something like an or r0,r0,r0 (0x80000000)
  • This doesn't help either! It doesn't look like it's actually trying to jump to an invalid address or anything.
  • Trace to three undefined signals in aeMB2_ctrl.v line 207 - ask author for clarification on these.
  • Author suggests using sim/verilog/edk63.v instead, and the testbench.cc.
  • This seems to work far better! The code uses iprintf() calls and it's not clear if isim supports these, but I'll dig a bit more.

Other ideas:

  • Just buy the EDK! ~$500
  • I could use Lattice Mico32, which has Wishbone and SPI (and a TEMAC, though it's not free either) - couldn't see any really easy guides for using it with ISE, though.