|
Message
From: cvs at opencores.org<cvs@o...>
Date: Fri Apr 27 17:17:59 CEST 2007
Subject: [cvs-checkins] MODIFIED: aemb ...
Date: 00/07/04 27:17:17 Modified: aemb/sw/c aeMB_testbench.c Log: Added code documentation. Added new tests that test floating point, modulo arithmetic and multiplication/division. Revision Changes Path 1.5 aemb/sw/c/aeMB_testbench.c http://www.opencores.org/cvsweb.shtml/aemb/sw/c/aeMB_testbench.c.diff?r1=1.4&r2=1.5 (In the diff below, changes in quantity of whitespace are not shown.) Index: aeMB_testbench.c =================================================================== RCS file: /cvsroot/sybreon/aemb/sw/c/aeMB_testbench.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -b -r1.4 -r1.5 --- aeMB_testbench.c 25 Apr 2007 22:15:05 -0000 1.4 +++ aeMB_testbench.c 27 Apr 2007 15:17:59 -0000 1.5 @@ -1,33 +1,34 @@ /* - * $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@a...> + * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@a...> * - * 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. - * - * 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 + * 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 * * 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) + * It tests a whole gamut of operations and is tightly linked to the + * ae68_testbench.v testbench module for verification. * * HISTORY * $Log: aeMB_testbench.c,v $ + * 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. * @@ -42,31 +43,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)
+
+ This tests for the following:
+ - Recursion & Iteration
+ - 32/16/8-bit data handling
+*/
-unsigned int slowfib(unsigned int n)
+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;
@@ -85,70 +95,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 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;
+ 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;
}
- // "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;
+}
|
 |