LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Fri Apr 27 17:17:59 CEST 2007
    Subject: [cvs-checkins] MODIFIED: aemb ...
    Top
    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; +}

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.