diff options
Diffstat (limited to 'fpga/usrp2/opencores/aemb/sw')
| -rw-r--r-- | fpga/usrp2/opencores/aemb/sw/c/aeMB_testbench.c | 385 | ||||
| -rw-r--r-- | fpga/usrp2/opencores/aemb/sw/c/endian-test.c | 86 | ||||
| -rw-r--r-- | fpga/usrp2/opencores/aemb/sw/c/libaemb.h | 218 | ||||
| -rwxr-xr-x | fpga/usrp2/opencores/aemb/sw/gccrom | 62 | 
4 files changed, 0 insertions, 751 deletions
diff --git a/fpga/usrp2/opencores/aemb/sw/c/aeMB_testbench.c b/fpga/usrp2/opencores/aemb/sw/c/aeMB_testbench.c deleted file mode 100644 index c3402e0ef..000000000 --- a/fpga/usrp2/opencores/aemb/sw/c/aeMB_testbench.c +++ /dev/null @@ -1,385 +0,0 @@ -/* $Id: aeMB_testbench.c,v 1.14 2007/12/28 21:44:04 sybreon Exp $ -**  -** AEMB Function Verification C Testbench -** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net> -** -** This file is part of AEMB. -** -** AEMB is free software: you can redistribute it and/or modify it -** under the terms of the GNU General Public License as published by -** the Free Software Foundation, either version 3 of the License, or -** (at your option) any later version. -** -** AEMB is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public -** License for more details. -** -** You should have received a copy of the GNU General Public License -** along with AEMB.  If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <malloc.h> -#include <errno.h> -#include <reent.h> - -#include "libaemb.h" - -/** -   INTERRUPT TEST - -   This tests for the following: -   - Pointer addressing -   - Interrupt handling - */ - -void __attribute__ ((interrupt_handler)) int_handler(); -volatile int service = 0xDEADDEAD; - -void int_service()  -{ -  int* pio = (int*)0xFFFFFFFC; -  *pio = 0x52544E49; // "INTR" -  service = 0; -} - -void int_handler() -{ -  int_service(); -} - -/** -   INTERRUPT TEST ROUTINE -*/ -int int_test () -{ -  // Delay loop until hardware interrupt triggers -  volatile int i; -  for (i=0; i < 999; i++) { -    if (service == 0) return 0; -  }; - -  return -1; -} - -/** -   FIBONACCI TEST -   http://en.literateprograms.org/Fibonacci_numbers_(C) - -   This tests for the following: -   - Recursion & Iteration -   - 32/16/8-bit data handling -*/ - -unsigned int fib_slow(unsigned int n) -{ -  return n < 2 ? n : fib_slow(n-1) + fib_slow(n-2); -} - -unsigned int fib_fast(unsigned int n) -{ -  unsigned int a[3]; -  unsigned int *p=a; -  unsigned int i; -   -  for(i=0; i<=n; ++i) { -    if(i<2) *p=i; -    else { -      if(p==a) *p=*(a+1)+*(a+2); -      else if(p==a+1) *p=*a+*(a+2); -      else *p=*a+*(a+1); -    } -    if(++p>a+2) p=a; -  } -   -  return p==a?*(p+2):*(p-1); -} - -int fib_test(int max) { -  unsigned int n; -  unsigned int fast, slow;   -  // 32-bit LUT -  unsigned int fib_lut32[] = { -    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 -  };   -  // 16-bit LUT -  unsigned short fib_lut16[] = { -    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 -  };     -  // 8-bit LUT -  unsigned char fib_lut8[] = { -    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 -  };   -   -  for (n=0;n<max;n++) { -    slow = fib_slow(n);     -    fast = fib_fast(n); -    if ((slow != fast) ||  -	(fast != fib_lut32[n]) ||  -	(fast != fib_lut16[n]) ||  -	(fast != fib_lut8[n])) { -      return -1;       -    } -  }       -  return 0;   -} - -/** -   EUCLIDEAN TEST -   http://en.literateprograms.org/Euclidean_algorithm_(C) -    -   This tests for the following: -   - Modulo arithmetic -   - Goto -*/ - -int euclid_gcd(int a, int b) { -  if (b > a) goto b_larger; -  while (1) { -    a = a % b; -    if (a == 0) return b; -  b_larger: -    b = b % a; -    if (b == 0) return a; -  } -} - -int euclid_test(int max)  -{ -  int n; -  int euclid; -  // Random Numbers -  int euclid_a[] = { -    1804289383, 1681692777, 1957747793, 719885386, 596516649, -    1025202362, 783368690, 2044897763, 1365180540, 304089172, -    35005211, 294702567, 336465782, 278722862 -  };   -  int euclid_b[] = { -    846930886, 1714636915, 424238335, 1649760492, 1189641421, -    1350490027, 1102520059, 1967513926, 1540383426, 1303455736, -    521595368, 1726956429, 861021530, 233665123 -  }; -   -  // GCD  -  int euclid_lut[] = { -    1, 1, 1, 2, 1, 1, 1, 1, 6, 4, 1, 3, 2, 1 -  }; -     -  for (n=0;n<max;n++) { -    euclid = euclid_gcd(euclid_a[n],euclid_b[n]); -    if (euclid != euclid_lut[n]) { -      return -1; -    } -  } -  return 0; -} - -/** -   NEWTON-RHAPSON -   http://en.literateprograms.org/Newton-Raphson's_method_for_root_finding_(C) - -   This tests for the following: -   - Multiplication & Division -   - Floating point arithmetic -   - Integer to Float conversion -*/ - -float newton_sqrt(float n) -{ -  float x = 0.0; -  float xn = 0.0;   -  int iters = 0;   -  int i; -  for (i = 0; i <= (int)n; ++i) -    { -      float val = i*i-n; -      if (val == 0.0) -	return i; -      if (val > 0.0) -	{ -	  xn = (i+(i-1))/2.0; -	  break; -	} -    }   -  while (!(iters++ >= 100 -	   || x == xn)) -    { -      x = xn; -      xn = x - (x * x - n) / (2 * x); -    } -  return xn; -} - -int newton_test (int max) { -  int n; -  float newt; -  // 32-bit LUT -  float newt_lut[] = { -    0.000000000000000000000000, -    1.000000000000000000000000, -    1.414213538169860839843750, -    1.732050776481628417968750, -    2.000000000000000000000000, -    2.236068010330200195312500, -    2.449489831924438476562500, -    2.645751237869262695312500, -    2.828427076339721679687500, -    3.000000000000000000000000, -    3.162277698516845703125000, -    3.316624879837036132812500, -    3.464101552963256835937500, -    3.605551242828369140625000, -    3.741657495498657226562500 -  }; - -  for (n=0;n<max;n++) { -    newt = newton_sqrt(n); -    if (newt != newt_lut[n]) { -      return -1; -    } -  }  -  return 0; -} - - -/** -   FSL TEST ROUTINE -*/ - -int fsl_test () -{ -  // TEST FSL1 ONLY -  int FSL = 0xCAFEF00D; - -  asm ("PUT %0, RFSL1" :: "r"(FSL)); -  asm ("GET %0, RFSL1" : "=r"(FSL)); -   -  if (FSL != 0x01) return -1; -   -  asm ("PUT %0, RFSL31" :: "r"(FSL)); -  asm ("GET %0, RFSL31" : "=r"(FSL)); -   -  if (FSL != 0x1F) return -1; -   -  return 0;   -} - -// static int errnum; -/* -int *__errno () -{ -  return &_REENT->_errno; -  // return &errnum; -} -*/ - -int malloc_test() -{ -  void *alloc; - -  alloc = (void *)malloc(256); // allocate 32 bytes - -  if (alloc == NULL) -    return -1; -  else -    return (int) alloc; -} - -/** -   MAIN TEST PROGRAMME - -   This is the main test procedure. It will output signals onto the -   MPI port that is checked by the testbench. - */ - -int main ()  -{ -  // Message Passing Port -  int* mpi = (int*)0xFFFFFFFF; -   -  // Number of each test to run -  int max = 10; - -  // lock T0 if it's multi-threaded -  /* -  if ((aemb_isthreaded() == 0) && (aemb_isthread1() != 0)) { -    while (1) { -      asm volatile ("nop;"); -    } -  } -  */ - -  // Enable Global Interrupts -  aemb_enable_interrupt(); - -  // INT TEST -  //if (int_test() == -1) { *mpi = 0x4641494C; } - -  // TEST MALLOC -  if (malloc_test() == -1) { *mpi = 0x4641494C; } - -  // FSL TEST -  //if (fsl_test() == -1) { *mpi = 0x4641494C; } - -  // Fibonacci Test -  if (fib_test(max) == -1) { *mpi = 0x4641494C; } - -  // Euclid Test -  if (euclid_test(max) == -1) { *mpi = 0x4641494C; } - -  // Newton-Rhapson Test -  if (newton_test(max) == -1) { *mpi = 0x4641494C; } -   -  // Disable Global Interrupts -  aemb_disable_interrupt(); - -  // ALL PASSED -  return 0; -} - -/* -  HISTORY -  $Log: aeMB_testbench.c,v $ -  Revision 1.14  2007/12/28 21:44:04  sybreon -  Added malloc() test - -  Revision 1.13  2007/12/11 00:44:31  sybreon -  Modified for AEMB2 -   -  Revision 1.12  2007/11/18 19:41:45  sybreon -  Minor simulation fixes. -   -  Revision 1.11  2007/11/14 23:41:06  sybreon -  Fixed minor interrupt test typo. -   -  Revision 1.10  2007/11/14 22:12:02  sybreon -  Added interrupt test routine. -   -  Revision 1.9  2007/11/09 20:51:53  sybreon -  Added GET/PUT support through a FSL bus. -   -  Revision 1.8  2007/11/03 08:40:18  sybreon -  Minor code cleanup. -   -  Revision 1.7  2007/11/02 18:32:19  sybreon -  Enable MSR_IE with software. -   -  Revision 1.6  2007/04/30 15:57:10  sybreon -  Removed byte acrobatics. -   -  Revision 1.5  2007/04/27 15:17:59  sybreon -  Added code documentation. -  Added new tests that test floating point, modulo arithmetic and multiplication/division. -   -  Revision 1.4  2007/04/25 22:15:05  sybreon -  Added support for 8-bit and 16-bit data types. -   -  Revision 1.3  2007/04/04 14:09:04  sybreon -  Added initial interrupt/exception support. -   -  Revision 1.2  2007/04/04 06:07:45  sybreon -  Fixed C code bug which passes the test -   -  Revision 1.1  2007/03/09 17:41:57  sybreon -  initial import   -*/ diff --git a/fpga/usrp2/opencores/aemb/sw/c/endian-test.c b/fpga/usrp2/opencores/aemb/sw/c/endian-test.c deleted file mode 100644 index b585f7a30..000000000 --- a/fpga/usrp2/opencores/aemb/sw/c/endian-test.c +++ /dev/null @@ -1,86 +0,0 @@ - -#include "memory_map.h" - -int main() { -  char *p = (char *)0x4000; -  short *q = (short *)0x5000; -  int *r= (int *)0x6000; - -  int *output = (int *)0x7000; - -  char s; -  short t; -  int u; - -  // Write -  // Bytes -  *p = (char)1; -  p++; -  *p = (char)2; -  p++; -  *p = (char)3; -  p++;  -  *p = (char)4; -  p++; -  *p = (char)5; - -  // Words -  *q = (short) 0x1112; -  q++; -  *q = (short) 0x1314; -  q++; -  *q = (short) 0x1516; - -  // Double Words -  *r = 0x21222324; -  r++; -  *r = 0x25262728; -  r++; -  *r = 0x292a2b2c; - - -  // Read -  p = (char *)0x6000; -  s = *p; -  if(s == 0x21) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - -  p = (char *)0x6001; -  s = *p; -  if(s == 0x22) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - -  p = (char *)0x6002; -  s = *p; -  if(s == 0x23) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - - -  p = (char *)0x6003; -  s = *p; -  if(s == 0x24) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - -  q = (short *)0x4000; -  t = *q; -  if(t == 0x0102) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - -  r = (int *)0x4000; -  u = *r; -  if(u == 0x01020304) -    *output = 0x53534150;  // PASS -  else -    *output = 0x4C494146;  // FAIL - -} diff --git a/fpga/usrp2/opencores/aemb/sw/c/libaemb.h b/fpga/usrp2/opencores/aemb/sw/c/libaemb.h deleted file mode 100644 index 329a327a1..000000000 --- a/fpga/usrp2/opencores/aemb/sw/c/libaemb.h +++ /dev/null @@ -1,218 +0,0 @@ -/* $Id: libaemb.h,v 1.3 2007/12/16 03:26:37 sybreon Exp $ -** -** AEMB2 CUSTOM LIBRARY -**  -** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net> -**   -** This file is part of AEMB. -** -** AEMB is free software: you can redistribute it and/or modify it -** under the terms of the GNU Lesser General Public License as -** published by the Free Software Foundation, either version 3 of the -** License, or (at your option) any later version. -** -** AEMB is distributed in the hope that it will be useful, but WITHOUT -** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General -** Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with AEMB. If not, see <http:**www.gnu.org/licenses/>. -*/ - -#ifndef LIBAEMB_H -#define LIBAEMB_H - -#define AEMB_TXE 0x0100 -#define AEMB_TXP 0x0400 -#define AEMB_TX0 0x0300 -#define AEMB_TX1 0x0700 -#define AEMB_MSK 0x0F00 - -#define AEMB_BIP 0x0008 -#define AEMB_CCC 0x0004 -#define AEMB_ITE 0x0002 -#define AEMB_BLE 0x0001 - - -// Linker symbols -extern void* _STACK_SIZE; -extern void* _stack_end; - - -void aemb_hook_init () asm ("_program_init"); -void aemb_hook_clean () asm ("_program_clean"); - -inline void aemb_enable_interrupt (); -inline void aemb_disable_interrupt (); -inline int aemb_isthread1(); -inline int aemb_isthread0(); -inline int aemb_isthreaded(); - -/*! -* Assembly macro to enable MSR_IE -*/ -void aemb_enable_interrupt () -{ -  int msr, tmp; -  asm volatile ("mfs %0, rmsr;" -		"ori %1, %0, 0x02;" -		"mts rmsr, %1;" -		: "=r"(msr) -		: "r" (tmp) -		); -} - -/*! -* Assembly macro to disable MSR_IE -*/ -void aemb_disable_interrupt () -{ -  int msr, tmp; -  asm volatile ("mfs %0, rmsr;" -		"andi %1, %0, 0xFD;" -		"mts rmsr, %1;" -		: "=r"(msr) -		: "r" (tmp) -		); -} - -/*! -* Bootstrap Hook Override -*/ - -void aemb_hook_init () -{ -  int msr, tmp; -  int stk_end, stk_siz; - -  /* -  // Check to see if hardware threads are enabled -  if (((msr & AEMB_TXE) != AEMB_TXE) || -  // Check to see if second thread is started -      ((msr & AEMB_TX1) == AEMB_TX1)) return; -  */ -  //return; -  asm volatile ("mfs %0, rmsr;" -		// Check for BIP -		"andi %1, %0, %5;" -		"xori %1, %1, %5;" -		"beqi %1, 44;" - -		// Check for TXE -		"andi %1, %0, %2;" -		"xori %1, %1, %2;" -		"bnei %1, 36;"	 - -		// Check for TX1 -		"andi %1, %0, %3;" -		"xori %1, %1, %3;" -		"beqi %1, 20;" -		 -		// reallocate stack pointer for T0 -		"ori %1, r0, %4;" -		"sra %1, %1;" -		"rsubk r1, %1, r1;" - -		// reboot the machine -		//"brki r0, _crtinit;" -		"brid 0;" -		"nop;" - -		// clear BIP -		"andni %1, %0, %5;" -		"mts rmsr, %1;" -		 -		:"=r"(msr), "=r"(tmp) -		:"i"(AEMB_TXE), "i"(AEMB_TX1), "i"(&_STACK_SIZE), "i"(AEMB_BIP) -		); - -} - -/*! - Undo the changes made by programme init -*/ - -void aemb_hook_clean () -{ -  int msr, tmp; -  int stk_end, stk_siz; - -  /* -  // Check to see if hardware threads are enabled -  if (((msr & AEMB_TXE) != AEMB_TXE) || -  // Check to see if second thread is started -      ((msr & AEMB_TX1) == AEMB_TX1)) return; -  */ -  return; -  asm volatile ("mfs %0, rmsr;" -		"andi %1, %0, %2;" -		"xori %1, %1, %2;" -		"bnei %1, 28;"		 -		"andi %1, %0, %3;" -		"xori %1, %1, %3;" -		"beqi %1, 16;" -		 -		// reallocate stack pointer for T0 -		"ori %1, r0, %4;" -		"sra %1, %1;" -		"addk r1, %1, r1;" - -		:"=r"(msr), "=r"(tmp) -		:"i"(AEMB_TXE), "i"(AEMB_TX1), "i"(&_STACK_SIZE) -		); - -   -} - -/* Checks if it's T1, and returns 0 if true */ - -int aemb_isthread1 () -{ -  int msr, tmp, res; -  asm volatile ("mfs %0, rmsr;" -		"andi %1, %0, %3;" -		"xori %1, %1, %3;"	        -		:"=r"(msr), "=r"(tmp) -		:"i"(AEMB_TXE), "i"(AEMB_TXP) -		); -  return tmp;   -} - -/* Checks if it's T0, and returns 0 if true */ - -int aemb_isthread0 () -{ -  int msr, tmp, res; -  asm volatile ("mfs %0, rmsr;" -		"andi %1, %0, %3;" -		"xori %1, %1, %2;"	        -		:"=r"(msr), "=r"(tmp) -		:"i"(AEMB_TXP), "i"(AEMB_MSK) -		); -  return tmp;   -} - -/* Checks if TXE is available, and returns 0 if true */ - -int aemb_isthreaded () -{ -  int msr, tmp, res; -  asm volatile ("mfs %0, rmsr;" -		"andi %1, %0, %2;" -		"xori %1, %1, %2;"	        -		:"=r"(msr), "=r"(tmp) -		:"i"(AEMB_TXE), "i"(AEMB_MSK) -		); -  return tmp;   -} - -#endif - -/* $Log: libaemb.h,v $ -/* Revision 1.3  2007/12/16 03:26:37  sybreon -/* Made T0 loop. -/* -/* Revision 1.1  2007/12/11 00:44:04  sybreon -/* initial import -/* */ diff --git a/fpga/usrp2/opencores/aemb/sw/gccrom b/fpga/usrp2/opencores/aemb/sw/gccrom deleted file mode 100755 index f6e581f1f..000000000 --- a/fpga/usrp2/opencores/aemb/sw/gccrom +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -# $Id: gccrom,v 1.13 2008/01/19 16:42:54 sybreon Exp $ - -# Compile using C++ pre-processor -mb-g++ -g -Wl,-defsym -Wl,_HEAP_SIZE=0x800 -mxl-soft-div -msoft-float -mxl-barrel-shift -mno-xl-soft-mul -mno-clearbss $@ -o rom.elf -lc_m_bs -lm_m_bs && \ - -# Create a text listing of the compiled code -mb-objdump -DSC rom.elf > rom.dump && \ - -# Convert the ELF file to an SREC file -mb-objcopy -O srec rom.elf rom.srec && \ - -# Generate a Verilog VMEM file from the SREC file -srec_cat rom.srec -o ../sim/dump.vmem -vmem 32 && \ - -# Cleanup code -rm rom.srec && \ - -# Say Cheeze! -echo "ROM generated" - -# $Log: gccrom,v $ -# Revision 1.13  2008/01/19 16:42:54  sybreon -# Uses multiplier + barrel shifter as default. -# -# Revision 1.12  2007/12/11 00:44:32  sybreon -# Modified for AEMB2 -# -# Revision 1.11  2007/11/30 17:09:27  sybreon -# Minor code cleanup. -# -# Revision 1.10  2007/11/20 18:35:34  sybreon -# Generate VMEM instead of HEX dumps of programme. -# -# Revision 1.9  2007/11/18 19:41:46  sybreon -# Minor simulation fixes. -# -# Revision 1.8  2007/11/09 20:52:37  sybreon -# Added some compilation optimisations. -# -# Revision 1.7  2007/11/04 05:16:25  sybreon -# Added -msoft-float and -mxl-soft-div compiler flags. -# -# Revision 1.6  2007/11/02 03:25:46  sybreon -# New EDK 3.2 compatible design with optional barrel-shifter and multiplier. -# Fixed various minor data hazard bugs. -# Code compatible with -O0/1/2/3/s generated code. -# -# Revision 1.5  2007/10/22 19:14:38  sybreon -# Recommended to compile code with -O2/3/s -# -# Revision 1.4  2007/04/30 15:57:31  sybreon -# Modified compilation sequence. -# -# Revision 1.3  2007/04/25 22:15:06  sybreon -# Added support for 8-bit and 16-bit data types. -# -# Revision 1.2  2007/04/04 06:14:39  sybreon -# Minor changes -# -# Revision 1.1  2007/03/09 17:41:56  sybreon -# initial import  | 
