OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 28 to Rev 29
    Reverse comparison

Rev 28 → Rev 29

/trunk/sw/c/aeMB_testbench.c
1,33 → 1,33
/*
* $Id: aeMB_testbench.c,v 1.4 2007-04-25 22:15:05 sybreon Exp $
* $Id: aeMB_testbench.c,v 1.5 2007-04-27 15:17:59 sybreon Exp $
*
* AEMB Function Verification C Testbench
* Copyright (C) 2006 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
* Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
*
* This library 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 2.1 of the License,
* or (at your option) any later version.
* This library 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 2.1 of
* the License, or (at your option) any later version.
*
* This library 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.
* This library 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 this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* DESCRIPTION
* Runs a simple test programme that calculates fibonnaci numbers using two
* different methods. It tests a whole gamut of operations and is tightly
* linked to the ae68_testbench.v testbench module for verification.
*
* The fibonnaci code is from
* http://en.literateprograms.org/Fibonacci_numbers_(C)
* DESCRIPTION
* It tests a whole gamut of operations and is tightly linked to the
* ae68_testbench.v testbench module for verification.
*
* HISTORY
* $Log: not supported by cvs2svn $
* 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.
*
39,31 → 39,40
*
*/
 
/* Special Prototypes */
/**
INTERRUPT TEST
 
This tests for the following:
- Pointer addressing
- Interrupt handling
*/
void int_call_func (); // __attribute__((save_volatiles));
void int_handler_func () __attribute__ ((interrupt_handler));
 
/* Interrupt Handler */
void int_handler_func () {
int_call_func();
}
 
void int_call_func () {
int *p;
p = 0x88888888;
*p = 0x52544E49; // "INTR"
int* pio = (int*)0xFFFFFFFF;
*pio = 0x52544E49; // "INTR"
}
 
/* Recursive Version */
/**
FIBONACCI TEST
http://en.literateprograms.org/Fibonacci_numbers_(C)
 
unsigned int slowfib(unsigned int n)
This tests for the following:
- Recursion & Iteration
- 32/16/8-bit data handling
*/
 
unsigned int fib_slow(unsigned int n)
{
return n < 2 ? n : slowfib(n-1) + slowfib(n-2);
return n < 2 ? n : fib_slow(n-1) + fib_slow(n-2);
}
 
/* Iterative Version */
 
unsigned int fastfib(unsigned int n)
unsigned int fib_fast(unsigned int n)
{
unsigned int a[3];
unsigned int *p=a;
82,70 → 91,176
return p==a?*(p+2):*(p-1);
}
 
/* Various Test */
 
int main() {
int fib_test(int max) {
unsigned int n;
unsigned int fib_fast, fib_slow;
unsigned int fib_lut32[] = {0,
1,
1,
2,
3,
5,
8,
13,
21,
34,
55,
89,
144,
233};
 
unsigned short fib_lut16[] = {0,
1,
1,
2,
3,
5,
8,
13,
21,
34,
55,
89,
144,
233};
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
};
unsigned char fib_lut8[] = {0,
1,
1,
2,
3,
5,
8,
13,
21,
34,
55,
89,
144,
233};
for (n=0;n<14;n++) {
fib_slow = slowfib(n);
fib_fast = fastfib(n);
while ((fib_slow != fib_fast) ||
(fib_fast != fib_lut32[n]) ||
(fib_fast != fib_lut16[n]) ||
(fib_fast != fib_lut8[n])) {
// "FAIL"
fib_lut32[n] = 0x4C494146;
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;
}
// "PASS"
fib_lut32[n] = 0x53534150;
}
 
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;
}
 
/**
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 = 5;
 
// Fibonacci Test
if (fib_test(max) == -1) { *mpi = 0x4C494146; }
 
// Euclid Test
if (euclid_test(max) == -1) { *mpi = 0x4C494146; }
 
// Newton-Rhapson Test
if (newton_test(max) == -1) { *mpi = 0x4C494146; }
// ALL PASSED
return 0;
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.