Home
GU0122 C-to-Hardware Compiler User Manual
Contents
1. volatile _ VIDEO uint32_t BT656_MODE_ REG __at 0 volatile _ VIDEO uint32_t BT656_STATUS_REG at 4 volatile __I2C uint8_t I2CM_CTRL volatile __I2C uint8_t I2CM_STAT Mode register Status register at 0 Control register at 1 Status register The Allocate From field is left empty This indicates that the memory space also called address space is attached to a peripheral device instead of a memory device Therefore the compiler will not allocate any data objects into this space unless the object is __at qualified When entries are added to or removed from the list the code symbol s interface ports are automatically updated once the dialog is closed by clicking the OK button 6 5 Connecting a Code Symbol to a Memory Design pattern e Create additional memory spaces with interface S Example ingle Port Location Examples Soft Designs C to Hardware VGA Video This feature is demonstrated in example chc_vga_v ideo PrjFpg 69 C to Hardware Compiler User Manual 1 Open schematic sheet filter SchDoc 2 Double click on C Code Symbol U_ADD_HISTOGRAM U_ADD_HISTOGRAM add c clk 3 Open the Memories pane C Code Symbol Properties Entry Point External Functions Ports D_ADD_MISTOGRAM hogan e Internal Memories Memory Allocation Initialization Maximum Number Of Internal Memories t O Reserve Address Zero Max
2. U U l U U L S U L J U L FELEFELE LT LT CEE A o a drive input parameters until called func DONE is asserted Low after RESET drive called func START until called func DONE is asserted A EEE O EE O EE R O O E EO E E A EE A EE ial Function called func returns Ln OM NOM CDR Return value valid 13 C to Hardware Compiler User Manual Timing diagram of nowait qualified functions A function that is nowait qualified asserts the DONE signal when the input parameters are read The function may remain executing after DONE has been asserted As a result the callee runs in parallel with the caller The return type of a nowait qualified function must be void i e signal called_func_RETVAL does not exist CLOCK MU U l U LS L L L JS 1 2 a OE AS Sa OD i ek oe a i RESET RESET_DONE ee ee aa a i aa ea aE par_ep START DONE DONE asserted 1 clock after function start no return value possible Timing diagram of register_outputs qualified functions Normally the return value is valid during one clock cycle i e the cycle in which the DONE signal is asserted If the function is register_output qualified the return value remains asserted until a subsequent assertion of START CLOCK genig OSES gN ig OE as Pe a E p EON merie rss RESET RESET_DONE TTA RESET DONE is only applicable if memory is initialized par ep GEARS ECORI AARC 01000 Ee
3. e 2 a GPIO ASP Figure 4 1 OpenBus document To specify the parts i e functions and data objects of the embedded project that must be implemented in hardware 1 Double click the ASP The Configure OpenBus ASP dialog appears 46 Using the CHC Compiler Configure OpenBus ASP ASP Options Symbols In Hardware Processor v Global Variable Allocate in Hardware bt656 Use the following options to enable or disable dipswitches acceleration You can do this at either the FPGA or divisor the processor code level hw_cache0 The Generate ASP option controls whether any FPGA hw_cachel logic is generated Disable this option to globally hw_cache2 disable the ASP and not generate any FPGA logic io base The Use ASP from Software option controls whether ipgdec the code running on the processor will call the ASP or leds not Disable this option to disable the use of the ASP state while retaining the ASP logic in the FPGA sw_cacheD sw_cachel a3 sw_cache2 Generate ASP typ5150 ustswitches vga v Use ASP from Software Function Implement in Hardware Export to Software Parameter Bus Options cabs v Select the size of the address bus width It hw_find_edges z x should be large enough to address the hw_luma v parameters of the largest function in the design imgcopy init isr_sw1 ist_sw2 Select the number of spaces after the ist sw3 parameter bus on the schematic Address Bus Width 4 is
4. The signal handling facilities of lt signal h gt shall not be used The lt stdio h gt library shall not be used in production code The functions atof atoi atol shall not be used The functions abort exit getenv system shall not be used The time handling functions of library lt t ime h gt shall not be used 8 2 MISRA C 2004 This section lists all supported and unsupported MISRA C 2004 rules See also Section 4 10 C Code Checking MISRA C A number of MISRA C rules leave room for interpretation Other rules can only be checked in a limited way In such cases the implementation decisions and possible restrictions for these rules are listed x means that the rule is not supported by the C compiler R is a required rule A is an advisory rule Environment 1 1 1 2 x 1 3 x 1 4 x 1 5 R All code shall conform to ISO 9899 1990 Programming languages C amended and corrected by ISO IEC 9899 COR1 1995 ISO IEC 9899 AMD1 1995 and ISO IEC 9899 COR2 1996 No reliance shall be placed on undefined or unspecified behavior Multiple compilers and or languages shall only be used if there is a common defined interface standard for object code to which the languages compilers assemblers conform The compiler linker shall be checked to ensure that 31 character significance and case sensitivity are supported for external identifiers Floating point implementations should comply with a defined floating point standard
5. xtt If you enable the unroll optimization but do not specify an unroll factor the compiler determines an unroll factor by itself pragma warning number default restore With this pragma you can disable warning messages If you do not specify a warning number all warnings will be suppressed This pragma works the same as the no warning option of an embedded compiler pragma weak symbol Mark a symbol as weak The symbol must have external linkage which means a global or external object or function A static symbol cannot be declared weak A weak external reference is resolved when a global or weak definition is found in one of the source files However a weak reference will not cause the extraction of a module from a library to resolve the reference When a weak external reference cannot be resolved the null pointer is substituted A weak definition can be overruled by a normal global definition The compiler will not complain about the duplicate definition and ignore the weak definition 3 6 Function Qualifiers and Data Type Qualifiers 3 6 1 Compiling to Hardware To compile C source code to hardware in Altium Designer the schematic must contain either an Application Specific Processor WB_ASP component or a C Code Symbol See Section 4 2 CHC Compiler Operating Modes and the Altium Wiki for more information 30 C Language Implementation The CHC compiler supports a number of function qual
6. 1 Pipeline latency 6 RGB_I input 24 ADDR_I input 20 WT input 10 HIS_I input 10 HSI_I input 30 start input 1 done output 1 117 C to Hardware Compiler User Manual Structural View The structural view shows the structure of the generated hardware circuit This structure is similar to the component structure in the HDL description The hierarchy of nested components is shown through indentation in the structural view Special symbols are used to mark the entry point gt and calls to imported functions component gt The Users section lists all components followed by the components that use this component Structural view syntax elements gt entry point indentation nested component component gt component is accessed by reference instead of instantiation component component is an imported function extern Users syntax elements component components where component component separator a literal components comma separated list of components Example HEHE HEH EH HE HE HE EE RH EE HE HE EEE RE HE HEE EE EEE RE EE EEE EE EEE RE EE ERE EE EEE HE EE HEE EE EE Structural View HEHE HEH EH HE HH HE EH EH EE HE HE HEE EE EE EEE EE EEE RE EE EE EE EEE RE EE ERE EE EEE HE EE HEE EE EE gt contrast_filter NEXT gt __CONV gt HIS gt Users contrast_filter NEXT contrast_filter __ CONV contrast_filter HIS contrast_filter Sc
7. C to Hardware Compiler User Manual GU0122 February 05 2013 C to Hardware Compiler User Manual Copyright 2013 Altium Limited All Rights Reserved The material provided with this notice is subject to various forms of national and international intellectual property protection including but not limited to copyright protection You have been granted a non exclusive license to use such material for the purposes stated in the end user license agreement governing its use In no event shall you reverse engineer decompile duplicate distribute create derivative works from or in any way exploit the material licensed to you except as expressly permitted by the governing agreement Failure to abide by such restrictions may result in severe civil and criminal penalties including but not limited to fines and imprisonment Provided however that you are permitted to make one archival copy of said materials for back up purposes only which archival copy may be accessed and used only in the event that the original copy of the materials is inoperable Altium Altium Designer Board Insight DXP Innovation Station LiveDesign NanoBoard NanoTalk OpenBus P CAD SimCode Situs TASKING and Topological Autorouting and their respective logos are trademarks or registered trademarks of Altium Limited or its subsidiaries All other registered or unregistered trademarks referenced herein are the property of their respective owners and no trademark rights to the s
8. Language extensions 2 1 2 2 2 3 R R R Assembly language shall be encapsulated and isolated Source code shall only use style comments The character sequence shall not be used within a comment 110 2 4 Documentation x 3 1 x 3 2 x 3 3 3 4 3 5 x 3 6 Character sets 4 1 4 2 Identifiers 5 1 5 2 5 3 5 4 5 5 5 6 5 7 Types 6 1 6 2 6 3 6 4 6 5 Constants 7 1 33 3 R R 33 po 22I S D I nn Re D gt Se SE e BS R MISRA C Rules Sections of code should not be commented out In general it is not possible to decide whether a piece of comment is C code that is commented out or just some pseudo code Instead the following heuristics are used to detect possible C code inside a comment a line ends with or a line starts with possibly preceded by white space All usage of implementation defined behavior shall be documented The character set and the corresponding encoding shall be documented The implementation of integer division in the chosen compiler should be determined documented and taken into account All uses of the pragma directive shall be documented and explained This rule is really a documentation issue The compiler will flag all pragma directives as violations The implementation defined behavior and packing of bit fields shall be documented if being relied upon All libraries used in production code
9. See 1 Uses iob See 1 Uses global File System Simulation buffer _fss_buffer Skeleton only Uses iob See 1 gmtime defines static structure Sets errno via calls to other functions Not implemented 101 C to Hardware Compiler User Manual Function Not reentrant because isalpha iswalpha isascii iswascii iscntrl iswentrl isdigit iswdigit isfinite isgraph iswgraph isgreater isgreaterequal isinf isless islessequal islessgreater islower iswlower isnan isnormal isprint iswprint ispunct iswpunct isspace iswspace isunordered isupper iswupper iswalnum iswalpha iswentrl iswctype iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper iswxditig isxdigit iswxdigit ldexp ldexpf ldexpl lgamma lgammaf lgammal llrint lrintf lrintl liround llroundf 1llroundl localeconv localtime log logf logl log10 logl0f logl101 loglp loglpf loglpl log2 log2f log21 logb logbf logbl long jmp Sets errno See 2 Not implemented Not implemented Not implemented N A skeleton function Sets errno See 2 Sets errno via calls to other functions Not implemented Not implemented Not implemented 102 Function Not reentrant because lrint lrintf lrintl lround lroundf lroundl lseek istat malloc mblen mbrlen mbrtowc mbsinit mbsrtowcs mbstowcs mbtowc memchr wmemchr memcmp wmemcmp memcpy wmemcpy memmnov wmemmov memset wme
10. va_end va_list ap This macro must be called after the arguments have been processed It should be called before the function using the macro va_start is terminated va_start va_list ap lastarg This macro initializes ap After this call each call to va_arg will return the value of the next argument In our implementation va_list cannot contain any bit type variables Also the given argument lastarg must be the last non bit type argument in the list 7 2 18 stdbool h This header file contains the following macro definitions These names for boolean type and values are consistent with C You are allowed to undefine or redefine the macros below define bool Bool define true define false define bool_true_false_are_defined rFoOF 7 2 19 stddef h This header file defines the types for common use 86 ptrdiff_t size_t wchar_t Libraries Signed integer type of the result of subtracting two pointers Unsigned integral type of the result of the sizeof operator Integer type to represent character codes in large character sets Besides these types the following macros are defined NULL Expands to 0 zero offsetof _type _member Expands to an integer constant expression with type size_t that is the offset in bytes of__member 7 2 20 stdint h within structure type _type See Section 7 2 8 inttypes h and sidint h 7 2 21 stdio h and wchar h Types The header file stdio h contains funct
11. A violation is reported when the first token of an actual macro argument is In the definition of a function like macro each instance of a parameter shall be enclosed in parentheses unless it is used as the operand of or All macro identifiers in preprocessor directives shall be defined before use except in ifdef and ifndef preprocessor directives and the defined operator There shall be at most one occurrence of the or preprocessor operators in a single macro definition The and preprocessor operators should not be used The defined preprocessor operator shall only be used in one of the two standard forms Precautions shall be taken in order to prevent the contents of a header file being included twice Preprocessing directives shall be syntactically meaningful even when excluded by the preprocessor All else elif and endif preprocessor directives shall reside in the same file as the if or ifdef directive to which they are related Standard libraries 20 1 20 2 x 20 3 20 4 20 5 20 6 20 7 20 8 20 9 20 10 20 11 20 12 R R R R DDD DD R R R Reserved identifiers macros and functions in the standard library shall not be defined redefined or undefined The names of standard library macros objects and functions shall not be reused The validity of values passed to library functions shall be checked Dynamic heap m
12. Double click on one of the code symbols 3 Open the Entry Point tab C Code Symbol Properties Entry Point External Functions Ports Memories Options Files Parameters Function name GAIN v C Pipelined Interface type Parallel Multi cycle v Allow sta Start on High Signal Level v Latency Register function outpu Initiation interval Return immediately Data Type Data Width void a Parameters Name Data Type Data Width 10 Type INP Signed Integer 16 Input CHANNEL Boolean 1 Input Add Remove Move Up Import From Source File The dataflow pipeline behavior is accomplished by enabling option Return immediately This option sets the nowait modifier in the __cc calling convention qualifier Note that this option must be enabled for all C Code Symbols in the dataflow pipeline 6 8 2 Using One Code Symbol Example Location Examples Soft Designs C to Hardware VGA Video This feature is demonstrated in example chc_vga_video PrjFpg 1 Open schematic sheet pixel_pipeline SchDoc C Code Symbol U_RGB2HST is a stage within a dataflow pipeline however the implementation of the Code Symbol itself is also split into multiple dataflow pipeline stages 73 C to Hardware Compiler User Manual CLOCK RESET GRAYSCALE _ NEXT_START NEXT_DONE STB ADDR I9 0 PIPELINE ae Y O RGB 23 0 HIS 9 0 START ADDR_I 19 0 NEXT_AD
13. See 1 Uses global File System Simulation buffer _fss_buffer Uses global File System Simulation buffer _fss_buffer Uses global File System Simulation buffer _fss_buffer Uses global File System Simulation buffer _fss_buffer Uses global File System Simulation buffer _fss_buffer Calls exit Uses global File System Simulation buffer _fss_buffer Sets errno Sets errno via calls to other functions asctime defines static array for broken down time string Sets errno Sets errno via calls to other functions Sets errno via calls to other functions atexit defines static array with function pointers to execute at exit of program Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions calloc uses static buffer management structures See malloc 5 99 C to Hardware Compiler User Manual Function Not reentrant because carg cargf cargl casin casinf casinl casinh casinh cfasinhl catan catanf catanl catanh catanhf catanhl ebet cbrtf ebrel ccos ccosf ccosl ccosh ccoshf ccoshl ceil ceilf ceill cexp cexpf cexpl chdir cimag cimagf cimagl cleanup clearerr clock clog clogf clogl close conj conjf conjl copysign copysignf copysignl cos cosf cosl cosh coshf coshl cpow cpowf cpowl cproj cprojf cprojl creal crealf creall csin csinf csinl csinh csinhf csinhl esqrt csqrtf csqrtl ctan ctanf ctanl ctanh ctanhf ctanhl ctim
14. Shared Block RAM Block RAM On chip qualified functions __mem3 Figure 1 2 FPGA with Soft core ASP and Memory Data can be shared between the ASP and the soft core in two ways via the I O bus or via shared memory 1 Data sharing via I O bus e Data is passed as function parameters from a software function to a hardware function e Data is passed as return value from a hardware function to the software caller 2 Data sharing via shared memory A data object that should be available to both the soft core and the ASP could be allocated in shared memory that is connected to both the ASP and the soft core Both the ASP and the soft core need to know the address of the data object This can be done in two ways e Pass a pointer value to the data object as parameter to the hardware function Make sure the data object is allocated in shared memory Introduction e Use the at keyword to locate the data object at an absolute address See Section 3 7 4 Placing a Data Object at an Absolute Address __at The CHC compiler supports a large set of memory type qualifiers data type qualifiers and symbol attributes to facilitate the implementation of efficient memory systems C to Hardware Compiler User Manual Chapter 2 External Interface The electronic circuit generated by the CHC compiler interacts with the hardware environment in which it is embedded This chapter describes the interface signals through which this
15. cccceececeeceeneeeseeeeeeeaeeeeeeeeeeeees 65 6 3 2 Connecting a Code Symbol to a Processing Core cccceceeee eee nee eee ee een eee een eee eed eea een eeaeeneeaeeneeanenes 67 6 4 Connecting a Code Symbol to a Wishbone Slave Device ccceeceee cece cent eee ee eee ee eee eee ee eee eee ee eteee eterna ees 68 6 5 Connecting a Code Symbol to a Memory 0 nett een et een etaeenetes 69 6 6 Connecting a C Code Symbol to a Device without Standardized BUS cceceeeeeececeeeeeeeeeeeeeeeeeeeeeeeeeeeees 70 6 7 Connecting two C Code Symbols sesar tantetesesaesnateeneeteentnts banca nes aacaas dcantatentaads niaes weenaca EET 72 6 8 Building a Dataflow Pipeline using C Code Symbols cccceeeeeeee teen eee e eee tees teeter teen eee eee eter eens eeeee ees 72 6 8 1 Using Multiple Code Symbols 1 2 20 cece eee ee eee eta e neared nea e deta ede e ane deea ee aeeaeegeees 73 6 8 2 Using One Code Symbol ses scra rria oi ed eis es NE ede es a ee ee ed ee EREE 73 6 9 Tuning the Timing of Dataflow Pipeline Stages ceceeeeeee eee ee eee e eee e eect ened eens anes eae eseeaeeeeeaeeseeaeeeeeaeees 74 6 9 1 Splitting a Dataflow Pipeline Stage in Two Parallel Stages ccceeeeeeeee eee eeeeeeeeeeeee eee eeeeeeeeeeeeeeeeeees 74 6 9 2 Using Pipelined Code Symbols Functions 2 0 0 0 ccc ceeeee eee nett eee e eee teeta renee ated eta ee neta eeneeaeeneeaeeneees 76 6 10 Tuning
16. mMM BGA TMA MANGA MBA rm orm NALA TMAM AMN rm r CLOCK LLL LI ALI LILLIAN FLIET LF LALIT RESET RESET DONE Oa PIN EN a RESET DONE is only applic able if memory is ee par M p par_ep sampled on function START START R ji f f 1 j START may occur immediately after RESET_DONE or RESET DONE E J j DONE is low after reset Function entry point returns RETVAL ATLL TT i wih Tu a latency cycles Return value valid If pipeline stalls are allowed the time interval between START and DONE signals is greater or equal to latency cycles and varies depending on the number of cycles the function is stalled Just as in the case without stalls the DONE signal is set when RETVAL is available If in addition to the above the nowait qualifier is set then the DONE signal is used to signal that a new input is consumed i e the DONE signal will not be set when RETVAL is available Usually the nowait qualifier is used in combination with void functions that call another external function when the return value is available see Section 6 8 Building a Dataflow Pipeline using C Code Symbols about building a dataflow pipeline 2 3 2 Wishbone Multi Cycle Bus Adapter A Wishbone bus adapter is placed on top of the function s parallel multi cycle interface signals that are defined in the previous section The signals of the parallel interface are mapped on the address space
17. nor are there any options or environment variables available to specify a search path The C library is a MIL archive It is created by compiling all C library source modules to the MIL format the resulting MIL files are combined into one archive i e library from which the compiler extracts the required functions 52 Using the CHC Compiler 4 8 Rebuilding the C Library All sources for the C library are shipped with the product You can rebuild the C library by executing the makefiles located in directories System Tasking chc lib src libcand System Tasking chc lib src libc16 to recreate the 32 bit respectively the 16 bit versions of the C library The command to execute the make file is mkhc makefile You may want to rebuild the library for example to change the size of the heap which has a size of 200 bytes by default 4 9 Debugging the Generated Code The compiler generated VHDL or Verilog is correct by construction This means that if the C code is free of bugs then the generated code is also free of bugs The only way to debug a real electronic circuit is to analyze waveforms captured by either a HDL simulator or a virtual logic analyzer Analyzing the waveforms is tedious and time consuming and correlating the waveforms to the C source is possible but difficult So before you compile a code fragment to hardware you first have to be sure that the C source code is correct Before you compile your code to hardwar
18. 01 31 D same as m d y e day of the month 1 31 with single digits preceded by a space oF ISO 8601 date format sy m d 9 last two digits of the week based year 00 99 G week based year 0000 9999 Libraries h same as b H hour 24 hour clock 00 23 l hour 12 hour clock 01 12 j day of the year 001 366 m month 01 12 M minute 00 59 N replaced by newline character p locale s equivalent of AM or PM Yor locale s 12 hour clock time same as 31 M S p R same as 3H M S second 00 59 St replaced by horizontal tab character T ISO 8601 time format 3H 3M S u ISO 8601 weekday number 1 7 Monday as first day of the week U week number of the year 00 53 week 1 has the first Sunday V ISO 8601 week number 01 53 in the week based year w weekday 0 6 Sunday is 0 W week number of the year 00 53 week 1 has the first Monday X local date representation X local time representation WY year without century 00 99 SY year with century ozZ ISO 8601 offset of time zone from UTC or nothing Z time zone name if any PP 7 2 25 wchar h Many functions in wchar h represent the wide character variant of other functions so these are discussed together See Section 7 2 21 stdio h and wchar h Section 7 2 22 stdlib h and wchar h Section 7 2 23 string h and wchar h and Section 7 2 24 time h and wchar h The remaining functions are described below They perform conversio
19. Converts c to a lowercase character does not check if c really is an uppercase character Implemented as macro This macro function is not defined in ISO C99 _toupper Converts c to an uppercase character does not check if c really is a lowercase character Implemented as macro This macro function is not defined in ISO C99 isascii Returns a non zero value when c is in the range of 0 and 127 This function is not defined in ISO C99 toascii Converts c to an ASCII value strip highest bit This function is not defined in ISO c99 7 2 4 errno h int errno External variable that holds implementation defined error codes The following error codes are defined as macros in errno h EPERM 1 Operation not permitted ENOENT 2 No such file or directory EINTR 3 Interrupted system call EIO 4 I O error EBADF 5 Bad file number EAGAIN 6 No more processes NOMEM 7 Not enough core ACCES 8 Permission denied FAU 9 Bad address EEXIS 10 File exists ENOTDIR 1i Not a directory EISDIR 12 Is a directory EINVAL 13 Invalid argument ENFILE 14 File table overflow EMFILE 15 Too many open files ETXTBSY 16 Text file busy ENOSPC 17 No space left on device ESPIPE 18 Illegal seek EROFS 19 Read only file system EPIPE 20 Broken pipe ELOOP 21 Too many levels of symbolic links ENAMETOOLONG 22 File name too long Floating point errors EDOM 23 Argument too large ER
20. Critical Systems Motor Industry Research Association MIRA 2004 To enable MISRA C checking 1 Make the or one of the C source files visible in your workspace 2 From the Project menu choose Project Options The Options for Embedded Project dialog appears 3 Expand the C compiler entry and select MISRA C 4 Set MISRA C rules to All supported MISRA C rules For a complete overview of all MISRA C rules see Chapter 8 MISRA C Rules Implementation issues The MISRA C implementation in the compiler supports nearly all rules Only a few rules are not supported because they address documentation run time behavior or other issues that cannot be checked by static source code inspection During compilation of the code violations of the enabled MISRA C rules are indicated with error messages and the build process is halted MISRA C rules are divided in required rules and advisory rules If rules are violated errors are generated causing the compiler to stop With the following options warnings instead of errors are generated for either or both the required rules and the advisory rules Being still in the MISRA C pane Inthe right pane enable the options Turn advisory rule violation into warning and or Turn required rule violation into warning Not all MISRA C violations will be reported when other errors are detected in the input source For instance when there is a syntax error all semantic checks will be skipped including s
21. ISO C99 It serves as a no alias hint to the compiler and can only be used to qualify pointers to objects or incomplete types Adding the restrict keyword can result in great speedups at both compile time and run time By definition a restrict qualified pointer points to a storage location that can only be accessed via this pointer no other pointers or variables can refer to the same storage location The ISO C99 standard provides a precise mathematical definition of rest rict but here are some common situations e A restrict pointer which is a function parameter is assumed to be the only possible way to access its object during the function s execution By changing the function prototype in the previous example from function int a N int b N int d to function int a restrict N int b restrict N int d Alternative syntax function int restrict a int restrict b int d The loop body becomes parallelizable without relying on the results of global alias analysis A file scope pointer declared using restrict is assumed to be the only possible way to access the object to which it refers This may be an appropriate way to declare a pointer initialized by malloc at run time extern int restrict ptr_i void init void ptr_i malloc 20 sizeof int 5 1 2 3 Loop Carried Dependencies The notion of data dependency is particularly important for loops where a single misplaced dependen
22. LET TEAL Pe ATTA par ep sampled on function START START Mim ROTO TATOO TOMO OOO MURR U EUS OEE OU MUM E UO nti START may occur immediately after RESET_DONE or RESET DONE is high after reset Function entry point returns RETVAL ND a NORM UMMM UNM OOMNULM MMI NOO OEN Return value valid par_out par_out valid Timing diagram of start_on_edge qualified functions Normally a function starts when the START signal is asserted If the START signal remains asserted the function will restart once the DONE signal is asserted A st art_on_edge qualified function will not restart if the START signal remains asserted CLOCK MIS 1 I LILI 1 1ST 1 NST 1 IIAP AS LP Pr ef 1 RESET RESET_DONE EE par_ep MARAE par ep sampled on function START START START may remain high until after DONE is asserted DONE i o o NS ccc DONE is low after reset Function entry point returns RETVAL Timing diagram of pipeline qualified functions A non pipeline qualified i e a normal function ignores additional START signals and input parameter s while it is executing A pipeline qualified function accepts new inputs every ii th cycle where iiis the initiation interval See the __CC function qualifier 14 External Interface The function produces the corresponding outputs for the subsequent inputs latency cycles after accepting the input parameter s as shown in the following timing diagram CLOC
23. Library c seccctccsecedieds eoeemecs occ Sec ty i iene ec ia ev eetecs ocedustbeves Looven etic ETETE PACKETEER EN aii 53 4 9 Debugging the Generated Code cccceecceceeeceec eee ee eee ece eee eee ec eee acess ese eseeceeceeceseseeseeseeseeseeseeeeeseeeeess 53 4 9 Ac Printt Styl DEDUG ciranean e TEE a R an a PE r rE aa 53 410 C Code Checking MISRA resies aneian iiaae an aaa a EE EE OE E EEE aaa 54 4 11 Compiler Error M SSages ocne rirnan ea an nN A E aE aR EOE ETE RE EENE ee eee 55 9 Paralleli SMi danda E EEEO T OE aE E EAE DE E T EE E sh EEDS 57 Dl Dependencies aneen a R E a E E E E E a E a aeaa 57 5 1 1 Control DEPENdenCieS 05sciscccntcohbnss enne Enae E RE TARE EEE EA EA AAEE EE E 58 5 1 2 Data Dependencies sor scrs Veeesistvaceetsht erora orna E beat ode AEE Eaa a EE One te rae V STES EENG AEE 58 5 2 The Memory System C to Hardware Compiler User Manual 5 3 PIPEN eraai aaa E nabantie E E EE anaemia EE AE E AA E E EE NE NA 62 6 Design Patern Sienese eera O r eE EE E NS O e deed EI PE Se En ai 65 Bic ChE AUG ANAS RS anene a a a a a a O E E detatnatsaanceaaes 65 6 2 Creating a C Code Symbol and Testing it Using a Virtual Instrument 0 cee cee eee cece eee ee ee eee eee este eeeeeeeeeenes 65 6 3 Connecting a Code Symbol to a Wishbone Master Device cccccceeeececneceeeee eee eaeeeeeeeeeeeseeeseeneaeeeenenees 65 6 3 1 Connecting a Code Symbol to a Wishbone Master Peripheral
24. Not implemented feclearexcept Clears the current exception status flags corresponding to the flags specified in the argument Not implemented fegetexceptflag Stores the current setting of the floating point status flags Not implemented feraiseexcept Raises the exceptions represented in the argument As a result other exceptions may be raised as well Not implemented fesetexceptflag Sets the current floating point status flags Not implemented fetestexcept Returns the bitwise OR of the exception macros corresponding to the exception flags which are currently set and are specified in the argument Not implemented For each supported exception a macro is defined The following exceptions are defined FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERF LOW FE_UNDERFLOW FE_ALL_ EXCEPT fegetround Returns the current rounding direction represented as one of the values of the rounding direction macros Not implemented fesetround Sets the current rounding directions Not implemented Currently no rounding mode macros are implemented 7 2 7 float h The header file float h defines the characteristics of the real floating point types float double and long double float h used to contain prototypes for the functions copysign f isinf f isfinite f isnan and scalb f These functions have accordingly to the ISO C99 standard been moved to the header file math n See al
25. R Multibyte characters and wide string literals shall not be used 9 R Comments shall not be nested 10 A Sections of code should not be commented out In general it is not possible to decide whether a piece of comment is C code that is commented out or just some pseudo code Instead the following heuristics are used to detect possible C code inside a comment aline ends with or aline starts with possibly preceded by white space 11 R Identifiers shall not rely on significance of more than 31 characters 12 A The same identifier shall not be used in multiple name spaces 13 A Specific length typedefs should be used instead of the basic types 14 R Use unsigned char or signed char instead of plain char x 15 A Floating point implementations should comply with a standard 16 R The bit representation of floating point numbers shall not be used A violation is reported when a pointer to a floating point type is converted to a pointer to an integer type 17 R typedef names shall not be reused 18 A Numeric constants should be suffixed to indicate type A violation is reported when the value of the constant is outside the range indicated by the suffixes if any 19 R Octal constants other than zero shall not be used 20 R All object and function identifiers shall be declared before use 21 R Identifiers shall not hide identifiers in an outer scope 22 A Declarations should be at function scope wher
26. U_PIXEL_PIPELINEO and U_PIXEL_PIPELINE1 are instantiations of the same pipeline The CHC report file shows that various states in the pixel pipeline consume more than seven cycles therefore the pipeline is split in two See schematic sheet pipeline_connect SchDoc to see how the data is fed into PIPELINE_0 and PIPELINE_1 75 C to Hardware Compiler User Manual 6 9 2 Using Pipelined Code Symbols Functions Design pattern e Use the information provided in the CHC compiler report file If one or more states in a pipeline cannot meet timing requirements pipeline the given stage i e function Since the initiation interval and the latency of pipelined functions can be passed to the CHC compiler it is relatively easy to balance pipeline stages 6 10 Tuning FPGA Resource Usage Design pattern 1 Use fixed point arithmetic 2 Reduce the bit width of variables 3 Use the information provided in the CHC compiler report file Example Location Examples Soft Designs C to Hardware VGA Video This feature is demonstrated in example chc_vga_video PrjFpg Work your way through the whole example 76 Chapter 7 Libraries 7 1 Introduction This chapter contains an overview of all library functions that you can call in your C source This includes all functions of the standard C library libc ma Section 7 2 Library Functions gives an overview of all library functions
27. a A a a O S STOE 92 7 2 294 SMINGENANG WENAR N eia nar a r E rE ET AERE 94 F224 ime Nand what N cscs seinen nd aa a E EEA E ncn EAE EDE EA 95 T229 WOMAN N ei eiei r na ws ae nd eee nig ie E A E ge PAE E E OE EO 97 VERA PE OLEA EE E TT T A E T 98 7 3 C Library Reentrancy 2 20 0 c cece cece eee eee AESA eee etre ee ee eset et een es esse eeeseeeeeeeenes 99 8 MISRA C R Seinen noae e e a gnnuete spendin E Halak athe weer nucle E E OE AEA E heal 107 8 1 MISRA C 1998 rinisur tannini ni e pono kE R gate OER ia eap aiani KE mIRE EE E EE a E O aG an 107 8 2 MISRA G 2004r ee a a RTE A E E A E E E 110 9 CHC Report File Format iscccccsccctecescacasscscesiceendtonstendac semcsaanstatades steht ash kni ii kaain neniani aiaiai ihain 117 10 CHC Qualifier File Format si cicagie ne esiscccsnn g Bese iecies asia n a EE E EEA ASEENAAN EEE A EA E a RE AGE 123 a 3 GIOSSANY E E A E E E nedeaenens oeeebateae 125 Chapter 1 Introduction 1 1 Manual Purpose and Structure The purpose of this manual is to provide detailed information about the C to Hardware CHC compiler This manual describes the hardware compiler s features and behavior in detail It contains a detailed description of the interface to the created hardware circuits the C language extensions to create these interfaces briefly explains how the compiler is integrated in Altium Designer and also contains design patterns which are general reusable solutions to a commonly occurring pr
28. a pointer to Long or by Il for a pointer to Long long j for a pointer to intmax_t or uintmax_t Z fora pointer to size_t or t for a pointer to pt rdiff_t The conversion characters e and g may be preceded by l if the argument is a pointer to double rather than float and by L for a pointer toa long double Vet e A conversion specifier maximum field width and length modifier are optional the conversion character is not The conversion character must be one of the following if a character following is not in the list the behavior is undefined Length specifier and length modifier are optional the conversion character is not The conversion character must be one of the following if a character following is not in the list the behavior is undefined Character Scanned as d int signed decimal i int the integer may be given octal i e a leading 0 is entered or hexadecimal leading Ox or OX or just decimal o int unsigned octal int unsigned decimal 89 C to Hardware Compiler User Manual Character Scanned as x int unsigned hexadecimal in lowercase or uppercase c single character converted to unsigned char s char a string of non white space characters The argument should point to an array of characters large enough to hold the string and a terminating NULL character f F float e E float g G float a A float n int the number of characters written so far is writt
29. aE HEE EE HE aE EE aE HE EEE HE aE aE EE EE OEE HE EE EE contrast_filter State machine Wait States W4 NEXT 1 Memory States SO HTS Si HTS CONV 119 C to Hardware Compiler User Manual Resource Usage This part gives an indication of the FPGA resources that are used by a hardware function The following information is provided per function as well as Totals for all functions Resource usage syntax elements calling convention calling convention of this function states number of states and wait states in the controlling finite state machine registers total number of bits in all allocated registers clock cycles number of clock cycles that it takes to execute the hardware function resource resource usage where resource is the name of a resource as listed in the resource definition file such as ALU CMP DIVMOD MUL MULADD The resource usage is expressed as N x W where N x is optional and represents the number of instances and W expresses the bit width of the input s Example HERE EEE HHHHE HE HH EH HH HEH HE HH HH EH HE HE EE HH HH EH HE HH HH HH HE EH HE HE EE EH FE EH HE Resource Usage HE FE FE AE EH AE FE FE FE FE FE AE EE EE HE EE EE EE EE EE EE HEE EE EEE EEE EEE HE EE EE HE contrast_filter calling convention parallel multi cycle entry point states 5 registers 124 bits clock cycles at least 4 ALU 17 Totals Memory Map This
30. and adds portable formatting and conversion functions Below the conversion functions from inttypes h are listed imaxabs intmax_t j Returns the absolute value of j imaxdiv intmax_t numer intmax_t Computes numer denomand numer denom The result is stored in the quot denom and rem components of the imaxdiv_t structure type strtoimax const char restrict Convert string to maximum sized integer Compare st rto11 nptr char restrict endptr int base strtoumax const char restrict Convert string to maximum sized unsigned integer Compare st rtoul1l nptr char restrict endptr int base westoimax const wchar_t restrict Convert wide string to maximum sized integer Compare wcstol1 tt on nptr wchar_t restrict endptr int base wcestoumax const wchar_t restrict Convert wide string to maximum sized unsigned integer Compare wcstoul1 nptr wchar_t restrict endptr int base 7 2 9 io h The header file io h contains prototypes for low level I O functions Definitions are located in the source file pcls_io c This header file is not defined in ISO C99 _close fd Used by the functions close and fclose _lseek fd offset whence Used by all file positioning functions fgetpos fseek fsetpos ftell rewind _open fd flags Used by the functions fopen and freopen _read fd buff cnt Reads a sequence of characters from a file _unlink name Used by the function remove _write fd buf
31. can be produced by the sequence of functions i e a data flow pipeline Verilog is a hardware description language HDL used to model electronic systems The language sometimes called Verilog HDL supports the design testing and implementation of analog digital and mixed signal circuits at various levels of abstraction VHDL or VHSIC Hardware Description Language is commonly used as a design entry language for field programmable gate arrays and application specific integrated circuits in electronic design automation of digital circuits The Wishbone Bus is an open standard hardware computer bus intended to let the parts of an integrated circuit communicate with each other The aim is to allow the connection of differing cores to each other or to peripheral devices inside of a chip 126
32. cmp Not implemented because of recursion Compute the absolute value of an int long int andlong long int j respectively Compute x y and x y in a single operation X and y have respectively type int long int and long long int The resultis stored inthe members quot and remof struct div_t ldiv_t and 11div_t which have the same types Multibyte wide character and string conversions mblen s n mbtowc pwc s Nn wctomb s wc mbstowcs pwcs s Nn wcestombs s pwcs n Determines the number of bytes in the multi byte character pointed to by s At most n characters will be examined See also mbrlen in Section 7 2 25 wchar h Converts the multi byte character in s to a wide character code and stores it in pwc At most n characters will be examined Converts the wide character wc into a multi byte representation and stores it in the string pointed to by s At most MB_CUR_MAX characters are stored Converts a sequence of multi byte characters in the string pointed to by s into a sequence of wide characters and stores at most n wide characters into the array pointed to by pwes See also mbsrtowcs in Section 7 2 25 wchar h Converts a sequence of wide characters in the array pointed to by pwcs into multi byte characters and stores at most n multi byte characters into the string pointed to by s See also wcs rtowmb in Section 7 2 25 wchar h 7 2 23 string h and wcehar h This header file provides numerous f
33. compiler supports two operating modes HW SW mode and default mode The mode is set via command line option only rtl qualified A non ISO C compliant C language extension An output parameter can be regarded as a function parameter that serves as an additional return value The term pipeline is overloaded see the definition of Dataflow pipeline In this manual the term pipeline refers to the CHC compiler feature to create a pipelined schedule for a function i e a Code Symbol or a loop within a function 125 C to Hardware Compiler User Manual RTL Software function Top level entity Throughput Verilog VHDL Wishbone Bus Register transfer level description also called register transfer logic is a description of a digital electronic circuit in terms of data flow between registers which store information between clock cycles in a digital circuit The RTL description specifies what and where this information is stored and how it is passed through the circuit during its operation A C function that is executed by a processor core Opposite of hardware function The top level entity is a term taken from VHDL language An entity contains a hardware sub design Entities can be nested The top level entity defines the set of signals that are visible on the external interface Refers to how often in clock cycles a function call can complete For a sequence of functions the throughput specifies the rate at which outputs
34. define N 10 int a N N b N N d for i 0 i lt N i for j 0 J lt N i alil 3 alil 3 biii d This loop is parallelizable The starting address and dimensions of the arrays are visible to the compiler so it knows that a iJ j and b i j are not aliases define N 10 int a N b N d for i 0 i lt N i a i int malloc N sizeof int c i int malloc N sizeof int for i 0 i lt N i for j 0 J lt N i aliji afail 3 blillj gd Although the loop body is identical it is not parallelizable The compiler is not allowed to make any assumptions about the pointer returned by malloc Therefore the compiler cannot guarantee that ati j andb i j are not aliases As a result all loop iterations execute sequentially 59 C to Hardware Compiler User Manual define N 10 void function int a N int b N int d for i 0 i lt N i for j 0 J3 lt N i ali j afail 3 blillj da Whether this loop is parallelizable depends on whether the compiler is able to deduce that a and b are not aliases If the function is not static thus can be called from outside the module in which it is defined the compiler needs to analyze all modules to be able detect whether a and b alias This global alias analysis is a time consuming process 5 1 2 2 The restrict Keyword The type qualifier restrict is new in
35. definition and call Whenever an object or function is declared or defined its type shall be explicitly stated For each function parameter the type given in the declaration and definition shall be identical and the return types shall also be identical If objects or functions are declared more than once their types shall be compatible anne C to Hardware Compiler User Manual 8 5 8 6 8 7 8 8 8 9 x 8 10 8 11 8 12 Initialization 9 1 R There shall be no definitions of objects or functions in a header file Functions shall be declared at file scope Objects shall be defined at block scope if they are only accessed from within a single function An external object or function shall be declared in one and only one file An identifier with external linkage shall have exactly one external definition All declarations and definitions of objects or functions at file scope shall have internal linkage unless external linkage is required The static storage class specifier shall be used in definitions and declarations of objects and functions that have internal linkage When an array is declared with external linkage its size shall be stated explicitly or defined implicitly by initialization All automatic variables shall have been assigned a value before being used This rule is checked using worst case assumptions This means that violations are reported not only for variables that are guaranteed to be uninit
36. diagram in subsection Parallel interface default timing in Section 2 3 1 Timing Diagrams of the Parallel Bus Interface Read access is combinatorial which means that the data retrieved from the input port can be used in the same clock cycle Write access is registered which means that the assigned value will be asserted on the following clock up event 20 Chapter 3 C Language Implementation This chapter describes the CHC specific features of the C language including language extensions that are not defined in ISO C The ISO C standard defines the C language and the C libraries The CHC compiler fully supports the ISO C standard except for the deviations stated below The functionality offered by the C library implementation is comparable to the C library of compilers for embedded systems This chapter sometimes refers to CHC compiler options Within Altium Designer it is rarely necessary to set CHC compiler options by hand in most cases this task is automated or handled via the GUI of Altium Designer Section 4 1 CHC Compiler Options explains how you can access and set CHC compiler options in Altium Designer The following C language features implemented in the compiler deviate from the ISO C standard e Function prototypes function prototypes are mandatory instead of optional Hardware functions are not reentrant Therefore e recursion is not possible cycles in the call graph are not allowed hardware functions cannot be ca
37. flow of data between operations and occur when two operations possibly refer to identical storage locations a register or a memory location Structural hazards also known as resource dependencies arise from the limited number of hardware resources such as functional units and memory ports Structural hazards inhibit parallelism but do not force a particular execution sequence 5 1 1 Control Dependencies A control dependency is a constraint that arises from the control flow of the application The compiler tries to eliminate control dependencies to increase the efficiency of the generated hardware circuit Consider the following code fragment si if a lt b s2 c dte else s3 c d e Statement s2 and s3 have a control dependency on s1 The electronic circuit that the compiler could create for this example executes the compare the addition and the multiply operations in parallel The output of the comparator switches a multiplexer that either assigns the result of the addition or the multiplication to variable c This optimization is called if conversion The if convertor replaces if then else constructs by predicated operations which can be more efficiently implemented in hardware Sometimes it is legal to remove predicates that are assigned as a result of an if conversion Consider the next code fragment sl if a lt b s2 c da e s3 lt ee Assume variable c is not used in subsequ
38. from outside the hardware block are mapped to either distributed RAM or to block RAM The compiler instantiates this memory If sufficient memory resources are available each memory contains only one cluster and the most frequently accessed clusters are located in multi ported memories The remaining clusters are located into a memory that is shared with the processor core s address space 61 C to Hardware Compiler User Manual How to improve the compiler s default allocation Given the characteristics of the source code the compiler may not be able to construct an efficient memory system Aliasing may inhibit the instantiation of multiple parallel accessible memories The ISO standardization committee has introduced C language extensions to support multiple address spaces Named address spaces are implemented by memory type qualifiers in C declarations These qualifiers associate a variable with a specific address space Named address space support can be provided within the current C standards by the single addition of a memory type qualifier in variable declarations See Section 3 7 Memory and Memory Type Qualifiers for more information about memory type qualifiers Scheduling and operation chaining The main inputs for the compiler s scheduler are the data dependency graph and the resource definition file The data dependency graph defines the order in which operations are allowed to be executed The resource definition file describes th
39. granularity is used to indicate the size of the computations that are being performed at the same time In the context of C to Hardware compilation we identify fine grained instruction level parallelism instruction level and coarse grained parallelism at thread level and process level Fine grained instruction level parallelism is automatically detected and exploited by the CHC compiler Course grained parallelization is user directed you must explicitly specify the actions to be taken by the compiler and run time system in order to exploit thread level and process level parallelism How to exploit coarse grained parallelism is demonstrated in de VGA video and Audio DSP examples This section deals with instruction level parallelism Example Consider the following code fragment for int i 0 i lt 100 i ali b i 2 This loop has plenty of parallelism If the compiler could create an electronic circuit with 100 multipliers where each multiplier accesses one member of array a and one member of b then the loop all 100 iterations executes in 1 clock cycle Whether the compiler can create such a circuit depends on the available hardware resources Modern FPGAs provide the required number of multipliers However in this example the memory system limits the amount of parallelism If each array element was stored in a register the compiler could construct a circuit that executes all multiplies in parallel but normally the arr
40. if you do not specify a memory qualifier the default ___mem0 qualifier is assumed This qualifier is associated with extern shared memory whereas the other qualifiers __mem1 __mem15 are associated with block RAMs on the ASP Each memory space in the LSL file has a user defined name you can use this name as an alias for the __ memx qualifier By default the user names correspond to the qualifier name You can map the predefined memory type qualifier __memX to an arbitrary string by editing the LSL file For example if you share memory between a processor core and the hardware functions you may prefer to use the user defined qualifier __ shared_mem instead of __memx to increase the readability of the source code These LSL names should not conflict with C keywords and symbols used in your C source Example int __meml gi void func void static int __meml __mem0 pi amp gi Variable gi is located in __mem1 Pointer pi is located in __mem0 and points to a location in __mem1 Now it is legal to assign the address of gi to pi The pointer is located in shared memory and is accessible both from ___rt 1 qualified functions and non ___rt1 qualified functions See also Section 1 4 Shared Data 3 7 4 Placing a Data Object at an Absolute Address __at Just like you can declare a variable in a specific memory using memory type qualifiers you can also place a variable at a specific address in memory With the attribute __at
41. imaginary part can be stored in structs or in arrays This implementation uses arrays because structs may have different alignments The header file complex h also defines the following macros for backward compatibility complex _Complex C99 keyword imaginary _Imaginary C99 keyword Parallel sets of functions are defined for double float and long double They are respectively named function function function1 All long type functions though declared in complex h are implemented as the double type variant which nearly always meets the requirement in embedded applications This implementation uses the obvious implementation for complex multiplication and a more sophisticated implementation for division and absolute value calculations which handles underflow overflow and infinities with more care The ISO C99 pragma CX_LIMITED_RANGE therefore has no effect Trigonometric functions csin csinf csinl Returns the complex sine of z 77 C to Hardware Compiler User Manual ccos ccosf ccosl Returns the complex cosine of z ctan ctanf ctanl Returns the complex tangent of z casin casinf casinl Returns the complex arc sine sin 2 cacos cacosf cacosl Returns the complex arc cosine cos z catan catanf catanl Returns the complex arc tangent tan z csinh csinhf csinhl Returns the complex hyperbolic sine of z ccosh ccoshf ccoshl Returns the complex hyperbolic cosine of z ctanh ctanhf ctanhl Returns the c
42. is called without arguments when the program normally terminates Causes normal program termination Acts as if main returns with status as the return value Status can also be specified with the predefined macros EXIT_SUCCES or EXIT_FAILURE Same as exit but not registered by the atexit function or signal handlers registered by the signal function are called Searches an environment list for a string s Returns a pointer to the contents of s NOTE this function is not implemented because there is no OS Passes the string s to the environment for execution NOTE this function is not implemented because there is no OS This function searches in an array of n members for the object pointed to by key The initial base of the array is given by base The size of each member is specified by size The given array must be sorted in ascending order according to the results of the function pointed to by cmp Returns a pointer to the matching member in the array or NULL when not found 93 C to Hardware Compiler User Manual qsort base n size cmp Integer arithmetic int abs j long labs j long long llabs j div_t div x y ldiv_t ldiv x y lidiv_t lldiv x y This function sorts an array of n members using the quick sort algorithm The initial base of the array is given by base The size of each member is specified by size The array is sorted in ascending order according to the results of the function pointed to by
43. is the format in which the library is distributed The CHC compiler s C library is a MIL archive MIL the Medium Level Intermediate Language is a language used by TASKING compilers to represent the source code in a format that is suited for code generation by the compiler back end The MIL format is both an output and input format for the compiler The CHC C library is created by translating the source code of the C library into the MIL format Subsequently the MIL files are grouped together by the archiver into a library The C library also contains the startup code The startup code is qualified __ export and calls the main function At least one function in a program should be __ export qualified otherwise no hardware functions will be instantiated The C library should be listed as one of the files that are passed to the compiler Example che file c lib libc ma Compile file file c and link it with the C library Libc ma If file c contains a main then the startup code is extracted form libc ma Library Description libc ma 32 bit C library big endian libc16 ma 16 bit C library big endian lipcle ma 32 bit C library little endian libc16le ma 16 bit C library little endian 43 C to Hardware Compiler User Manual 44 Chapter 4 Using the CHC Compiler This chapter explains the compilation process and how the compiler is invoked when building your project in Altium Designer In Altium Designe
44. it The pragmas described below are the CHC compiler pragmas pragmas specific to the embedded compilers are not described here Such pragmas are also supported by the CHC compiler to avoid warnings about non supported pragmas when the CHC compiler is used in ASP mode where the source code is compiled by both the embedded compiler and the CHC compiler Refer to the Users Guide of the embedded compiler to see which options and pragmas it supports The general syntax for pragmas is pragma label pragma spec pragma arguments on off default restore or _Pragma label pragma spec pragma arguments on off default restore Some pragmas can accept the following special arguments on switch the flag on same as without argument off switch the flag off default set the pragma to the initial value restore restore the previous value of the pragma Label pragmas Some pragmas support a label prefix of the form abel between pragma and the pragma name Such a label prefix limits the effect of the pragma to the statement following a label with the specified name The restore argument on a pragma with a label prefix has a special meaning it removes the most recent definition of the pragma for that label You can see a label pragma as a kind of macro mechanism that inserts a pragma in front of the statement after the label and that adds acorresponding pragma restore after the statement Compared to regular pragmas label
45. master signals are connected to C Code Symbol U_WB_2_RGB on schematic sheet filter SchDoc RST wb2rgb_RST STB wh2rgb_STB_I NEXT_START cyc whargb_CYC_I N ACK E ver _ACK_0 j ADR 19 0 ummm woargb_ADR_I 19 0 CAM a DAT_AG1 0 _J gt wb2nzb_DAT_IG1 0 DAT BG1 0 ummm E wb2nzb_DAT_0OB1 0 SELE 0 ummm wb2nzb_SEL_IE 0 WE _ wb2reb_WE_I 3 Double click on the U_WB_2_RGB component and open the Entry Point tab to see how the entry point is defined 66 Design Patterns C Code Symbol Properties Extemal Functions Ports Memories Options Files Parameters Function name wb2rgb v O Fipelined Interface type Wishbone Single Bus Cycle w Latency Initiation interval Return immediately Return Value Data Type Data Width void 0 Parameters Data Type Data Width 10 Type Unsigned Integer 32 Input bt656_addr Unsigned Integer 20 Address Unsigned Integer 4 Select Import From Source File The interface type of the entry point is Wishbone Single Bus Cycle which translates to function qualifier __CC wishbone single nowait The entry point s parameters match the wires of the Wishbone interface The nowait qualifier which is set because option Return immediately is enabled is used to terminate the Wishbone bus cycle as soon as the input data is accepted by the entry point 4 Close the dialog and Ctrl double click on the U_WB_2_RGB C Code Symb
46. of the Wishbone bus and can be accessed using several Wishbone transactions There are no restrictions on the function s prototype The Wishbone bus adapter which the compiler instantiates buffers the parameters the return value and the control signals Hardware functions that use the wishbone calling convention are either implemented using the Altium Designer ASP concept or as C Code Symbols In Altium Designer at most one ASP hardware function is called simultaneously and a C Code Symbol supports one entry point only Therefore the return values and parameters of all hardware functions that use the wishbone calling convention are overlaid i e they share the same address range Input Output output parameter p parameter y output parameter q 4 parameter z return value base_address act signals 0 31 done signals 0 31 Figure 2 2 Address map The act and done signals of the hardware functions are mapped on the base address The number in the calling convention qualifier __CC wishbone number defines the bit number at which the act and done signals are mapped The return value is located at base address plus four Arguments are pushed onto a stack The stack starts at base_address 4 Arguments with a size of 8 bits or less are aligned at 8 bit boundaries Arguments with a size between 9 and 16 bit are aligned at 16 bit boundaries Arguments larger than 16 bits are aligned at 32 bit boundaries
47. operators shall not be used in expressions that yield a Boolean value Tests of a value against zero should be made explicit unless the operand is effectively Boolean Floating point expressions shall not be tested for equality or inequality The controlling expression of a for statement shall not contain any objects of floating type The three expressions of a for statement shall be concerned only with loop control A violation is reported when the loop initialization or loop update expression modifies an object that is not referenced in the loop test Numeric variables being used within a for loop for iteration counting shall not be modified in the body of the loop Boolean operations whose results are invariant shall not be permitted There shall be no unreachable code All non null statements shall either a have at least one side effect however executed or b cause control flow to change Before preprocessing a null statement shall only occur on a line by itself it may be followed by a comment provided that the first character following the null statement is a white space character The goto statement shall not be used The continue statement shall not be used For any iteration statement there shall be at most one break statement used for loop termination A function shall have a single point of exit at the end of the function The statement forming the body of a switch while do while or for statement be a compound st
48. parameters shall be declared with parameter type void The number of arguments passed to a function shall match the number of parameters A pointer parameter in a function prototype should be declared as pointer to const if the pointer is not used to modify the addressed object All exit paths from a function with non void return type shall have an explicit return statement with an expression A function identifier shall only be used with either a preceding amp or with a parenthesized parameter list which may be empty If a function returns error information then that error information shall be tested A violation is reported when the return value of a function is ignored Pointers and arrays x 17 1 x 17 2 17 3 17 4 17 5 17 6 333 Pointer arithmetic shall only be applied to pointers that address an array or array element Pointer subtraction shall only be applied to pointers that address elements of the same array gt gt lt lt shall not be applied to pointer types except where they point to the same array In general checking whether two pointers point to the same object is impossible The compiler will only report a violation for a relational operation with incompatible pointer types Array indexing shall be the only allowed form of pointer arithmetic The declaration of objects should contain no more than 2 levels of pointer indirection A violation is reported when a pointer with three or more levels of i
49. part provides detailed information about all memory spaces Per memory space the properties of the memory are shown and all variables that are allocated in this space are listed Memory properties syntax elements qualifier alt qualifier scope interface size allocated size type width address width select lines bram width bram depth bram count memory space qualifier as specified in source file memory space qualifier as used by the compiler internally __mem0 __mem9 internal external Of exported type of interface used either wishbone jtag Or parallel the size of the memory as specified in the LSL file size of the instantiated memory this can be less than size if the memory is not fully filled with data either single port ROM dual port ROM single port RAM dual port RAM 2 read 1 write true dual port ROM 2 read 2 write blocking FIFO or non blocking FIFO width of the memory interface i e the number of data signals number of address lines used number of select lines used for instantiated memories i e type equals internal or exported width of the memory cells as defined at HDL level number of words in the memory number of block rams used 120 Memory allocation syntax elements symbol address size properties Example identifies the data object address where the data object is stored size of the data object CHC Report File Format section properties of the data
50. pointed to by tp to a value of type time_t The return value has the same encoding as the return value of the t ime function Returns the current calendar time This value is also assigned to timer Converts the broken down time in the structure pointed to by tp into a string in the form Mon Feb 04 16 15 14 2013 n 0 Returns a pointer to this string Converts the calender time pointed to by timer to local time in the form of a string This is equivalent to asctime localtime timer Converts the calender time pointed to by timer to the broken down time expressed as UTC Returns a pointer to the broken down time Converts the calendar time pointed to by timer to the broken down time expressed as local time Returns a pointer to the broken down time The next function has a parallel function defined in wchar h time h wehar h strftime s smax fmt tm tp wstrftime s smax fmt tm tp Formats date and time information from struct tm tp into s according to the specified format fmt No more than smax characters are placed into s The formatting of st rft ime is locale specific using the LC_TIME category see Section 7 2 12 ocale h You can use the next conversion specifiers a abbreviated weekday name A full weekday name b abbreviated month name B full month name C locale specific date and time representation same as a b e oe H ae K lt C last two digits of the year d day of the month
51. rt 1 qualified functions e An__rt1 qualified function cannot calla non __rt1 qualified function so a function that is converted into an electronic circuit cannot call a function that is executed by a processor core e Non ___rt1 qualified functions can be inlined into __rt1 qualified functions e An__export qualified function cannot be inlined 34 C Language Implementation e Function pointers are not allowed as argument or return value in__ export qualified functions e An__export qualified function cannot have a variable number of arguments _ port A portis a static variable which is located in a private memory space that contains this variable only This memory space is mapped on a register Combined with the __ import and __export qualifiers it can become part of the external interface You can apply the data type qualifier __ port to static variables of scalar type Each __ port qualified variable is allocated in an individual unnamed memory space It is illegal to take the address of a__ port qualified variable Typically the __ port qualifier is used in combination with the __export and ___import qualifiers and the __ro and _ wo attributes A _ port qualified object that is also__ export or__ import qualified is implicitly volatile qualified __ input The data type qualifier _ input is predefinedas___ port _ import _ ro so the semantics of the separate qualifiers attributes apply _ output The data type qualifier outp
52. shall be written to comply with the provisions of this document and shall have been subject to appropriate validation Only those escape sequences that are defined in the ISO C standard shall be used Trigraphs shall not be used Identifiers internal and external shall not rely on the significance of more than 31 characters Identifiers in an inner scope shall not use the same name as an identifier in an outer scope and therefore hide that identifier A typedef name shall be a unique identifier A tag name shall be a unique identifier No object or function identifier with static storage duration should be reused No identifier in one name space should have the same spelling as an identifier in another name space with the exception of structure and union member names No identifier name should be reused The plain char type shall be used only for storage and use of character values signed and unsigned char type shall be used only for the storage and use of numeric values typedefs that indicate size and signedness should be used in place of the basic types Bit fields shall only be defined to be of type unsigned int or signed int Bit fields of type signed int shall be at least 2 bits long Octal constants other than zero and octal escape sequences shall not be used Declarations and definitions 8 1 8 2 8 3 8 4 R Functions shall have prototype declarations and the prototype shall be visible at both the function
53. sprintf sqrt sqrtf sqrtl srand sscanf swscanf stat strcat wcscat strchr wceschr strcmp wcscmp strcoll wescoll strcpy wcscpy strcspn wcscspn strerror strftime wstrftime strlen wcslen strncat wcesncat strncmp wcsncmp strncpy wcsncpy strpbrk wcespbrk strrchr wesrchr strspn wcsspn strstr wcsstr strtod wcstod strtof westof strtoimax strtok wcstok strtol westol strtold wcstold strtoul wcstoul strtoull wcestoull strtcoumax strxfrm wcesxfrm system tan tanf tanl tanh tanhf tanhl Uses iob calls _doscan See 1 Sets iob See 1 N A skeleton function Sets iob and calls malloc See 1 5 Updates the signal handler table Sets errno via calls to other functions Sets errno See 2 Sets errno See 2 Sets errno See 2 See rand Sets errno via calls to other functions Uses global File System Simulation buffer _fss_buffer Sets errno via calls to other functions Strtok saves last position in string in local static variable This function is not reentrant by design See 4 Sets errno See 2 Sets errno See 2 Sets errno See 2 Sets errno via calls to other functions N A skeleton function Sets errno See 2 Sets errno via call to other functions 104 Function Libraries Not reentrant because tgamma tgammaf tgammal time tmpfile tmpnam toascii tolower toupper towctrans towlower towupper trune truncf truncl ungetc u
54. standard characters shall not occur in include directives include shall be followed by either lt filename gt or filename Plain macros shall only be used for constants qualifiers specifiers Macros shall not be define d and undef d within a block undef should not be used A function should be used in preference to a function like macro A function like macro shall not be used without all arguments Macro arguments shall not contain pre preprocessing directives A violation is reported when the first token of an actual macro argument is Macro definitions parameters should be enclosed in parentheses Don t use undefined identifiers in pre processing directives A macro definition shall contain at most one or operator All uses of the pragma directive shall be documented This rule is really a documentation issue The compiler will flag all pragma directives as violations defined shall only be used in one of the two standard forms Pointer arithmetic should not be used No more than 2 levels of pointer indirection should be used A violation is reported when a pointer with three or more levels of indirection is declared No relational operators between pointers to different objects In general checking whether two pointers point to the same object is impossible The compiler will only report a violation for a relational operation with incompatible pointer types Non constant pointers to functions shall not be used
55. the allocation of C variables in memory Invocation This part contains the list of options that were passed to the CHC compiler It also shows the compiler options set by and files created by Altium Designer as a result of GUI interactions Example TASKING CHC C compiler v1 3r0 Build 197 Options o ProjectOutputs contrast_filter_u_contrast_filter sre dep file ProjectOutputs contrast_filter_u_contrast_filter d make target ProjectOutputs contrast_filter_u_contrast_filter sre f ProjectOutputs contrast_filter_u_contrast_filter src opt qualifier file ProjectOutputs contrast_filter_u_contrast_filter qua lsl file contrast_filter_u_contrast_filter 1lsl Interface This part shows the ports of the top level entity organized per interface element For each interface element the set of ports in the top level entity the mode input or output of the port and the width of the port is given Additionally the calling convention and optionally the initiation interval and the latency are given Example HH HH HH HE HE EH EE HE aE HE AE HE aE HE AE HE EE HE aE HEE aE HE EE EE aE aE EE aE HE EE EEE aE EE aE HE EEE HE EE EE EEE EE Interface HH HH HH HE HE EH HEE HE aE EE HEE HE EE HE aE HE EE aE HEE HE EE EE aE EE aE HEE EE HE aE EE aE HEE EE HEE EE EE EEE EE name io width Entry Point Function contrast_filter Calling convention parallel multi cycle entry point Pipeline initiation interval
56. the exponential function e exp2 exp2f exp21 exp2 Returns the result of the exponential function 2 Not implemented expm1 expmlf expm11 expm1 Returns the result of the exponential function e 1 Not implemented log logf logl log Returns the natural logarithm 1n x x gt 0 log10 logl0f log101 log10 Returns the base 10 logarithm of x x gt 0 loglp logipf logipl loglp Returns the base e logarithm of 1 x x lt gt 1 Not implemented log2 log2f log21 log2 Returns the base 2 logarithm of x x gt 0 Not implemented ilogb ilogbf ilogbl ilogb Returns the signed exponent of x as an integer x gt 0 Not implemented logb logbf logbl logb Returns the exponent of x as a signed integer in value in floating point notation x gt 0 Not implemented frexp Idexp modf scalbn scalbin math h tgmath h Description frexp frexpf frexpl frexp Splits a float x into fraction fand exponent n so that f 0 0 or 0 5 lt f lt 1 0 and 2 x Returns f stores n ldexp ldexpf ldexpl ldexp Inverse of frexp Returns the result of x 2 x and n are both arguments modf modff modfl Splits a float x into fraction f and integer n so that f lt 1 0 and f n x Returns f stores n scalbn scalbnf scalbnl scalbn Computes the result of x FLT_RADIXx efficiently not normally by computing FLT_RADIx explicitly scalbln scalblnf scalblnl scalbln Same as scalbn but with argument n as long int 83 C to Hardware Compiler User Manual Rounding fu
57. to the dialog when you click the Import From Source File button Once you close the dialog via the OK button the source file is updated based on the content of the dialog Both the source file and qualifier file are passed to the compiler which combines the two and effectively creates the following C code for which code will be generated __ export __CC combinatorial void xormachine bool INPORTO bool INPORT1 bool _ out OUTPORT OUTPORT INPORTO INPORT1 4 2 2 1 Default Mode Compilation Process Only the command line options that are relevant to obtain a basic understanding of how the tools operate are given Refer to the makefile for more details For clarity the prefix codesymexamp1e_ has been replaced with lt sn gt _ where lt sn gt _ is the name of the schematic document on which the C Code Symbol is placed che xor c 0o lt sn gt _xormachine src qualifierfile lt sn gt _xormachine qua H lt sn gt _xormachine h ndianness big target device xilinx_spartan3 resource definition spartan3 prd 02 libc ma report file lt sn gt _xormachine rpt init mem on reset no clear lsl file lt sn gt _xormachine 1lsl ashe lt sn gt _xormachine src o lt sn gt _xormachine obj hdlhe lt sn gt _xormachine obj toplevel lt sn gt _XORMACHINE wishbone address width 4 vhdl lt sn gt _xormachine vhd verilog lt sn gt _xormachine v 4 3 Entry Points and Startup C
58. you can specify an absolute address The address is a 32 bit address Examples unsigned char Display 80 24 __at 0x2000 The array Display is placed at address 0x2000 38 C Language Implementation int i _ at 0x1000 1 The variable i is placed at address 0x1000 and is initialized Limiting conditions Take note of the following limiting conditions if you place a variable at an absolute address The argument of the ___at attribute must be a constant address expression e You can place only variables with static storage at absolute addresses Parameters of functions or automatic variables within functions cannot be placed at absolute addresses e You cannot place structure members in contrast to the whole structure at an absolute address Absolute variables cannot overlap each other e When you declare the same absolute variable within two modules this produces conflicts except when one of the modules declares the variable extern e If you use 0 as an address the value is ignored A zero value indicates a relocatable section 3 8 Attributes You can use the keyword __ at tribute__ to specify special attributes on declarations or definitions of variables functions types and fields Syntax __attribute__ name or __name__ The second syntax allows you to use attributes in header files without being concerned about a possible macro of the same name This second syntax is only possible on a
59. you can use grouped per header file A number of functions declared in wchar h are parallel to functions in other header files These are discussed together Section 7 3 C Library Reentrancy gives an overview of which functions are reentrant and which are not The following libraries are included in the che toolset Both Altium Designer and the control program cche automatically select the appropriate libraries depending on the specified che derivative Library Description libc ma 32 bit C library big endian libc16 ma 16 bit C library big endian lipcle ma 32 bit C library little endian lipc1 6le ma 16 bit C library little endian 7 2 Library Functions The tables in the sections below list all library functions grouped per header file in which they are declared Some functions are not completely implemented because their implementation depends on the context where your application will run These functions are for example all I O related functions 7 2 1 assert h assert expr Prints a diagnostic message if NDEBUG is not defined Implemented as macro 7 2 2 complex h The current version of the CHC compiler does not support the type specifiers_ Complex and_Imaginary Therefore the functions in this include file are not supported The complex number z is also written as x yi where x the real part and y the imaginary part are real numbers of types float double or long double The real and
60. 9 data types in 16 bit mode with compiler option integer 16bit C Type Size mem Size reg Align Limits _Bool 8 1 8 Oori signed char 8 lt 8 8 0x80 0x7F unsigned char 8 lt 8 8 0 OxFF short 16 lt 16 16 0x8000 0x7FFF unsigned short 16 lt 16 16 0 OxFFFF __wchar_t int 16 lt 16 16 Ox8000 0x7FFF unsigned int 16 lt 16 16 0 0xFFFF 8 1 8 Oor1 enum 8 lt 8 8 0x80 0x7F 32 lt 32 32 Ox80000000 0x7FFFFFFF en 32 lt 32 32 0x80000000 0x7FFFFFFF __ ptrdiff_t unsigned long size i 32 lt 32 32 0 0OxFFFFFFFF 0x8000000000000000 long tamg o3 707 a 0x7FFFFFFFFFFFFFFF unsigned long long 64 lt 64 32 0 OXFFFFFFFFFFFFFFFF 22 C Language Implementation C Type Size mem Size reg Align Limits a 3 402E 38 1 175E 38 float 23 bit mantissa 32 32 32 1 175E 38 3 402E 38 double 64 64 32 1 798E 308 2 225E 308 long double 52 bit mantissa 2 225E 308 1 798E 308 pointer 32 lt 32 32 0 0xFFFFFFFF When you use the enum type the compiler uses the smallest possible type char unsigned char or int to represent the value You can force the compiler to use the full integer width with the compiler option integer enumeration always use 32 bit respectively 16 bit integers for enumeration Extended integer types non ISO C Integer type with widths between 1 and 64 bit are supp
61. ANGE 24 Result too large Errors returned by printf scanf ERR_FORMAT 25 Illegal format string for printf scanf ERR_NOFLOA 26 Floating point not supported ERR_NOLONG 27 Long not supported ERR_NOPOINT 28 Pointers not supported Encoding errors set by functions like fgetwc getwc mbrtowc etc EILSEQ 29 Invalid or incomplete multibyte or wide character 79 C to Hardware Compiler User Manual Errors returned by RTOS ECANCELED 30 Operation canceled ENODEV 31 No such device 7 2 5 fentl h The header file cnt1 h contains the function open which calls the low level function _open and definitions of flags used by the low level function _open This header file is not defined in ISO C99 open Opens a file a file for reading or writing Calls _open 7 2 6 fenv h Contains mechanisms to control the floating point environment The functions in this header file are not implemented fegetenv Stores the current floating point environment Not implemented feholdexept Saves the current floating point environment and installs an environment that ignores all floating point exceptions Not implemented fesetenv Restores a previously saved fegetenv or feholdexcept floating point environment Not implemented feupdateenv Saves the currently raised floating point exceptions restores a previously saved floating point environment and finally raises the saved exceptions
62. DR_O 19 0 YIPO NEXT_Y_Op 0 RGB_I 23 0 NEXT_RGB_0 23 0 HIS_I 9 0 NEXT_HIS_O gt 0 NEXT_HSI_O 29 0 DONE Bi Tsis 2 Hold down the Ctrl key and double click on C Code Symbol U_RGB2HST to open the associated C source file The entry point of the code symbol is function rgb2hsi In the source code this function is not qualified however it gets its qualifiers via the qualifier file Function rgb2hsi calls function rgb2hsi_stage_1 which is defined as static __CC parallel ack nowait void rgb2hsi_stage_1 Due to the given function qualifiers this function operates as a dataflow pipeline stage This function calls rgb2hsi_stage_3 which calls rgb2hsi_stage_4 which calls rgb2hsi_stage_5 All these functions are qualified with __CC parallel ack nowait as a result these functions will run in parallel where each function will start to operate on a next set of input data once the previous input data has been processed 6 9 Tuning the Timing of Dataflow Pipeline Stages The basic challenge in designing an efficient dataflow pipeline is to balance the latencies of each pipeline stage as the stage with the longest latency defines the throughput of the pipeline To change the timing of an individual pipeline stage you can split a dataflow pipeline stage in two parallel stages e implement a pipeline stage as a pipelined function move C code fragments from one pipeline stage to another stage 6 9 1 Spli
63. FPGA Resource Usage inc ccicos rince Seerdioveeesict E I nE pitana e TETONA EEEa ies es PERE S REESTRI EAI EPET 76 7e Upralie S rasmona a a EAE Eaa ES ETE E E TO O EOE TSS 77 yA MMOQUCHON E E E A A T A E A dacaewneneaeay 77 7 2 LIDFALY FUNCIONS osina ar E AE EE EE T E A EEE E es dente E EE EEE 77 T2 kassert Moea eee ah eink E NE E eel epee E E eee E EE EES eetetaaues 77 Ereni E E E E E E E A E E T 77 Z2 o ClY PEI ANG WELY PEIN niriereorersianan e E E Ea a E e Eaa a E En a a a 78 F224 E nlo H a EE T E E E 79 TE oai o E EA E E es es ee ee ey Pda E des 80 TEE PANA E A E A dane Seeaenee se 80 TETE MOAL EE E a a E T E E E xe 80 F 2 B inttypes Nama Staite cresine aa ao aa aaa AE deve na oe Eau E E aaa 81 TEASA OA a EE E A T E 81 Pie MO SOGAN aeaaea caters e a E E E E e E N uate ee 4 81 Pe A VesIIMMINS EU r ar E E E E E A E E EA 82 FPA locale rsaennaa a ea a E EEA AE EE R EE E EAE EE ines 82 TeS AMAMOG Mees resena eae n E E O E E E E EE a S 82 T2 l4 math hand tgmath hierren ai a EE AOE E EEE 82 T2 ND SEMP enara ewan A E mena T a O A N E A 85 FS AGS SIGMA see iru eaa eed ace e a etd nak ante eE E EESE E E E A EEEE 86 72 NASI AIG Mc nanea E A E E E E E E EIA 86 Pie WO SIO DOOM MGs seara e E E a a a e e a e E 86 TNO SUIS TI oera E EE E E E E E 86 F220 STAMEN iiaa aa a a E E Ea E E Mad ia E ee 87 722k stio Nand wehar sae cane Geseectevedtiaa beled eRe me dda Aa E ea ee Hl EEE OE R E A EOE OET 87 7 2 22 Stdio NANA weharena aa
64. Functions assigned to the same pointer shall be of identical type Automatic address may not be assigned to a longer lived object The null pointer shall not be de referenced A violation is reported for every pointer dereference that is not guarded by a NULL pointer test 109 C to Hardware Compiler User Manual 108 109 110 111 112 113 114 115 x 116 x 117 118 119 120 121 122 123 124 125 126 127 3 D DIDID I DIUVIWDII DD iae o Tre Toe Toe TOOTS SS SS eS eS eS eS ea Sa All st ruct union members shall be fully specified Overlapping variable storage shall not be used A violation is reported for every union declaration Unions shall not be used to access the sub parts of larger types A violation is reported for a union containing a struct member Bit fields shall have type unsigned int or signed int Bit fields of type signed int shall be at least 2 bits long All struct union members shall be named Reserved and standard library names shall not be redefined Standard library function names shall not be reused Production libraries shall comply with the MISRA C restrictions The validity of library function parameters shall be checked Dynamic heap memory allocation shall not be used The error indicator errno shall not be used The macro offsetof shall not be used lt locale h gt and the setlocale function shall not be used The set jmp and long jmp functions shall not be used
65. PGA project and are synthesized and processed by the FPGA vendor place and route tools These steps are beyond the scope of this manual 4 2 2 Default Operating Mode Start Altium Designer open thecodeSymbolExample Pr4Fpg project in directory Examples Soft Designs C to Hardware CodeSymbols Explained and build the example The rest of this section briefly describes how this project is compiled For more detailed info examine the makefiles in directories Output This directory contains the files that are created to build the embedded project Cont roller Pr jEmb For this example the build procedure of the embedded project is independent of the build procedure of the C Code Symbols and is therefore not further discussed Out NB DB CodeSymExample_ Each of these directories contain the build procedure of one specific C Code Symbol Below we discus the build procedure for C Code Symbol XORMACHINE 48 XORMACHINE Figure 4 3 C Code Symbol XORMACHINE 1 Open the schematic document CodeSymbolExample SchDoc 2 Double click on the C Code Symbol XORMACHINE The C Code Symbol configuration dialog appears C Code Symbol Properties xternal Functions Ports Memories Options Files Parameters Function name xormachine Pipelined Interface type Parallel Combinatorial start or Data Type High Signal Level Register function output Return imm
66. The arguments are processed from left to right First the 8 bit or less sized arguments are moved to the stack followed by the 9 16 bit arguments and the arguments larger than 16 bits Parameters that have an___ out attribute are treated in the same way However output parameters are analogous to the return value placed on the output stack only 15 C to Hardware Compiler User Manual The caller does not have to save any registers when calling a__rt1 _ export qualified function Run time Semantics The parameters are latched they can be written in any order Execution starts when the bit at the base address is asserted which matches the act signal of the hardware function this bit is atomically cleared The bit at the base address which matches the done signal of the hardware function is set once the hardware function is finished The return value and output qualified function parameters are latched and can be read afterwards 2 3 3 Wishbone Single Cycle Bus Adapter A Wishbone bus adapter is placed on top of the function s parallel multi cycle interface signals If the pipeline modifier is set then the nowait modifier must also be set otherwise it is not possible to create pipelined behavior The signals of the parallel interface are mapped on the signals of the Wishbone bus and are accessed in one Wishbone READ WRITE cycle which can take up multiple clock cycles depending on the number of clock cycles that are required to e
67. UT 1 64 gt 0 Data identifies a function output parameter Function output parameters are an ISO C language extension The extension is introduced to support the concept of multiple function return values To create an output parameter insert the __ out attribute in front of a parameter See also Section 3 8 Attributes A pin with role OUT has the same semantics and timing as a pin with role RETVAL ADDRESS 1 32 0 2 Wishbone ADR used by a wishbone single bus cycle interface or by a memory interface BYTE_SELECT 2 4 8 0 2 Wishbone SEL used by a wishbone single bus cycle interface or by a memory interface WE 0 2 Wishbone WE used by a wishbone single bus cycle interface or by a memory interface The following Wishbone pin roles are used by the Memories and Memory Mapped Peripherals interface and by functions qualified with __CC wishbone Role Mode Bus size Description CLK l 1 CLOCK each wishbone interface element has its own CLK pin RST 1 RESET each wishbone interface element has its own RST pin CYC l 1 Start of wishbone cycle STB l 1 Start of wishbone transaction CHC currently only supports one transaction per cycle so CYC and STB or ed together are treated as one value ACK O 1 Signals a wishbone transaction is finished Same as DONE DAT O 0 64 Data usually both input and output Th
68. _func_DON Provides extended types Array coef is located in internal memory in This is an input port out This is an output port alled_func uint3_t par_cf This is an imported function ntry_point uint3_t par_ep __out par_out ntry point f par_ep coef par_ep called_func par_ep logic logic logic t sta logic d_logic_vector 3 downto 0 logic E in std_logic called_func_RETVAL in std_logic_vector 2 downto 0 called_func_STA RT out std_logic called_func_par_cf out std_logic_vector 2 downto 0 pirn lt in std L ogic_vector 2 downto 0 p_out out std_logic_vector 2 downto 0 par_ep in std_logic_vector 2 downto 0 par_out out std_logic_vector 31 downto 0 end entity c_root 12 External Interface Parallel interface default timing The following diagram shows the timing of e The CHC call interface signals CLOCK R The external function interface signals called_func_par_cf called_func_START called_func_DON T SET RESET_DONE par_ep START DON T RETVAL BJ called_func_RETVAL e The __input port signal p_in e The __output port signal p_out Function called_func must be idle when called otherwise the behavior of the function is undefined Note L J L represents a period of zero to N clock cycles CLOCK RESET RESET DONE par_
69. _nios 2 4 Memory 2 4 1 How the Compiler Deals with Memory Commonly the performance of a hardware function depends on the available memory bandwidth If the C source code is parallelizable the compiler instantiates many functional units that operate concurrently The memory system should be able to feed the functional units with data and save the computed results without stalling the functional units Programmable hardware offers a virtual unlimited number of parallel accessible registers However large data structures arrays and variables whose address is taken require allocation in memory The compiler tries to construct an efficient memory system based upon the characteristics of the application program and the available memory resources Thus you do not have to construct the whole memory system by hand The memory resources the physical memories and associated latency number of access ports interface signals etcetera are described in the linker script file 1s1 file 17 C to Hardware Compiler User Manual The compiler analyzes the C program and calculates the points to sets for all pointers Also the access patterns of all data objects variables are calculated Based upon this analysis the compiler allocates variables to specific memories This automated process leads to an efficient use of the available memory resources You can influence this process by specifying the maximum number of internal memories that the comp
70. a Typically the performance of the memory system restricts overall system performance Especially if a processor core shares data with hardware functions that shared memory will likely be the system s bottleneck Registers Programmable hardware FPGA s offers a virtually unlimited amount of registers to store variables and temporary results Registers are the fastest accessible storage locations All registers can be accessed in parallel FPGA memory Modern FPGAs supply large quantities of configurable on chip block RAM and distributed RAM The characteristics of the on chip RAM such as the number of access ports the bit width and size of the RAMs are configured when the bit file is loaded into the FPGA Variables stored in different or in multi ported RAMs can be accessed in parallel Memory latency Memory latency is defined as the time it takes to retrieve data from memory after the data request Typically on chip memory has a latency of one which means that the data arrives in the clock cycle following the request The memory latency can also be variable in that case a handshake signal is asserted once the data becomes available If multiple components processor core hardware function or peripheral share memory via a common bus interface the memory latency will be variable Variable latencies have a negative effect on system performance program execution halts until the handshake signal is asserted How the compiler uses register
71. a N 7 2 1 External nterface by Example ecic cc asciecectenceseradehigentnehenes e aa a a ara E Ea AEAEE 8 22 PINS ioga ere E O a EA a E a O A DNE 9 2 3 F nction Call Merac E iineoae ai EEA E EE NETE EEEE EE nE E NE EAE E AEE 11 2 3 1 Timing Diagrams of the Parallel Bus Interface 0 cceceeeee eens eee tenet eee e tensa teeta eens en eeeea tensa eaeeeeanegeas 12 2 3 2 Wishbone Multi Cycle Bus Adapter cece eee eee ee erent tenet een een eens 15 2 3 3 Wishbone Single Cycle Bus Adapter cecceeee teeter nent rete et ee eter eeeeeeaeeaes 16 2 3 4 NIOS Bus Adapter ccceeeeeeeeeeee ee ceee eet nein aaea a A EEE a EEE EE EAA EEA NEE 16 2A MEMO rare nn R N A EE E none peed wales ROEA EE ORE E AEA OE E E 17 2 4 1 How the Compiler Deals with Memory ceceeeee cece eee e ee eect eee eee e eee eee ese eens esse eseeeeeseeeeesees 17 2 4 2 Memory Interface and Arbiters cece cee ee eee eee eee eee eee eee neta eee eens ee eee e esse ese eses ee eeeenenies 18 2 4 3 Timing Diagram of the Memory Interface cee ceeeee ene e erect eee t eter e ene e arene deen ta tensa raran ea teeaeeeeaees 18 2 4 4 Memory Interface Signals sssrinin irienn erae peeved iE a Ua es hides eee eens 18 2 Sr POMS seee aa seed uesieeahas ahs entrce ena nes na E R Ea TE s E aaa EEEE uacecs duce wen O case EA EAS eave ndeacees 20 3 C Language Implementation cece cece eee eee eee een een eee
72. acros are useful to create conditional C code Macro Description __BIG_ENDIAN__ Expands to 1 if the compiler operates in big endian mode Otherwise not recognized as a macro __LITTLE_ENDIAN__ Expands to 1 if the compiler operates in little endian mode Otherwise not recognized as a macro _ BUILD _ Identifies the build number of the compiler composed of decimal digits for the build number with leading zeros removed three digits for the major branch number and three digits for the minor branch number For example if you use build 1 22 1 of the compiler _BUILD__ expands to 1022001 If there is no branch number the branch digits expand to zero For example build 127 results in 127000000 _ CHC __ Identifies the compiler You can use this symbol to flag parts of the source which must be recognized by the che compiler only It expands to 1 __DATE__ Expands to the compilation date mmm dd yyyy _ DOUBLE _FP_ Expands to 1 if you did not use option no double Treat double as float otherwise unrecognized as macro _ DSPC__ Indicates conformation to the DSP C standard It expands to 0 _ FILE Expands to the current source file name _ LINE Expands to the line number of the line where this macro is called __INTEGER_16BIT__ Expands to 1 if the compiler operates in 16 bit mode option integer 1 6bit __REVISION__ Expands to the revision number of the compiler Digits are repre
73. al cannot return The compiler can optimize without regard to what would happen if fatal ever did return This can produce slightly better code and it helps to avoid warnings of uninitialized variables pure You can use __attribute__ pure to specify that a function has no side effects although it may read global data Such pure functions can be subject to common subexpression elimination and loop optimization See also attribute const used You can use _attribute_ used to prevent an unused symbol from being removed Example static const char copyright __attribute__ used Copyright 2010 Altium BV When there is no C code referring to the copyright variable the compiler will normally remove it The__ att ribute__ used symbol attribute prevents this unused You can use ___attribute__ unused to specify that a variable or function is possibly unused The compiler will not issue warning messages about unused variables or functions weak You can use _attribute_ weak to specify that the symbol resulting from the function declaration or variable must appear in the object file as a weak symbol rather than a global one This is primarily useful when you are writing library functions which can be overwritten in user code without causing duplicate name errors See also pragma weak 42 C Language Implementation 3 9 Libraries The main difference between traditional C libraries and the CHC C library
74. alifier is added automatically by the CHC compiler when the CHC compiler operates in default mode Because of the __ export qualifier the function becomes an entry point and can be accessed via the input and output ports on the schematic Because of the __cCc qualifier the CHC compiler produces a parallel bus interface through which you can connect the input and output ports of the C Code Symbol to other components Restrictions on Function Calls The C to Hardware compiler does not support function reentrancy so recursion cycles in the call graph and concurrent access are not allowed In case you call a hardware function from an interrupt handler make sure all concurrency conflicts are solved For each hardware function a function prototype that declares the return type of the function and also declares the number and type of the function s parameters is required Functions with a variable number of arguments are supported The following rules apply to the interaction between software and hardware functions e Recursion and concurrent access are only allowed with non __rt1 qualified functions in the call graph e An__export __rt1 qualified function can be called from non __rt1 qualified functions thus can be called from functions that are executed by a processor core e An__export _ rt1 qualified function can be called from __rt1 qualified and_ rt 1 _ export qualified functions e An__rt1 qualified function can be called from ___
75. also possible However the compiler will generate a warning in this situation with the exception of the following case when the logical type of the destination pointer is char or void no warning will be generated Example struct char c __unaligned int i aligned at offset 1 s __unaligned int up amp s i Packed structures To prevent alignment gaps in structures you can use the attribute __ packed__ When you use the attribute __ pack ed__ directly after the keyword struct all structure members are marked __unaligned For example the following two declarations are the same struct __packed__ char i int 1 sl struct char __unaligned c int _ unaligned i _ unaligned at right side of to pack pointer member s2 The attribute ___ packed__ has the same effect as adding the type qualifier __ unal igned to the declaration to suppress the standard alignment You can also use __packed__ ina pointer declaration In that case it affects the alignment of the pointer itself not the value of the pointer The following two declarations are the same 24 C Language Implementation int __unaligned p int p __packed__ Change alignment With the attribute __align n you can overrule the default alignment of objects or structure members to n bytes 3 4 Predefined Preprocessor Macros The CHC compiler supports the predefined macros as defined in the table below The m
76. ame are claimed Table of Contents A IMMOCUCUO MN sensere a a a E ness bodes Ob E pecn OG ea ad inde dates deste EA 1 1 e Manuall Purpose and Structure ccs orison nei aaao an Oaa a aa T ada race inet aLa aia a aaa ana aas 1 1 1 1 Required Knowledge to use the CHC Compiler ccceceeeeee eee ee cece teats nese eeaeeeeeaeeeeeaeeseeaeeeeeaeeeeeaes 1 14 2 Suggested Reading e aanere aaa a shed anc hndald clbbladbaidad intend siuacdada sd deadiees inde tenant nents 1 1 2 Introduction to C to Hardware Compilation 2 2 0 0 cc nent net ete ee eee renee 1 1 2 1 What can you Expect from the CHC Compiler ccceeeeeeeeeee cece eect eee ee sees esse eseeseeseeeeeeeeeeeseeees 2 1 3 MOOISET OVEIVIEW sax aaccssia2 itaran tains dean nfenavndanesnins aeae a a a EA BaRa ai e aSa aN S EAA hhi SEAE 2 1 3 1 Compiling to HardWare aeocscsieeinno iiaiai e aeania Aone aa aai aiaa iaia aaa aE 3 1 3 2 Hardware Assembly HASM and Assembling ccceeeeee eee n eee e eee een ete eee eee ee ated eta ee neta een eeaeeneeaeenes 3 1 3 3 Linkingvand Locating en fice terete cies ce dtaaehesundig devoid aes icsnksees te Eaa ERE aavae eakeentpee pip AR EAEE EE 3 1 3 4 HDL Generation 200 I I I I EE LEE EE nen et nee etneenetieen ee 3 1 4 Shared Datasisitecane tooo seiniied Masai lactadnas ds E EE E E inoldad ign cb dies hha a REE EEE 4 2 Extermal INtemaC eseese der aerae fexadeavevsuacts EE E ET E peed cues rie aTa AEE bet
77. ary CHC compiler ctarget oma che assembly file hardware assembly file Src Src e o y FPGA design assembler hardware assembler j astarget ashc schematic SchDoc relocatable object file CHC object file Clip 0bj 0bj ibrary lib y v linker Lied Ik target absolute object file abs HDL generator hdihc CHC hardware file vhdl v i x y debugger synthesis place and route BIT file FPGA spartan Cyclone soft core Figure 1 1 CHC Toolset Flow Within Altium Designer the build steps described in the following sub sections are performed automatically and the resulting HDL files are also again without user intervention integrated in the build process that creates the bit file that is used to program the FPGA Introduction 1 3 1 Compiling to Hardware The C source files are submitted to the compiler of the CHC toolset and if necessary to the compiler of a regular embedded toolset The embedded toolset compiles the C sources to software whereas the hardware compiler compiles functions and data objects to hardware Both compilers need to know which functions and or data objects should be translated to hardware and which should be translated to software The compilers use qualifiers for this The qualifiers can be specified in two ways e in the C source files or e in a qualifier file This file is generated when you use the dialogs in Altium Designer to mark which functions and data object
78. asserted until the done signal is raised is not possible with this modifier set This parameter is only possible in combination with a__CC parallel qualifier and cannot be used together with the ack or pipeline modifier Example for ASP operating mode to build an ASP __rtl __export __CC wishbone 1 void my_hw_func void Because of the __rt1 qualifier the code for the C function my_hw_func is generated by the CHC compiler The __ export qualifier enables the function my_hw_func to be called by code that executes on the processor core by non ___rt1 qualified functions Because of the ___CC qualifier the CHC compiler produces a Wishbone multiple bus cycles bus interface which connects an ASP to a soft core processor Because the nowait parameter is not specified the caller i e the code generated by the embedded compiler running on the processor core will wait by entering a polling loop until my_hw_func returns before it executes subsequent instructions Altium Designer generates this function qualifier automatically with the wishbone attribute a unique id and without the nowait attribute You can verify this by opening the qualifier file pro jectname qua which is located in the output directory of your embedded project Example for default operating mode to build a C Code Symbol __ export __CC combinatorial void add int8_t a uint8_t b __out intl6_t sum The __rt1 qualifier is not needed because the __ rt 1 qu
79. atement An if expression construct shall be followed by a compound statement The else keyword shall be followed by either a compound statement or another if statement 113 C to Hardware Compiler User Manual 14 10 R Allif else if constructs shall be terminated with an else clause Switch statements 15 1 15 2 15 3 15 4 15 5 Functions 16 1 16 2 16 3 16 4 16 5 16 6 16 7 16 8 16 9 16 10 R R R R R 3 pe Se ToS TST E R A switch label shall only be used when the most closely enclosing compound statement is the body of a switch statement An unconditional break statement shall terminate every non empty switch clause The final clause of a switch statement shall be the default clause A switch expression shall not represent a value that is effectively Boolean Every switch statement shall have at least one case clause Functions shall not be defined with variable numbers of arguments Functions shall not call themselves either directly or indirectly A violation will be reported for direct or indirect recursive function calls in the source file being checked Recursion via functions in other source files or recursion via function pointers is not detected Identifiers shall be given for all of the parameters in a function prototype declaration The identifiers used in the declaration and definition of a function shall be identical Functions with no
80. ay members are stored in memory FPGAs provide multi ported memories but the number of access ports is commonly limited to two As a result only one member of a and one member of b can be accessed in the same cycle Parallelism increases if arrays a and b are stored in different dual ported memories In that case two members of a and two members b are accessible within the same clock cycle The essence of this example is that array accesses in loops impose a high load on the memory system which typically forms the bottleneck in the overall system performance 5 1 Dependencies In general a C compiler translates the statements in your C program into series of low level operations To maintain the semantics of the program these operations must be executed in a particular sequence When operation A must occur before operation B we say that B depends on A this relationship is called a dependency 57 C to Hardware Compiler User Manual A compiler creates a so called data dependency graph that shows all dependencies for a code fragment The data dependency graph defines the order in which operations must be executed Dependencies inhibit parallelism It is a task for both the software engineer and the compiler to rearrange a program to eliminate dependencies Dependencies are commonly subdivided into contro dependencies and data dependencies Control dependencies arise from the control flow in the program e Data dependencies arise from the
81. bjects with automatic storage duration to default memory space No assumptions can be made when casting a pointer to a different memory space Such casts are therefore not allowed Additional constraints to the relational operators concerning memory qualified operands Both operands must be pointers with equal memory qualifiers Additional constraints to the equality operators concerning memory qualified operands Both operands must be pointers with equal memory qualifiers The LSL file describes a system in terms of cores address spaces buses and memories The compiler reads the LSL file and creates a set of memory space qualifiers to facilitate identification of the memory spaces at C language level In Altium Designer the LSL file is created automatically In the C Code Symbol configuration dialog s Memories tab you can define internal and external memory spaces The internal memory spaces are named __ MEMO to __MEMn where n equals the maximum number of internal memories minus one These internal memory spaces are typically reserved for use by the compiler auto partitioning optimizer You can specify external memory spaces by adding entries to the Memory and Memory Mapped Peripheral Busses list The name of the memory space is equal to the name you assign to the memory or peripheral prefixed with two underscores As a consequence the names should not conflict with C keywords and symbols used in your C source When creating an ASP
82. but it is shared with the CHC compiler 3 When the compiler did not find the include file because it is not in the specified include directory or because no directory is specified it looks in the path s specified in the environment variable CHCINC 4 When the compiler still did not find the include file it finally tries the default include directory relative to the installation directory Example Suppose that the C source file test c contains the following lines include lt stdio h gt include myinc h First the compiler looks for the file st dio h in the specified directory Because no directory path is specified with st dio h the compiler searches in the environment variable CHCINC and then in the default include directory The compiler now looks for the file myinc h in the directory where test c is located If the file was not found the compiler searches in the environment variable CHCINC and then in the default include directory 4 7 How the Compiler Searches the C library If your code calls functions defined in the C library you should pass the path to the C library at the command line The compiler will link the function definitions with your code The 32 bit version of the C library is named 1ibc ma The 16 bit version of the C library is named 1ibc16 ma Both libraries are located in directory System Tasking chc 1lib The compiler does not search in other directories than the one specified at the command line
83. cannot be met Parallelism 63 C to Hardware Compiler User Manual 64 Chapter 6 Design Patterns This chapter contains a collection of design patterns and questions and answers related to the C to Hardware compiler Most of the design patterns are demonstrated in one of the examples that are shipped with Altium Designer Therefore this chapter briefly describes the design pattern and further refers to an example that demonstrates the pattern 6 1 Creating an ASP How to create an Application Specific Processor is described in the Altium Wiki http wiki altium com on page Introduction to C to Hardware Compilation Technology in Altium Designer 6 2 Creating a C Code Symbol and Testing it Using a Virtual Instrument Design pattern 1 Place a C Code Symbol on a schematic Sheet 2 Double click on the symbol to configure it 3 Right click on the symbol and select menu item Code Symbol Actions Create C File from Code Symbol Example Location Examples Tutorials CHC Accumulator Project CHC_Accumulator Pr4Fpg is a very simple design which shows how to create and test a C Code Symbol The Virtual instrument in this design is used to send stimuli to the C Code Symbol and to display the outputs of the Code Symbol Ul Custom histnment CH TOTAL_IB1 0 VALUE_OB1 0 VALUE_IB1 0 TOTAL_OG1 0 GO_O START CUSTOM_INSTRUMENT You can use all ISO C operators to define the behavior of the C Code Block So if you wa
84. ccess the pages from the internet directly or locate them from within Altium Designer From the Help menu select Altium Wiki Altium Designer You can then find the documents by navigating to Soft Design We advice you to read Chapter 11 Glossary at the end of this manual to become familiar with the terminology used 1 2 Introduction to C to Hardware Compilation The CHC compiler is an algorithmic design and implementation tool which reduces the cost and lead time of the hardware design cycle while maintaining quality of results The CHC compiler accepts standard untimed ISO C source code as input The CHC compiler can translate a C source file to hardware This operating mode is associated with a C Code Symbol in Altium Designer Alternatively the CHC compiler can translate parts of the C source to hardware functions and the remaining parts to an instruction sequence for a micro controller This operating mode is associated with an Application Specific Processor ASP In this latter case the CHC compiler is used in combination with one of Altium Designer s embedded compilers to build a system with an embedded processor core s that off loads certain functions to hardware C to Hardware Compiler User Manual 1 2 1 What can you Expect from the CHC Compiler In essence the CHC compiler is a high optimizing general purpose C to gates compiler extended with facilities to easily interface the generated logic with your existing hardware soft
85. ce The following description discusses these items in more detail The numbers at the beginning of each paragraph relate to the number references in the table above 1 iob structures 105 C to Hardware Compiler User Manual The I O part of the C library is not reentrant by design This is mainly caused by the static declaration of the iob array The functions which use elements of this array access these elements via pointers FILE Building a multi process system that is created in one link run is hard to do The C language scoping rules for external variables make it difficult to create a private copy of the iob array Currently the iob array has external scope Thus it is visible in every module involved in one link phase If these modules comprise several tasks processes in a system each of which should have its private copy of iob J itis apparent that the iob declaration should be changed This requires adaptation of the library to the multi tasking environment The library modules must use a process identification as an index for determining which iob array to use Thus the library is suitable for interfacing to that kernel only Another approach for the iob declaration problem is to declare the array static in one of the modules which create a task Thus there can be more than one iob array is the system without having conflicts at link time This brings several restrictions Only the module that holds
86. cessaryAltium Designer sets this option automatically __CMB__ Expands to 1 if the CHC is compatible with the MicroBlaze processor and compiler option Ccmb When necessaryAltium Designer sets this option automatically 25 C to Hardware Compiler User Manual Macro Description _ NIOS2__ __CNIOS__ Expand to 1 if the CHC is compatible with the NIOS processor and compiler option Ccnios When necessaryAltium Designer sets this option automatically Example if _ CHC__ this part is only for the C to Hardware compiler endif 3 5 Pragmas to Control the Compiler Pragmas are keywords in the C source that control the behavior of the compiler Pragmas overrule compiler options Put pragmas in your C source where you want them to take effect Unless stated otherwise a pragma is in effect from the point where it is included to the end of the compilation unit or until another pragma changes its status When the C to Hardware compiler is used in combination with an embedded compiler the C source code is both processed by the embedded compiler and the CHC compiler It depends on the available options of the embedded compiler whether certain pragmas are recognized or have any relevance For example pragma unroll_factor is only recognized by the embedded compiler if the embedded compiler supports the optimization oop unrolling f not the embedded compiler does not recognize the pragma and will ignore
87. ckwards compatibility with ISO C90 For ISO C99 the memory allocation functions are part of stdlib h See Section 7 2 22 stdlib h and wehar h malloc size Allocates space for an object with size size The allocated space is not initialized Returns a pointer to the allocated space calloc nobj size Allocates space for n objects with size size The allocated space is initialized with zeros Returns a pointer to the allocated space free ptr Deallocates the memory space pointed to by ptr which should be a pointer earlier returned by the malloc or calloc function realloc ptr size Deallocates the old object pointed to by ptr and returns a pointer to a new object with size size while preserving its contents If the new size is smaller than the old size some contents at the end of the old region will be discarded If the new size is larger than the old size all of the old contents are preserved and any bytes in the new object beyond the size of the old object will have indeterminate values 7 2 14 math h and tgmath h The header file math h contains the prototypes for many mathematical functions Before ISO C99 all functions were computed using the double type the float was automatically converted to double prior to calculation In this ISO C99 version parallel sets of functions are defined for double float and long double They are respectively named function function function1 All long type functions though declared in mat
88. ction mak Only the command line options that are relevant to obtain a basic understanding of how the tools operate are given Refer to the makefile for more details che main c sw_edgedet c hw_edgedet c swplatform c o edge_detection srcec qualifier file edge_detection qua core compatibility c3000 ndianness big resource definition spartan3 prd lsl file edge_detection_mem 1sl ashe edge_detection srce o edge_detection obj hdlhe edge_detection obj toplevel Configurable_ASP wishbone address width 4 vhdl edge_detection vhd verilog edge_detection v Embedded toolset invocation The following tool invocations are extracted taken form the makefile Examples Soft Designs C to Hardware Edge Detection Embedded EmbOut ChcOutputs edge_detection mak Only the command line options that are relevant to obtain a basic understanding of how the tools operate are given Refer to the makefile for more details c3000 c main c o main src q edge_detection qua as3000 main src o main obj il These steps are repeated for each file in the embedded project 1k3000 o edge_detection abs main obj sw_edgedet obj hw_edgedet obj swplatform obj __framework lib edge_detection_mem 1lsl edge_detection 1sl core sw d edge_detection_mem 1sl c edge_detection IHEX Subsequent processing Subsequently the generated HEX VHDL and or Verilog files are integrated in the build flow of the whole F
89. cy can force the loop to be run sequentially To execute a loop as fast as possible the operations within the loop body as well as multiple iterations of the loop should execute in parallel Multiple iterations of the loop body can execute in parallel if there are no data dependencies between the iterations A dependency may be loop independent i e independent of the loop s surrounding it or loop carried Loop carried dependencies result from dependencies among statements that involve subscripted variables which nest inside loops The dependency relationships between subscripted variables become much more complicated than for scalar variables and are functions of the index variables as well as of the statements In the code fragment below the anti dependency caused by writing b i j in s4 andreadingb i j in s3 is loop independent The flow dependency of s4 on s3 arising from setting an element of a in s3 and s4 s use of it one iteration of the inner j loop later is loop carried in particular carried by the inner loop 60 Parallelism s1 for int i 0 i lt 3 i s2 for int j 0 j lt 4 j 83 ali j b i j cli j s4 bfil j amp lil 5 1 AALi l t Try to avoid loop carried dependencies by restructuring your source code 5 2 The Memory System If many operations execute in parallel the memory system should provide the necessary bandwidth to feed all operations with dat
90. declare the external function s prototype with function qualifier __ import External functions can be accessed via several interfaces or calling conventions in C parlance You can specify the calling convention with the __cc function qualifier Multiple calling conventions can be present in one CHC program The CHC compiler adds the appropriate signals to the top level entity to facilitate interfacing with __ import qualified functions An external function can be but does not have to be implemented in C language External functions must use exactly the same interface signals and the same timing as entry points that are accessed via the function call interface See Section 2 3 Function Call Interface Ports Ports are data objects i e variables that can be accessed by the C program A port is created when a static variable of arithmetic type is declared with either the __ input or___output qualifier It is allowed to read data from an input port writing data to an input port is not allowed It is allowed to write data to an output port reading data from an output port is not allowed Ports cannot be referenced via pointer types The CHC compiler adds the appropriate signals to the top level entity to facilitate interfacing with ___ input or___output qualified ports C to Hardware Compiler User Manual Memories and Memory Mapped Peripherals Memory devices and memory mapped peripheral devices are used by the C program but are not d
91. difference maximum minimum Libraries math h tgmath h Description fdim fdimf fdiml fdim Returns the positive difference between x y Not implemented fmax fmaxf fmaxl fmax Returns the maximum value of their arguments Not implemented fmin fminf fminl fmin Returns the minimum value of their arguments Not implemented Error and gamma Not implemented math h tgmath h Description erf erff erfl erf Computes the error function of x Not implemented erfc erfcf erfcl erc Computes the complementary error function of x Not implemented lgamma lgammaf lgammal lgamma Computes the log I x Not implemented tgamma tgammaf tgammal tgamma Computes I x Comparison macros Not implemented The next are implemented as macros For any ordered pair of numeric values exactly one of the relationships ess greater and equal is true These macros are type generic and therefore do not have a parallel function in tgmath h All arguments must be expressions of real floating type math h tgmath h Description isgreater Returns the value of x gt y isgreaterequal Returns the value of x gt y isless Returns the value of x lt y islessequal Returns the value of x lt y islessgreater Returns the value of x lt y x gt y isunordered Returns 1 if its arguments are unordered 0 otherwise Classification macros The next are implemented as macros These macros are type gene
92. e difftime div ldiv lldiv erf erfl erff erfc erfcf erfcl exit exp expf expl exp2 exp2f exp21 xpml expmlf expmll fabs fabsf fabsl Eclose fdim fdimf fdiml feclearexcept fFegetenv fegetexceptflag Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Not implemented Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Uses global File System Simulation buffer fss_buffer Calls fclose See 1 Modifies iob See 1 Sets errno via calls to other functions Calls close cosh calls exp which sets errno If errno is discarded cosh is reentrant Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Sets errno via calls to other functions Calls asctime Not implemented Not implemented Calls fclose indirectly which uses iob calls functions in _atexit array See 1 To make exit reentrant kernel support is required Sets errno Not implemented Not implemented Uses values in iob See 1 Not implemented Not implemented Not implemented Not implemented 100 Libraries Function Not reentrant because feget round Not implemented feh
93. e e you should analyze and fix all warning messages issued by the compiler you may enable MISRA C code checking and analyze and fix all warnings e you should debug and run your software on an embedded processor core Alternatively you can debug your code on a PC Finally you should instantiate the debugged functions in hardware 4 9 1 Printf style Debug You can insert printf style debug statements in the source code of a C Code Symbol In Altium Designer the output is sent over JTAG to a C Code Symbol debug console similar to a virtual terminal which is shown on the Altium Designer e Devices View page once the project has been built and downloaded to the FPGA Double click on the debug console CODE_SYMBOL_CONSOLE to open it PACK_FLOAT CODE_SYMBOL_CONSOLE Running Console This enables you to inspect the behavior of the C source code It does not enable you to inspect the timing of the generated code i e it does not facilitate debugging details that are supposed to be left to the CHC compiler Instrument Rack Soft Devices JTAG CORE Output 000000 002001 859600 000000 389055 Save To File Code Symbol Console Module 53 C to Hardware Compiler User Manual You can enable and disable the debug feature in Altium Designer in the Options tab of the C Code Symbol properties dialog via the option Enable Printf Style Debugging while the source code remains untouched If debug is disabled the CHC compil
94. e CHC compiler currently needs input and output to be of the same width ADR l 0 32 Address SEL l 0 2 4 8 Facilitates addressing within a word WE l Oor1 Write enable 10 2 3 Function Call Interface External Interface Calling a hardware function involves four steps that are independent of the used calling convention these steps are passing parameters to the hardware function e activating the hardware function e waiting until the hardware function returns retrieving the return value and the values of function output parameters The first argument of the calling convention qualifier __ Cc defines the bus protocol to which the signals at the external interface adhere Based on the specified calling convention the compiler emits additional logic to make the hardware functions accessible through a given bus protocol as shown in the figure below Parallel interface Wishbone bus NIOS Cl bus converted signals Wishbone bus NIOS custom adapter instr adapter lt raw signals gt lt raw signals gt Hardware Hardware Hardware functions functions functions Figure 2 1 Bus interfaces The following bus interfaces are supported Combinatorial Interface A combinatorial circuit consists of logic gates whose outputs at any time are determined only by the values of the inputs In this interfac
95. e available number of functional units and their latencies Based upon the latencies the compiler decides whether it can chain operations If two Operations are chained they execute within the same cycle and the output of the first operation is the input for the second Consider the following code fragment sl az i J s2 b i j 83 b b lt lt 2 There is one dependency statement s3 must execute after s2 the other statements may execute concurrently The latencies of the operations are commonly quite different Assume the following latencies are defined in the resource definition file multiply 50 addition 30 and shift 5 time units Notice that a shift operation with a constant shift value consumes virtually zero time since there is no logic involved Given these latencies the shift operation can be chained with the addition and the chained operation executes concurrently with the multiply i gt add gt shift_2 b j gt mull gt a Figure 5 1 Scheduling 5 3 Pipelining The pipelining feature of the CHC compiler facilitates the creation of highly parallel schedules at the cost of deviating from standard ISO C calling conventions A pipelined function can accept and start processing new input parameters while previous one or multiple function invocation s are still being processed In C parlance a function can be called again befo
96. e mode only the parameters and the return value of the exported function appear in the external interface no control signals exist e Parallel Multi cycle Interface This is the default when you omit the __cc qualifier This type of circuit requires at least one clock cycle to complete The parameters and return value of the exported function appear in the external interface as well as a set of control signals for example CLOCK RESET START and DONE e Wishbone Multiple Bus Cycles Interface A Wishbone bus adapter is placed on top of the function s parallel multi cycle interface signals The signals of the parallel interface are mapped into the address space of the Wishbone bus and can be accessed using several Wishbone transactions There are no restrictions on the function s prototype e Wishbone Single Bus Cycle Interface A Wishbone bus adapter is placed on top of the function s parallel multi cycle interface signals The signals of the parallel interface are mapped on the signals of the Wishbone bus and are accessed in one Wishbone READ WRITE cycle There are restrictions on the function s prototype The function s prototype must be return_type function __role in __role byte_select Signals are mapped as follows type_d DAT type_s SI Function parameter Wishbone slave signal return value DAT_O __role addess EL role we type_a ADR type_w WE 11 C to Hardware Compil
97. e possible x 23 A All declarations at file scope should be static where possible 24 R Identifiers shall not have both internal and external linkage X 25 R Identifiers with external linkage shall have exactly one definition 26 R Multiple declarations for objects or functions shall be compatible 107 C to Hardware Compiler User Manual x 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 gt anan nan I gt 2o naa a D D D D gt D D x x S xe Se e e iT ses a es Op Game a Yor BS BBSBISESB gt Irz nI IDI Ne Oe Wa iP Be WB we wai ew eee nan nana ana gt II DDI xe x S x e e e e S S S a S e S a S e UT D gt External objects should not be declared in more than one file The register storage class specifier should not be used The use of a tag shall agree with its declaration All automatics shall be initialized before being used This rule is checked using worst case assumptions This means that violations are reported not only for variables that are guaranteed to be uninitialized but also for variables that are uninitialized on some execution paths Braces shall be used in the initialization of arrays and structures Only the first or all enumeration constants may be initialized The right hand operand of amp amp o
98. e protocol spoken over those pins Together this forms a contract between the CHC block and its environment Hardware Assembly Language HASM is a language for describing digital electronic circuits and is the hardware equivalent of normal assembly language HASM is generated by the che compiler absolute HASM files are converted to VHDL or Verilog by the hdlhc hardware language generator In electronics a hardware description language or HDL is any language from a class of computer languages for formal description of electronic circuits It can describe the circuit s operation its design and tests to verify its operation by means of simulation A C function that is instantiated as an electronic circuit In the context of an FPGA design also called an Application Specific Processor ASP Opposite of software function The term HW SW mode is used as a synonym for ASP mode The initiation interval ii is how many clock cycles are taken before starting the next loop iteration thus an ii 2 means that a new iteration is started every second clock cycle If the whole function body is pipelined then the ii specifies the number of clock cycles between subsequent function invocations The time in clock cycles from the first input to the first output The Medium Level Intermediate Language is a language used by TASKING compilers to represent the source code in a format that is suited for code generation by the compiler back end The CHC
99. ed against the corresponding format string specification type determines how the format string is interpreted and should be printf scanf strftime or strfmon arg_string_index is a constant integral expression that specifies which argument in the declaration of the user function is the format string argument arg_check_start is a constant integral expression that specifies the first argument to check against the format string If there are no arguments to check against the format string that is diagnostics should only be performed on the format string syntax and semantics arg_check_start should have a value of 0 For st rftime style formats arg_check_start must be 0 Example int foo int i const char my_format __attribute__ format printf 2 3 The format string is the second argument of the function foo and the arguments to check start with the third argument flatten You can use __attribute__ flatten to force inlining of all function calls in a function including nested function calls Unless inlining is impossible or disabled by __ att ribute__ noinline for one of the calls the generated code for the function will not contain any function calls malloc You can use ___attribute__ malloc to improve optimization and error checking by telling the compiler that e The return value of a call to such a function points to a memory location or can be a null pointer e On return of such a call before the ret
100. ediately Latency Initiation interval Return Value Data Width void Name Data Type 0 Parameters Data Width 110 Type OUTPORT INPORTO INPORT1 Boolean Boolean Boolean 1 Output 1 Input 1 Input Import From Source File Figure 4 4 C Code Symbol configuration dialog Using the CHC Compiler The selections you make in this dialog are passed via a qualifier file to the CHC compiler In this particular case the content of file Out NB DB codesymexample_xormachine qua is xormachine OUTPORT lt __out gt xormachine lt __export __CC combinatorial gt The CHC compiler will patch these qualifiers into the source code when the source code is parsed By using this mechanism the original source code remains unmodified However in some cases it may be useful to apply the qualifiers within the source code as is demonstrated in file rgb2hsi c of the VGA video example The source of the C Code Symbol XORMACHINE is present in file xor c include lt stdi include lt stdb void xormachine bool INPORTO OUTPORT nt h gt ool h gt bool INPORT1 bool OUTPORT INPORTO INPORT1 49 C to Hardware Compiler User Manual You can specify the function return type function name and the types and names of the parameters either by editing the C source code or by editing the settings in the dialog Altium Designer imports the content of the source file
101. eee aed eee e aed e ened eaeeaeeaeeneeaeeaeeas 21 9 1 Data TyP Siiccicdaclicsiten E ised aed deo da selec in eed edd edeinda oniaed bond eweddnaeee idea diac 21 3 2 VOlAtIC iiron ini E enc AR AEE EEE EEEE EE e EEEE RE RE E TEE sia geddad EE ara ET 24 3 3 Changing Data Alignment __unaligned __packed__ and _align s sssssseseserersrsrsrrsrerrttrrererererrsrerrrrereree 24 3 4 Predefined Preprocessor MA CIOS ecceeeeeec ee eee i rni nni p iii aa eiri ipini oiai 25 3 5 Pragmas to Control the Compiler escient ao iaiia Eaa aE aO EESE EEEN a EE aa 26 3 6 Function Qualifiers and Data Type Qualifiers 2 0 0 0 cece cette triti tt eritir ttrt rrtt tnter tnt tE artn nunna nere nnnn eee 30 3 6 1 Compiling to Hardware inisa dicaecsen unscehsnaseasnnarnaraedeugiieasuadhs subs ame plenasnedibedaashaantannadhiacagnanenadtenoonensins 30 3 6 2 Inlining Functions inline NOinline 2 0 00 eee cece renee eter e eae e eee e renee tees esata ete eaeeneneeeteeeneg ed 35 3 7 Memory and Memory Type Qualifiers 2 0 2 cece eeeee cece eee e eee e nee e nents eens eee c eee ttnt ettur ese eae eseeaeeseeaeeeeeaeeeeeaes 36 Se Z ols IMUOCUCHON cs erre a a coos tests a OaS EEE O e E E ote Aes 36 3 7 2 Storage Class Specifier rtl_allOC 20 00 siimaan ainia aaa EE aia Eai 37 3 7 3 Memory Qualifier _mem0 _Mem1 5 0 eee eee cece eee cee eee ee rttr tatr eeeeeeceeaeeeeaeaeeeeeeeeeeseeeeeneeees 37 3 7 4 Placing a Data Object at an Absolu
102. efined in the C program Unlike entry points external functions and ports which are specified in the C program the interfaces to memory devices and peripheral devices are specified in the LSL file LSL is the linker script language which is also used by all TASKING embedded toolsets Memories can be internal or external Internal memories are instantiated by the CHC compiler External memories shall be instantiated by other means A memory device or memory mapped peripheral device is made available as a named memory space in the C program Declarations of data objects and pointers must be qualified with the name of the space to allocate the data object in or let the pointer point to the named memory space CHC supports multiple types of memory interfaces and peripheral interfaces Currently Wishbone single port one read write port dual port one read write port plus one read port and true dual port two read write ports interfaces are supported The CHC compiler adds the appropriate signals to the top level entity to facilitate interfacing with the specified memory devices and peripheral devices External Resources Resources are functional units such as adders or multiply add units that are used by the code generator of the CHC compiler Resources are not defined in the C source code but all resources are defined in the resource definition file with suffix prd A resource is either internal or external An internal resource is
103. ehavior is undefined Character Printed as d i int signed decimal 0 int unsigned octal x X int unsigned hexadecimal in lowercase or uppercase respectively u int unsigned decimal c int single character converted to unsigned char s char the characters from the string are printed until a NULL character is found When the given precision is met before printing will also stop f F double e E double g G double a A double n int the number of characters written so far is written into the argument This should be a pointer to an integer in default memory No value is printed p pointer No argument is converted a is printed printf conversion characters All arguments to the scanf related functions should be pointers to variables in default memory of the type which is specified in the format string The format string can contain e Blanks or tabs which are skipped Normal characters not which should be matched exactly in the input stream e Conversion specifications starting with a character Conversion specifications should be built as follows in order A meaning that no assignment is done for this field A number specifying the maximum field width e The conversion characters d i n o u and x may be preceded by h if the argument is a pointer to short rather than int or by hh if the argument is a pointer to char or by I letter ell if the argument is
104. emories after a reset Be aware that FPGA configuration and reset are not necessary at the same event and depends on the overall system design 3 7 2 Storage Class Specifier __rtl_alloc In ASP operating mode the source files are processed by the CHC compiler as well as by the embedded compiler Function qualifier ___rt1 is used to specify whether a function shall be compiled by the embedded compile to software or by the CHC compiler compile to hardware Similar the ___ rt 1_alloc qualifier specifies whether a static data object shall be allocated by the embedded or by the CHC compiler See also Section 1 4 Shared Data The CHC compiler allocates data objects in one of the block RAMs on the ASP where it can be accessed much faster than when allocated by the compiler outside the ASP ___ rt 1_alloc qualified variables can only be accessed by __ rt 1 qualified functions If you try to access an __rt1_alloc qualified variable from a non ___rt1 qualified function the compiler issues a error You can assign the storage class specifier __ rt 1_alloc to data objects with static storage ___ rt 1_alloc qualified data objects should not be larger than 32 kB while by default a total of 96 kB of ASP block RAM is available for ___ rt 1_al loc qualified data objects Example int sw_ var int __rtl_alloc hw_var The storage for sw_var is allocated by the embedded toolset the storage for hw_var is allocated by the CHC compiler Like the __ rt1 qualifie
105. emory allocation shall not be used The error indicator errno shall not be used The macro of fsetof in library lt stddef h gt shall not be used The set jmp macro and the long jmp function shall not be used The signal handling facilities of lt signal h gt shall not be used The input output library lt stdio h gt shall not be used in production code The library functions atof atoi and atol from library lt stdlib h gt shall not be used The library functions abort exit getenv and system from library lt stdlib h gt shall not be used The time handling functions of library lt t ime h gt shall not be used Run time failures x 21 1 R Minimization of run time failures shall be ensured by the use of at least one of a static analysis tools techniques b dynamic analysis tools techniques c explicit coding of checks to handle run time faults 115 C to Hardware Compiler User Manual 116 Chapter 9 CHC Report File Format The CHC report file chclog contains information about the hardware circuit that is created by the CHC compiler For each function the following information is available The CHC compiler command line invocation string e The interface to the external environment A description of the structure of the generated hardware circuit The schedule of i e timing information about the generated hardware e An indication of the FPGA resource e Characteristics of the memories and
106. en into the argument No scanning is done p pointer hexadecimal value which must be entered without 0x prefix Matches a string of input characters from the set between the brackets A NULL character is added to terminate the string Specifying includes the character in the set of scanning characters Ass Matches a string of input characters not in the set between the brackets A NULL character is added to terminate the string Specifying includes the character in the set Literal no assignment is done scanf conversion characters stdio h wchar h Description fscanf stream format fwscanf stream format Performs a formatted read from the given stream Returns A the number of items converted successfully scanf format wscanf format Performs a formatted read from stdin Returns the number sscanf s of items converted successfully format swscanf s format Performs a formatted read from the string s Returns the number of items converted successfully vfscanf stream format vfwscanf stream format Same as fscanf fwscanf but extra arguments are given arg arg as variable argument list arg See Section 7 2 17 sidarg h vscanf format arg vwscanf format arg Same as sscanf swscanf but extra arguments are given as variable argument list arg See Section 7 2 17 sidarg h vsscanf s format arg vswscanf s format arg Same as scanf wsca
107. enable a system to be modeled in both the functional and structural domain The functional domain deals with basic operations such as arithmetic logical and data move operations The structural domain deals with how the system is composed of interconnected subsystems Traditional assembly languages model a system in the functional domain only In HASM the structural concepts are taken from VHDL As a result the translation of HASM to VHDL or Verilog is a straightforward process The mechanisms used to create initialize and locate data sections are identical to the mechanisms used in traditional embedded assembly languages The central structural concepts in HASM are functions and components which correspond with VHDL entities architectures and components The hardware assembler ashe converts the HASM language into object files ELF format These object files are converted to VHDL and or Verilog by the HDL generator hdlhc 1 3 3 Linking and Locating In a traditional software build flow the linker concatenates text data and BSS sections and the locator places the sections at absolute addresses When C is translated to hardware the assemble link and locate processes are in essence identical to assembling linking and locating a traditional embedded project The CHC compiler requires all modules to be compiled simultaneously The compiler creates links and locates data sections in the same way a traditional embedded toolset does See al
108. ent statements Now the compiler can remove the control dependency from s2 and schedule the multiply before or simultaneous with the compare This optimization is known as predicated operation promotion The predicate on s3 cannot be removed As the examples above show the CHC compiler is able to translate control flow constructions quite well into efficient hardware 5 1 2 Data Dependencies A data dependency is a constraint that arises from the flow of data between statements operations There are three varieties of data dependencies e flow also called read after write raw dependency e anti also called write after read war dependency output also called write after write waw dependency The key problem with each of these dependencies is that the second statement cannot execute until the first has completed Flow or Read After Write dependency Read after write dependency occurs when an operation references or reads a value assigned or written by a preceding operation sl a b c s2 d a 1 58 Parallelism Anti or Write After Read dependency Write after read dependency occurs when an operation assigns or writes a value that is used or read by a preceding operation sl a b c s2 b e f Output or Write After Write dependency Write after write dependency occurs when an operation assigns or writes a value that is also assigned by a preceding operation sl az bt qoc s2 az date In so
109. ep START DONE RETVAL called func par cf called func_START called_func_DONE called func RETVAL p_in p_out par_out RESET DONE is only applicable if memory is initialized LOT START may occur immediately after RESET DONE or RESET WO AEE a OOS DONE is low after reset Function entry point returns OOOO ROOM ONO CUOMUROOUMOUMIURRNGMCOMOURRMCUOMOOM QunDUTMDIOU MODE UDI ONOOBUUUIUCMNG OMNI Return value valid TINO RUMI MINIMUM MGM OU ENE MOM U RN MORMON ODUM MMU MMM ONO M IMUM NOUMNUMnMnnOMnonn input parameter sampled on function start Low after RESET Function called func started TODO UNO UUOUNUOUU UMMM BUOMM UMM UUM Ou cnn LE EE TE Function called func returns Le MOOR MOM LU MMM ODR ODMR RD NODROORNMEN DDN MMNNNOM NOMENON OOM UMNO MNO M IM MIMI O OM OM anunomonen Return value valid SO IT p in can be sampled any time during execution of entry point LOTT p out remains driven LOMO OUMUO MONG ROO DM OR RNCOR DOME OMMOOOan NOQUMMMMNINU DROUIN UM MONNOUMOURNUnOOND par_out valid Timing diagram of ack qualified functions If a function is ack qualified the input parameters shall be asserted until the DONE signal is received Now function called_func does not have to be idle when called Timing of DONE depends on internal state of function called_func when START is asserted CLOCK called func par cf called_func_START called_func_DONE called func RETVAL
110. er ignores the debug statements implemented via intrinsic functions in the source code The debug logic is compiled into the code symbol so a rebuild is necessary to enable debug C Code Symbol Properties Entry Point External Functions Ports Memories Options Files Parameters Printf Style debuggin Use Lossless Communication Buffer Depth 32 Buffer Width 40 Compiler Options C 16 bit Integers Miscellaneous Options HDL Generation Options Miscellaneous Options Each C code symbol is associated with a separate debug console Interpretation of the printf style format string takes place at the host system This approach minimizes the amount of FPGA logic required for debug You can enable or disable debugging per C code symbol The designator of the C code symbol is shown as a label in the debug console to show the relation between C code symbol and debug console The debug console is created automatically from the C code symbol No modifications to the schematic sheet are required to enable or disable the debug console Printf style debug is supported in the C source through an intrinsic function void __debug_printf const char restrict format Print the arguments in the specified format on the debug console A subset of ISO C printf format specifiers are supported All specifiers that require dereferencing a pointer are not supported Supported features f
111. er User Manual Function parameter Wishbone slave signal DAT DAT_I ADR ADR_I SEL SEL_If WE WE e NIOS_Cl NIOS2 Custo The raw signals are ma m Instruction Bus Interface pped onto the NIOS2 Custom Instructions bus 2 3 1 Timing Diagrams of the Parallel Bus Interface Below are the timing diagrams of the parallel calling convention The parallel calling convention can be modified using modifiers ack nowait register_outputs and start_on_edge See Section 3 6 Function Qualifiers and Data Type Qualifiers for an explanation of the given modifiers Runtime Semantics Consider the code fragment below After compilation the given top level entity is created You should be able to understand the relation between the C code and the ports created When the START signal is parameter s par_ep are asserted the function starts executing on the rising edge of a CLOCK During this clock cycle its input assumed to be valid When the function finishes the DONE signal will be set during one clock cycle During this clock cycle the optional return value RETVAL is valid include lt stdint h gt uint3_t coef 0xF __input uint3_t p __ output uint3_t p_ import uint3_tc _ export uint4_t e This is an e par_out coe return p_in entity c_root is port CLOCK in std_ DONE out std_ RESE in std R a R ESET_DONE ou ETVAL out st START in std_ called
112. es at least 4 ALU i 17 Among other things the number of clock cycles it takes to execute the hardware function is shown The term at least specifies that the exact number of cycles it takes to execute the function is unknown This is typically caused by asynchronous bus transfers where the responding device indicates the completion of this transfer by activating an acknowledge signal Wishbone bus transfers and calls to an external function are examples of asynchronous transfers Navigate to the Schedule to obtain detailed information about the state machine that controls the execution of the code symbol State transitions that may take longer than one clock cycle are marked as wait state State w4 is a wait state and is caused by a call to external function NEXT The wait state takes at least one clock cycle 1 Notice that the memories accessed by this code symbol are synchronous memories which do not cause wait states Heat at a aE Ht aE HE a EE HE aE aE EE HE aE HE EEE HE a aE aE EE HEE EE HE aE aE EE HEE EE HE aE EEE HE EEE HE EE HE aE EEE HE EE EE Schedule Heat at a aE HE aE HE a HE aE HE aE aE EE EE HEE EE HE aE aE EE aE HE EEE HE aE aE EE HE EEE HEE aE EE HE EEE HEE aE EE aE EEE HE EE EE contrast_filter State machine Wait States W4 NEXT 1 Memory States SO _ HITS S1 __HIS __CONV See example chc_vga_video Pr4Fpg schematic sheet filter SchDoc The components
113. esult of scheduling v state transition backward as result of a C control flow statement jaan state transition forward as result of a C control flow statement v state transition to initial state SO Wait State syntax elements Wn operation N nowait where Wn wait state separator operation operation that causes the wait state N number of clock cycles consumed by wait state N minimum number of clock cycles consumed by wait state conditional wait state Such a state either consumes one cycle or N clock cycles if the conditional operation is executed nowait for call to functions with the nowait modifier set The number of clock cycles to issue the call may vary depending on the state of the callee when the call is issued Example W8 rgb2hsi_stage_2 11 nowait means that due to the nowait the number of cycles may range from 1 11 Memory States syntax elements SWn N x msp SWn state or wait state if the memory access or other operations are asynchronous then the state is a wait state separator a literal N x is optional and specifies the number of simultaneous accesses for multi ported memories msp memory space or port that is accessed Example Hat at a a at aE HE aH HE aE HE aE aE EE oe aE REPER HE aE aE EE EE HE EEE HE aE a aE EE HEE EE HE aE aE EE EE EE HE EE HEE EE EE HE EE Schedule Heat at a aE He aE HE a HE aE HE aE aE a aE oe aE HE EE aE HE aE aE aE EE HE EEE HE a aE EE
114. etection of an invalid function message SIGFPE 3 An erroneous arithmetic operation for example zero divide overflow SIGSEGV 4 An invalid access to storage SIGTERM 5 A termination request sent to the program SIGABRT 6 Abnormal termination such as is initiated by the abort function The next function sends the signal sig to the program int raise int sig The next function determines how subsequent signals will be handled signalfunction signal int signalfunction The first argument specifies the signal the second argument points to the signal handler function or has one of the following values SIG_DFL Default behavior is used SIG_IGN The signal is ignored The function returns the previous value of signalfunction for the specific signal or SIG_ERR if an error occurs 7 2 17 stdarg h The facilities in this header file gives you a portable way to access variable arguments lists such as needed for as fprintf and vfprintf va_copy is new in ISO C99 This header file contains the following macros va_arg va_list ap type Returns the value of the next argument in the variable argument list Its return type has the type of the given argument type A next call to this macro will return the value of the next argument va_copy va_list dest va_list This macro duplicates the current state of src in dest creating a second pointer into src the argument list After this call va_arg may be used on src and dest independently
115. expression elimination predicate d D Predicate optimizations expression e E Expression simplification flow f F Control flow simplification glo g G Generic assembly code optimizations inline i l Automatic function inlining schedule k K Instruction scheduler loop VL Loop transformations simd m M Perform simd optimization forward 0 0 Forward store propagate p P Constant propagation speculate q Q Speculate subscript s S Subscript strength reduction tree tT Expression tree reordering unroll u U Unroll small loops ifconvert v V Convert IF statements using predicates pipeline w W Software pipelining peephole y Y Peephole optimizations Use the following options for predefined sets of flags 0 No optimization Alias for ABCDEFGIKLMOPQSTUVWY No optimizations are performed The compiler tries to achieve an optimal resemblance between source code and produced code Expressions are evaluated in the same order as written in the source code associative and commutative properties are not used 1 Few optimiziations Alias for aBcDefgIKLMOPqSTUVWY The generated circuit is still comprehensible and could be manually debugged 2 Release purpose optimizations Alias for abcdefglkimopqstUvwy Enables more optimizations to reduce area and or execution time The relation between source code and generated circuit may be hard to understand This is the default optimization level 3 Aggressive all
116. fer cnt Writes a sequence of characters to a file 7 2 10 iso646 h The header file iso646 h adds tokens that can be used instead of regular operator tokens define and amp amp define and_eq amp define bitand amp define bitor 81 C to Hardware Compiler User Manual define compl define not define not_eq define or I define or_eq define xor define xor_eq 7 2 11 limits h Contains the sizes of integral types defined as macros 7 2 12 locale h To keep C code reasonable portable across different languages and cultures a number of facilities are provided in the header file locale h char setlocale int category const char locale The function above changes locale specific features of the run time library as specified by the category to change and the name of the locale The following categories are defined and can be used as input for this function iC_ALL 0 iC_NUMERIC 3 iC_COLLATE 1 iC_TIME 4 iC_CTYPE 2 iC_MONETARY 5 struct lconv localeconv void Returns a pointer to type struct 1conv with values appropriate for the formatting of numeric quantities according to the rules of the current locale The struct 1conv in this header file is conforming the ISO standard 7 2 13 malloc h The header file malloc h contains prototypes for memory allocation functions This include file is not defined in ISO C99 it is included for ba
117. ferred from the compiler generated RTL by these synthesizers Unless syntax requirements of the synthesizers conflict with the IEEE P1076 6 Standard For VHDL Register Transfer Level 51 C to Hardware Compiler User Manual Synthesis or the 1364 1 IEEE Standard for Verilog Register Transfer Level Synthesis the generated RTL complies with the IEEE standards Extern resources i e resources defined in the resource definition file with attribute extern 1 are not instantiated by the compiler and should be passed to the synthesis tool 4 6 How the Compiler Searches Include Files When you use include files with the include statement you can specify their location in several ways The compiler searches the specified locations in the following order 1 If the include statement contains an absolute path name the compiler looks for the specified file in the specified directory If no path is specified or a relative path is specified the compiler looks in the same directory as the location of the source file This is only possible for include files that are enclosed in This first step is not done for include files enclosed in lt gt 2 When the compiler did not find the include file it looks in the directories that are specified with the option Include files path While in your C source file from the Project menu select Project options and go to the Build Options You can set this option for the embedded project
118. find the source code in file cstart c in the directory System Tasking chc lib src under the product installation directory Function START calls _ putchar main and__builtin_exit 50 Using the CHC Compiler Typically you implement a main function if you intend to simulate the VHDL or Verilog code that is generated by the CHC compiler see Section 4 4 Simulating the Compiler Output e Function main is not defined In this case the startup code is not linked in C Code Symbols do not require startup code therefore the entry point of a C Code Symbol may not be called main Initialized and uninitialized static data can optionally be initialized or cleared on RESET 1 Double click on the C Code Symbol The C Code Symbol configuration dialog appears 2 On the Memories tab enable Init On Reset 4 4 Simulating the Compiler Output This section is only relevant if you are familiar with VHDL simulation tools and are interested in how the circuits that are generated by the che compiler behave Please have a look at the file System Tasking chc etc pcls_driver vhdl This file is a test bench driver for compiler generated hardware circuits The top level entity in file pcls_driver vhdl is test_bench it instantiates three components pcls_driver c_root and putchar Component c_root is the top level component created by the CHC compiler and contains the logic described in your C source files Component pcls_driver ac
119. formance bottleneck To solve this problem the compiler creates a memory system that supports concurrent memory accesses For this purpose the CHC compiler supports up to 15 different memory spaces The physical memory required to implement the memory system is taken form the block RAM and distributed RAM resources that are available on FPGA devices The ISO C language abstracts a processor core s memory system as one large array of memory so language extensions had to be introduced to provide better programming support for multiple memory spaces So called memory type qualifiers allow you to explicitly declare the memory space in which a data object is allocated If a pointer is dereferenced the offset and the memory space the pointer points to must be known Therefore the memory space to which the pointer points is also part of the pointer s type specifier as well as the memory space where the pointer is stored Language extension for memory space qualifiers have been standardized see e DSP C an Extension to ISO IEC 9899 1999 E PROGRAMMING LANGUAGES C ISO TR18037 Technical Report on Extensions for the Programming Language C to support embedded processors The TASKING compilers comply to the DSP C specification which is a predecessor of the ISO technical report Resource File and LSL file A hardware compiler creates an electronic circuit in contrast to an embedded compiler which generates an instruction sequence that is executed by a pr
120. h h are implemented as the double type variant which nearly always meets the requirement in embedded applications 82 Libraries The header file tgmath h contains parallel type generic math macros whose expansion depends on the used type tgmath h includes math h and the effect of expansion is that the correct math h functions are called The type generic macro if available is listed in the second column of the tables below Trigonometric and hyperbolic functions math h tgmath h Description sin sinf sinl sin Returns the sine of x cos cosf cosl cos Returns the cosine of x tan tanf tanl tan Returns the tangent of x asin asinf asinl asin Returns the arc sine sin x of x acos acosf acosl acos Returns the arc cosine cos x of x atan atanf atanl atan Returns the arc tangent tan x of x atan2 atan2f atan21 atan2 Returns the result of tan y x sinh sinhf sinhl sinh Returns the hyperbolic sine of x cosh coshf coshl cosh Returns the hyperbolic cosine of x tanh tanhf tanhl tanh Returns the hyperbolic tangent of x asinh asinhf asinhl asinh Returns the arc hyperbolic sine of x acosh acoshf acoshl acosh Returns the non negative arc hyperbolic cosine of x atanh atanhf atanhl atanh Returns the arc hyperbolic tangent of x Exponential and logarithmic functions All of these functions are new in ISO C99 except for exp log and 1og10 math h tgmath h Description exp expf expl exp Returns the result of
121. har or unsigned short the result shall be immediately cast to the underlying type of the operand A U suffix shall be applied to all constants of unsigned type Pointer type conversions 11 1 11 2 11 3 11 4 11 5 R R ZBEs Conversions shall not be performed between a pointer to a function and any type other than an integral type Conversions shall not be performed between a pointer to object and any type other than an integral type another pointer to object type or a pointer to void A cast should not be performed between a pointer type and an integral type A cast should not be performed between a pointer to object type and a different pointer to object type A cast shall not be performed that removes any const or volatile qualification from the type addressed by a pointer 112 MISRA C Rules Expressions 12 1 12 2 12 3 12 4 12 5 12 6 12 7 12 8 12 9 12 10 12 11 12 12 12 13 A R D aoaaa D gt Limited dependence should be placed on C s operator precedence rules in expressions The value of an expression shall be the same under any order of evaluation that the standard permits This rule is checked using worst case assumptions This means that a violation will be reported when a possible alias may cause the result of an expression to be evaluation order dependent The sizeof operator shall not be used on expressions that contain side effects The right hand operand of a l
122. hbone Interconnect configuration dialog 67 C to Hardware Compiler User Manual Example Component WB_SINGLE is a C Code Symbol with a Wishbone Single Bus Cycle interface This component is accessed by the core via pointer dereferences see file controller_main c define BITCOUNT uint32_t volatile Base_wb_single BITCOUNT i sum BITCOUNT A pointer dereference initiates a read or write cycle on the Wishbone bus The Wishbone Interconnect component decodes the address and if the appropriate address is used propagates the Wishbone bus cycle to the WB_SINGLE component At the start of the Wishbone bus cycle the entry point of the C Code Symbol i e function countbits is invoked Once the function returns the Wishbone bus cycle is ended 6 3 2 2 Accessing a C Code Symbol via a Function Call Design pattern 1 Qualify the entry point with export __CC wishbone 0 2 Select device type ASP inthe Wishbone Interconnect configuration dialog Example Component WB_MULTI is a C Code Symbol with a Wishbone Multi Cycle interface This component is accessed via a function call executed by the processing core temp swap i It is necessary to specify the calling convention of the C Code Symbol in the source code of the embedded project that executes on the core rtl _ export __CC wishbone 0 uint32_t swap uint32_t DAT_IN Empty function definition required Notice that the C fi
123. he Options for Embedded Project PrjEmb appears 2 Onthe Compiler Options tab in the left pane expand the C Compiler entry and select Miscellaneous 3 Inthe Additional CHC compiler options field you can enter additional options for the CHC compiler 4 Click OK to confirm the new settings and to close the dialog Setting options when creating a C Code Symbol 1 Double click on the C Code Symbol The C Code Symbol configuration dialog appears 2 On the Options tab enter the options in either the Compiler Options field or the HDL Generation Options field 3 Click OK to confirm the new settings and to close the dialog 4 2 CHC Compiler Operating Modes The CHC compiler can be used in two operating modes default mode and ASP mode In default mode the CHC compiler translates functions and data objects defined in a set of source files into an electronic circuit The resulting circuit can be seen as a stand alone hardware component In ASP mode the CHC compiler works together with an embedded compiler and translates only the __ rt 1 qualified functions and the __rt1_alloc qualified data objects into an electronic circuit The remaining functions and data objects are translated by the embedded compiler The output of the CHC compiler is a hardware component that must be attached to a processor core The purpose of this operating mode is to accelerate a program by off loading time consuming functions from the core to a dedicated electronic c
124. he generated state machine 27 C to Hardware Compiler User Manual normal The compiler conservatively does if conversion for single entry single exit control flow regions pragma ii range default restore Specify the allowed initiation interval range for a pipelined loop body The initiation interval ii is the number of cycles between the start of one iteration and the next The specified range is an expression for unbound an exact value 3 or 3 3 a minimum 3 a maximum 3 orarange 3 5 The default value is 1 If the pipeline scheduler cannot achieve the specified latency an error is issued pragma inline pragma noinline pragma smartinline Instead of the qualifier inline you can also use pragma inline and pragma noinline to inline a function body int w X VY Z pragma inline int add int a int b int i 4 return a b pragma noinline void main void add 1 2 z add x y If a function has an inline or___noinline function qualifier then this qualifier will overrule the current pragma setting By default small functions which are not called from many different locations are inlined This reduces execution speed at the cost of area With the pragma noinline pragma smart inline you can temporarily disable this optimization pragma latency range default restore Specify the allowed latency range for a pipelined loop body Latency is the number of stages in
125. he wchar_t type as argument ctype h wctype h Description isalnum iswalnum Returns a non zero value when c is an alphabetic character or a number A Z a z 0 9 isalpha iswalpha Returns a non zero value when c is an alphabetic character A Z a z isblank iswblank Returns a non zero value when c is a blank character tab space iscntrl iswentrl Returns a non zero value when c is a control character isdigit iswditit Returns a non zero value when c is a numeric character 0 9 isgraph iswgraph Returns a non zero value when c is printable but not a space islower iswlower Returns a non zero value when c is a lowercase character a z isprint iswprint Returns a non zero value when c is printable including spaces ispunct iswpunct Returns a non zero value when c is a punctuation character such as isspace iswspace Returns a non zero value when c is a space type character space tab vertical tab formfeed linefeed carriage return 78 Libraries ctype h wctype h Description isupper iswupper Returns a non zero value when c is an uppercase character A Z isxdigit iswxdigit Returns a non zero value when c is a hexadecimal digit 0 9 A F a f tolower towlower Returns c converted to a lowercase character if it is an uppercase character otherwise c is returned toupper towupper Returns c converted to an uppercase character if it is a lowercase character otherwise c is returned _tolower
126. hedule This part shows how the hardware function is scheduled The schedule is represented as a Finite State Machine A state Sn is executed in one clock cycle A state that is not guaranteed to be executed in one clock cycle is called a wait state Wn A sequential sequence of state transitions i e state transition that result from scheduling not from flow control constructs are abbreviated as Sn Sn x For each wait state the operation that causes the wait state to happen is shown and also the number of clock cycles consumed by the wait state If the number of clock cycles is not a fixed value then the minimum number of clock cycles is shown followed by a plus sign Such wait states are typically caused by asynchronous bus transfers where the responding device indicates the completion of the transfer by activating an acknowledge signal To facilitate analysis of bus loads all memory accesses are shown Each state where a memory access occurs is listed followed by the memory space s that are accessed in this state If the same memory space is accessed during subsequent states then this particular memory space may be a performance bottleneck Reallocation of variables in different memory spaces may speedup your design State machine syntax elements Sn state so initial reset state 118 CHC Report File Format Wn wait state states that are sequentially executed at a rate of one state per clock cycle gt state transition as r
127. his role is assigned to a parameter then the function s return type must be void The width of the return value or __ out parameter must be in the range of 1 32 bits ro You can use the attribute __ro only in combination with the ___ port and__import or_ export qualifiers This attribute specifies that the port s interface signal is an input pin As a consequence __ ro qualified data objects can only be used as an rvalue wo You can use the attribute __wo only in combination with the __ port and__ import or__export qualifiers This attribute specifies that the port s interface signal is an output pin As a consequence ___ wo qualified data objects can only be used as an Ivalue hw_or_sw Applicable to ASP mode only You can apply ___ att ribute__ hw_or_sw on code and data objects of all types It is mainly used to qualify functions in the C library These functions will be instantiated in hardware when called from a hardware function otherwise no code is generated If a__ hw_or_sw__ qualified static data object is referenced from a hardware function then the data object will be instantiated in hardware As a consequence the embedded compiler may allocate the same object so multiple instances of the same data object can exist For example errno is typically instantiated by both the CHC compiler and the embedded compiler alias symbofl You can use ___attribute__ alias symbol to specify that the declaration appear
128. ialized but also for variables that are uninitialized on some execution paths Braces shall be used to indicate and match the structure in the non zero initialization of arrays and structures In an enumerator list the construct shall not be used to explicitly initialize members other than the first unless all items are explicitly initialized Arithmetic type conversions 10 1 10 2 10 3 10 4 10 5 10 6 R The value of an expression of integer type shall not be implicitly converted to a different underlying type if a it is not a conversion to a wider integer type of the same signedness or b the expression is complex or c the expression is not constant and is a function argument or d the expression is not constant and is a return expression The value of an expression of floating type shall not be implicitly converted to a different type if a it is not a conversion to a wider floating type or b the expression is complex or c the expression is a function argument or d the expression is a return expression The value of a complex expression of integer type may only be cast to a type of the same signedness that is no wider than the underlying type of the expression The value of a complex expression of floating type may only be cast to a type that is no wider than the underlying type of the expression If the bitwise operators and lt lt are applied to an operand of underlying type unsigned c
129. ibute can be applied to function parameters only and must be used in conjunction with the __cc qualifier where ___CC wishbone single nowait specifies the Wishbone single bus cycle bus interface See also Section 2 3 3 Wishbone Single Cycle Bus Adapter The following roles are defined Role Description __role byte_select A parameter with this role is mapped on the Wishbone SEL_I wires The width of the parameter must be 2 4 or 8 bits This role is optional if no parameter is associated with this role then no SEL_I wires are used __role address A parameter with this role is mapped on the Wishbone ADR_ wires The width of the parameter must be in the range of 1 32 bits __role we A parameter with this role is mapped on the Wishbone WE_ wire The width of the parameter must be 1 bit __role in A parameter with this role is mapped on the Wishbone DAT_I wires The width of the parameter must be in the range of 1 64 bits The ___ role in attribute is implicit for parameters that do not have a___role attribute and that are used in__CC wishbone single nowait qualified functions ___role out A parameter with this role is mapped on the Wishbone DAT_O wires The width of the parameter must be in the range of 1 64 bits The __ role out attribute is implicit for the return value and __ out qualified parameters used in __CC wishbone single nowait qualified functions If t
130. ide or at the right when the flag was specified with spaces Padding to numeric fields will be done with zeros when the flag 0 is also specified only when padding left Instead of a numeric value also may be specified the value is then taken from the next argument which is assumed to be of type int A period This separates the minimum field width from the precision A number specifying the maximum length of a string to be printed Or the number of digits printed after the decimal point only for floating point conversions Or the minimum number of digits to be printed for an integer conversion Instead of a numeric value also may be specified the value is then taken from the next argument which is assumed to be of type int A length modifier h hh I Il L j z or t h indicates that the argument is to be treated as a short or unsigned short hh indicates that the argument is to be treated as a char or unsigned char l should be used if the argument is a Long 88 Libraries integer ll fora long long L indicates that the argumentis along double j indicates a pointer to intmax_t or uintmax_t z indicates a pointer to size_t and t indicates a pointer to ptrdiff_t Flags length specifier period precision and length modifier are optional the conversion character is not The conversion character must be one of the following if a character following is not in the list the b
131. ifiers and data type qualifiers that specify whether and how C source is compiled to hardware Altium Designer automatically assigns the proper qualifiers however you can also manually add these qualifiers in your C source The following qualifiers are supported _ ril With the __rt1 function qualifier you tell the compiler to compile this function to hardware By default all functions are implicitly qualified with __ rt 1 unless you specify command line option only rtl qualified An _ rt1 qualified function can be called by other __rt1 qualified functions but cannot be called by non__rt 1 qualified functions To make an __rt1 qualified function callable by anon ___rt1 qualified function you must also use the function qualifier __ export __ export An __export qualified function is callable from the external environment The __export qualifier must be used in combination with the _ rt1 and __cc qualifiers The __export qualifier causes the function s interface signals to be included in the top level entity definition of the generated VHDL or Verilog code You can use ____ export also as a data type qualifier on variables of scalar type in combination with __ port and _ wo to indicate that the variable must appear as an output port on the C Code Symbol The __ export qualifier implies the attribute __export_ See also data type qualifiers __input and__ output __ import An __import qualified function is a function defined in a differen
132. iler is allowed to instantiate You can bypass the automated memory partitioning process and use memory type qualifiers to explicitly assign variables to a specific block memory This is particularly useful when hardware functions share memory with other components in a system such as for example a display controller or software executed by a processing core With compiler option no partition you can turn off automatic memory partitioning 2 4 2 Memory Interface and Arbiters In the linker script file you can specify the scope of a memory The following scopes exist e internal Internal memory is instantiated by the CHC compiler By default internal memory is not visible at the external interface Internal memory can be used by all hardware functions of a C program e internal ___export qualified The internal memory is instantiated by the CHC compiler The internal memory is also visible at the external interface The internal memory can be used by all hardware functions of a C program and by external hardware components external External memory is visible at the external interface the memory is instantiated by the user The CHC compiler adds the appropriate signals to the external interface In VHDL parlance the memory interface signals are listed in the port definition of the top level entity You must connect these signals to an appropriate memory device Arbiters If external memory is accessed by multiple components then an arbi
133. imum Size Of Internal Memory C Init On Reset Clear Uninitialized Data Address Wi Data Width BusMode Interface 16 Word Addre Single Port The Memory and Memory Mapped Peripheral Bus contains entry HIS and the interface to this memory space is set to Single Port This entry creates a named memory space that can be used in the C source code Note since the Allocate From field is left empty no data objects are allocated in this memory space unless the data object is__at qualified If you want to enable the compiler to automatically allocate unqualified data objects in this space enter an integer value e g 0 in this field 4 Hold down the Ctrl key and double click on the C Code Symbol to open the associated C source file HIS uint1l0_t histogram HIS_X_RES at 0 NEXT ADDR_I RGB_O_I RGB_1_I Y histogram H HIS_DELTA_X gt gt HIS_FRACT_BITS histogram H gt gt HIS_FRACT_BITS As you can see on the schematic sheet an interface to a single ported memory is created 6 6 Connecting a C Code Symbol to a Device without Standardized Bus Design pattern e Qualify variables with input or___output use __ wait to specify delays 70 Design Patterns Example Location Examples Soft Designs C to Hardware CodeSymbols Explained This feature is demonstrated in example CodeSymbolExample PrjFpg 1 Open schematic sheet CodeSymExample SchDoc O
134. interaction takes place The set of interface signals is referred to as the external interface In Altium Designer these interfaces are automatically created and maintained when you create or edit an ASP or C Code Symbol Nevertheless you need to understand the semantics of the signals and their timing requirements if you build complex designs Basically the external interface can be subdivided into the following interface elements e Entry points e External functions e Ports e Memories and memory mapped peripherals e External resources See also Section 3 6 Function Qualifiers and Data Type Qualifiers for information how to specify these interface elements via C language extensions Entry Points An entry point is a function defined in the C program and is qualified with __ export Entry points can be called from the external environment Entry points can be accessed via several interfaces or calling conventions in C parlance You can specify the calling convention with the __ cc function qualifier Multiple calling conventions can be present in one CHC program The CHC compiler adds the appropriate signals to the top level entity to facilitate interfacing with __ export qualified functions See Section 2 3 Function Call Interface External Functions External functions are functions that you can call from the C program but are not defined in the C program To make an external function available in the C program you must
135. ion to any function independent of the number of parameters the types of the parameters and return value and the complexity of the function This calling convention is used when the CHC compiler operates in ASP mode command line option only rtl qualified to create an ASP This calling convention can also be used in default operating mode to create a C Code Symbol that can be called from a processing core You can access C Code Symbols with this interface type in the C source via a function call A Wishbone single bus cycle interface is used for communication with the external environment The function parameters and the return value as well as the START and DONE signals are passed via the Wishbone bus One Wishbone bus cycle which can last multiple clock cycles is used to pass the parameters to the hardware function to execute the hardware function and to pass the return value back to the caller The parameters of a wishbone single qualified function must be qualified with the __ role attribute to specify the mapping of the parameters onto the given Wishbone signals See ___ role in Section 3 8 Attributes It is mandatory that all non optional roles are assigned once to a parameter No additional i e non __role qualified parameters may occur in the function prototype The parameters are passed via the Wishbone signals DAT_1 ADR_I SEL_I and WE_I The function return value is passed via Wishbone signal DAT_O The contr
136. ions for performing input and output A number of functions also have a parallel wide character function or macro defined in wchar h The header file wchar h also includes stdio h In the C language many I O facilities are based on the concept of streams The stdio h header file defines the data type FILE which holds the information about a stream A FILE object is created with the function fopen The pointer to this object is used as an argument in many of the in this header file The FILE object can contain the following information e the current position within the stream pointers to any associated buffers e indications of for read write errors end of file indication The header file also defines type fpos_t aS anunsigned long Macros stdio h NULL FOPEN_MAX FILENAME MAX _IOFBF _IOLBF IONBF tmpnam P_MAX EK_END L T SEEK_CUR S S EEK_SET tderr tdin tdout u u n Description Expands to 0 zero Size of the buffer used by the setbuf setvbuf function 512 End of file indicator Expands to 1 End of file indicator Expands to UINT_MAX defined in limits h NOTE WEOF need not to be a negative number as long as its value does not correspond to a member of the wide character set Defined in wchar h Number of files that can be opened simultaneously 10 Maximum length of a filename 100 Expand to an integer expression suitable for u
137. ircuit The ASP operating mode is selected via command line option only rtl qualified 45 C to Hardware Compiler User Manual The CHC compiler is fully integrated in Altium Designer In Altium Designer the default operating mode is used when you implement a C Code Symbol The ASP operating mode is used when you implement an ASP A key difference between a C Code Symbol and an ASP is that a C Code Symbol is associated with one or multiple C source files whereas the ASP is associated with a processing core and an Embedded Project We explain the use of the CHC and embedded compiler tools with help of two Altium Designer examples The ASP operating mode is demonstrated with the Edge Detection example The default operating mode is demonstrated with the CodeSymExample example 4 2 1 ASP Operating Mode Start Altium Designer open the Edge_Detection Pr4Fpg project in directory Examples Soft Designs C to Hardware Edge Detection and build the example The rest of this section briefly describes how this project is compiled For more detailed info examine the makefiles in directories Embedded EmbOut ChcOutputs This directory contains the files used by the CHC toolset Embedded EmbOut This directory contains the files used by the embedded compiler On the OpenBUS document an ASP is connected to the TSK3000 core This core is associated with embedded project Edge_Detection PrjFpg
138. ken by the interface elements For example for a function usually START DONE RESET and CLOCK control pins are needed besides the user specified pins For ports no control pins are added For Wishbone interfaces all pins are control pins Pin names Pin names start with the name of its interface element followed by an underscore followed by its own name for a user specified pin with a name or its role for other cases For wishbone pins a _l or _O suffix is added to specify an input or an output pin respectively If only one pin is required to implement the interface the suffixes are omitted Pin names must be unique the name must not be a reserved word in the target HDL language and the name must conform to the target HDL language identifier specification CHC guarantees this it adds suffixes to names if duplicates exist or if the name is areserved word in either VHDL or Verilog Illegal constructions in VHDL Verilog like leading or double underscores are removed Roles The term role defines the semantics of a pin The following pin roles are used by the call interface and the external function interface The Mode defines whether the signal is an input 1 or output O An allowed bus size of 0 means the pin is optional Role Mode Bus size Instances Description CLOCK l 1 Oor1 Clock signal RESET l 1 Oor1 Reset signal If this signal is active for at least one full cycle of the clock signal CLOCK all interna
139. l registers will be reset If memory initialization is enabled reset may take up several clock cycles C to Hardware Compiler User Manual Role Mode Bus size Instances Description RESET_DONE O 1 Oor1 Signals that all memories are initialized START 1 Oori Start a function Several qualifiers determine the timing characteristics of this signal DONE O Oori Acknowledges the successful call of a function Without the register_outputs modifier the DONE signals is raised for one clock cycle This is when the function state machine returns from the busy state to the idle state at that moment the return values also become valid When the register_outputs calling convention modifier is set the DONE signal is high when the function is idle and low when the function is busy The DONE signal is lowered when the function state machine goes from the idle state to the busy state and is raised when the function returns from the busy to the idle state If the nowait calling convention modifier is set the DONE signal is raised when the function state machine goes from the idle state to the busy state Note that a function can only be called when it is in the idle state that is one clock cycle after the DONE signal is raised RETVAL IN 1 64 1 64 Oor1 gt 0 Data identifies the return value of a function Data identifies a function input parameter O
140. lag characters modifiers h 1 Il hh j z L conversion specifiers d i 0 u x X c f F e E g G a A An example __debug_printf a c 1234 hd b c a 1234 b Performance The communication link over which the debug information is passed from the target to the host system can operate in lossy or lossless mode To mitigate the effects of the relatively slow JTAG communication link over which the debug information is passed from the target to the host system an I O buffer of a configurable size is created on the target In lossless mode the C Code Symbol stalls once the I O buffer is full If lossy communication is selected the C Code Symbol does not stall In this case you are still informed about the exact locations where data is lost The places where overflow occurred are marked in the debug console 4 10 C Code Checking MISRA C The C programming language is a standard for high level language programming in embedded systems yet it is considered somewhat unsuitable for programming safety related applications Through enhanced code checking and strict enforcement of best practice programming rules TASKING MISRA C code checking helps you to produce more robust code 54 Using the CHC Compiler MISRA C specifies a subset of the C programming language which is intended to be suitable for embedded automotive systems It consists of a set of rules defined in MISRA C 2004 Guidelines for the Use of the C Language in
141. le associated with the C Code Symbol swap c is not part of the embedded project Controller Pr4jEmb This is a major difference from an ASP where the hardware functions are always part of the embedded project Double click on the WB_MULTI component and open the Entry Point tab 6 4 Connecting a Code Symbol to a Wishbone Slave Device Design pattern e Create additional memory spaces with interface Wishbone Example Location Examples Soft Designs C to Hardware Video Demo This feature is demonstrated in example CHC_Video PrjFpg 1 Open schematic sheet CHC_Video SchDoc 2 Double click on C Code Symbol U_VIDEO_CONTOL 68 3 Open the Memories pane C Code Symbol Properties Entry Point External Functions Ports Memories Options Files Parameters Maximum Number Of Internal Memories OR Internal Memories Memory Allocation Initialization eserve Address Zero Maximum Size OF Internal Memory Init On Reset O Clear Uninitialized Data Address Wi Data Width BusMode Interface Memory and Memory Mapped rc nheral Buses Allocate From Size 32 Byte Addres Wishbone 8 Byte Addres Wishbone Move Down Design Patterns The Memory and Memory Mapped Peripheral Bus contains two entries VIDEO and 12c and the interface is set to Wishbone These entries create named memory spaces that can be used in the C source code
142. lent to void setvbuf stream buffer IOFBF BUFSIZ setvbuf stream buffer mode Controls buffering for the stream this function must be called before reading or writing Mode size can have the following values _IOFBF causes full buffering _IOLBF causes line buffering of text files __IONBF causes no buffering If buffer is not NULL it will be used as a buffer otherwise a buffer will be allocated size determines the buffer size Formatted input output The format string of print related functions can contain plain text mixed with conversion specifiers Each conversion specifier should be preceded by a character The conversion specifier should be built in order Flags in any order specifies left adjustment of the converted argument a number is always preceded with a sign character has higher precedence than space space anegative number is preceded with a sign positive numbers with a space 0 specifies padding to the field width with zeros only for numbers specifies an alternate output form For o the first digit will be zero For x or X 0x and 0X will be prefixed to the number For e E f g G the output always contains a decimal point trailing zeros are not removed A number specifying a minimum field width The converted argument is printed in a field with at least the length specified here If the converted argument has fewer characters than specified it will be padded at the left s
143. les to specify the delay 71 C to Hardware Compiler User Manual 6 7 Connecting two C Code Symbols Design pattern Call an external function Example Location Examples Soft Designs C to Hardware CodeSymbols Explained This feature is demonstrated in example CodeSymbolExample PrjFpg 1 Open schematic sheet CodeSymExample SchDoc Code Symbol SQRCTRL is connected to Code Symbol UNPACK_FLOAT 2 Double click on C Code Symbol SQRCTRL 3 Open the External Functions tab C Code Symbol Z par lo Properties Entry Paint External Functions Ports Memories Options Files Parameters do_sqx_STB_I do_sqr CYC_I do_sqr_ACK_O do_sqr_ADR_I 17 0 do_sqr_DAT_O 31 0 do_sqr_DAT_I 31 0 do_sqx_SEL_I 3 0 do_sqr_WE_I do_sqr_CLK_I do_sqr_RST_I tame Prototype i ink To C Code Symbol unpack_float void unpack_float float f FIFO _EMPTY FIFO_DATA 31 0 FIFO_RE unpack_float_f 31 0 unpack_float_ START unpack_float_ DONE 4 On the schematic hold down the Ctrl key and double click on C Code Symbol SQRCTRL to open the associated C source file In this tab the prototype of the external function is defined Data is passed to component UNPACK_FLOAT by issuing the function call unpack_float DAT Note about the External Functions tab when you create your design you can call a C Code block that either already exists or not If the C Code Symbol exists you can create a li
144. ll s endp base Random number generation rand srand seed Memory management malloc size calloc nobj size free ptr realloc ptr size Returns a pseudo random integer in the range 0 to RAND_MAX Same as rand but uses seed for a new sequence of pseudo random numbers Allocates space for an object with size size The allocated space is not initialized Returns a pointer to the allocated space Allocates space for n objects with size size The allocated space is initialized with zeros Returns a pointer to the allocated space Deallocates the memory space pointed to by ptr which should be a pointer earlier returned by the malloc or calloc function Deallocates the old object pointed to by ptr and returns a pointer to a new object with size size while preserving its contents If the new size is smaller than the old size some contents at the end of the old region will be discarded If the new size is larger than the old size all of the old contents are preserved and any bytes in the new object beyond the size of the old object will have indeterminate values Environment communication abort atexit func exit status _Exit status getenv s system s Searching and sorting bsearch key base n size cmp Causes abnormal program termination If the signal SIGABRT is caught the signal handler may take over control See Section 7 2 16 signal h func points to a function that
145. lled concurrently from multiple processes for example by both the main program and an interrupt handler e Data types double precision floating point data is treated as single precision float if option no double F is set Type specifiers Complex and_Imaginary are not implemented In addition to the standard ISO C language the compiler supports the following operating modes for ISO C99 ISO C90 and GNU gcc compatibility e keywords to specify which functions should be compiled to hardware e keywords to specify the calling convention and bus interface of the hardware functions e keyword to facilitate multiple return values by using output parameters e keywords to specify the memory space in which a data object is allocated or to specify the memory space to which a pointer points e keywords to specify the bus interface that is used to interface with external memory devices e keywords to map static variables at hardware input or output ports e keywords to control the order in which operations are scheduled e an attribute to locate data at absolute addresses pragmas to control the compiler from within the C source predefined macros All non standard keywords have two leading underscores __ 3 1 Data Types The CHC compiler supports the data types defined in ISO C99 The compiler can operate in either 32 bit mode which is the default or in 16 bit mode with compiler option integer 16bit The sizes of all data type
146. me cases a compiler can remove anti WAR and output WAW dependencies To do so the compiler allocates multiple storage locations for a variable Consider the following fragment of C code and assume that all identifiers represent scalar types with local scope sl a b t oc s2 b L s3 a g h ll oO mh When the compiler allocates different storage locations for the variable a assigned in s1 and variable a assigned in s3 the semantics of the code fragment do not change but the output WAW dependency between s1 and s3 is removed When the compiler allocates different storage locations for the variable b read by s1 and assigned by s2 the anti WAR dependency between s1 and s2 is removed As a result all operations can execute concurrently 5 1 2 1 Aliasing Aliasing occurs when one storage location can be accessed in two or more ways For example in the C language the address of a variable can be assigned to a pointer and as a result the variable s storage location is accessible via both the variable and the pointer The variable and the pointer are aliases The address a pointer points to is known at run time but can often not be computed at compile time In such cases the compiler must assume that the pointer is an alias of all other variables As a result all operations in which the pointer is used depend on all other operations These extra dependencies inhibit parallelism Consider the following code fragments
147. member of the class represented by wct ype_t desc Returns a non zero value if tested true Function Equivalent to locale specific test iswalnum wc iswcetype wc wctype alnum iswalpha wc iswctype wc wctype alpha iswentrl wc iswctype wc wctype cntr1 iswdigit wc iswctype wc wctype digit iswgraph wc iswctype wc wctype graph iswlower wc iswctype wc wctype lower iswprint wc iswctype wc wctype print iswpunct wc iswcetype wc wctype punct iswspace wc iswctype wc wctype space iswupper wc iswctype wc wctype upper iswxditig wc wcetrans property towctrans wc desc Function iswctype wc wctype xdigit Constructs a value of type wct ype_t that describes a mapping between wide characters identified by the string property If property identifies a valid mapping of wide characters according to the LC_TYPE category see Section 7 2 12 locale h of the current locale a non zero value is returned that can be used as an argument in the towct rans function Transforms wide character wc into another wide character described by desc Equivalent to locale specific transformation towlower wc towupper wc towctrans wc wctrans tolower towctrans wc wctrans toupper 98 7 3 C Library Reentrancy Libraries The current version of the CHC compiler does not support reentrancy Some of the functions in
148. mset mktime modf modff modfl nan nanf nanl nearbyint nearbyintf nearbyintl nextafter nextafterf nextafterl nexttoward nexttowardf nexttowardl offsetof open perror pow powf powl printf wprintf pute putwc putchar putwchar puts qsort raise rand read realloc remainder remainderf remainderl remove remquo remquof remquol rename rewind rint rintf rintl round roundf roundl scalbln scalblnf scalblnl Not implemented Not implemented Calls _Iseek Not implemented Needs kernel support See 5 N A skeleton function Sets errno Sets errno Sets errno N A skeleton function N A skeleton function Not implemented Not implemented Not implemented Not implemented Calls _open Uses errno See 2 Sets errno See 2 Uses iob See Uses iob See Uses iob See A 1 1 Uses iob See 1 Updates the signal handler table Uses static variable to remember latest random number Must diverge from ANSI standard to define reentrant rand See 4 Calls _read See malloc 5 Not implemented N A skeleton only Not implemented N A skeleton only Eventually calls _lseek Not implemented Not implemented C to Hardware Compiler User Manual Function Not reentrant because scalbn scalbnf scalbnl scanf wscanf setbuf set jmp setlocale setvbuf signal signbit sin sinf sinl sinh sinhf sinhl snprintf swprintf
149. n wceslen s 7 2 24 time h and wchar h Checks the first n characters of s on the occurrence of character c Returns a pointer to the found character Returns a pointer to the first occurrence of character cin s or the null pointer if not found Returns a pointer to the last occurrence of character cin s or the null pointer if not found Searches s for a sequence of characters specified in set Returns the length of the first sequence found Searches s for a sequence of characters not specified in set Returns the length of the first sequence found Same as st rspn wcsspn but returns a pointer to the first character in s that also is specified in set Searches for a substring sub in s Returns a pointer to the first occurrence of subin s A sequence of calls to this function breaks the string s into a sequence of tokens delimited by a character specified in d im The token found in s is terminated with a null character Returns a pointer to the first position in s of the token Description Fills the first n bytes of s with character c and returns s Typically the values for errno come from int errno This function returns a pointer to the associated error message See also Section 7 2 4 errno h Returns the length of string s The header file time h provides facilities to retrieve and use the calendar date and time and the process time Time can be represented as an integer value or can be br
150. n be used in the exit function Highest number that can be returned by the rand srand function Maximum number of bytes in a multibyte character for the extended character set specified by the current locale category LC_CTYPE see Section 7 2 12 locale h Numeric conversions The following functions convert the initial portion of a string s to a double int long int and long long int value respectively double int long long long atof s atoi atol S S atoll s The following functions convert the initial portion of the string s to a float double and long double value respectively endp will point to the first character not used by the conversion 92 Libraries stdlib h wchar h float strtof s endp float westof s endp double strtod s endp double westod s endp long double strtold s endp long double wcstold s endp The following functions convert the initial portion of the string s to a Long long long unsigned long and unsigned long long respectively Base specifies the radix endp will point to the first character not used by the conversion stdlib h long strtol s endp base long long strtoll s endp base unsigned long strtoul s endp base unsigned long long strtoull s endp base wchar h long wcstol s endp base long long wcestoll s endp base unsigned long wcestoul s endp base unsigned long long wcestou
151. nctions math h tgmath h ceil ceilf ceill ceil floor floorf floorl floor rint ELNE rintl rint lrint lrintf lrintl lrint LIFEN lrintf lrintl lirint nearbyint nearbyintf nearbyintl nearbyint round roundf roundl round lround lroundf lroundl lround llround lroundf lliroundl llround trunc truncf truncl trune Remainder after division math h tgmath h Description Returns the smallest integer not less than x as a double Returns the largest integer not greater than x as a double Returns the rounded integer value as an int according to the current rounding direction See fenv h Not implemented Returns the rounded integer value as a long int according to the current rounding direction See fenv h Not implemented Returns the rounded integer value as along long int according to the current rounding direction See fenv h Not implemented Returns the rounded integer value as a floating point according to the current rounding direction See fenv h Not implemented Returns the nearest integer value of x as int Not implemented Returns the nearest integer value of x as long int Not implemented Returns the nearest integer value of x as long long int Not implemented Returns the truncated integer value x Not implemented Description fmod fmodf fmodl fmod remainder remainderf remainderl remainder remquo remquof remquol remquo Power and absolute value functions Returns the remainder r of x n
152. ndirection is declared The address of an object with automatic storage shall not be assigned to another object that may persist after the first object has ceased to exist Structures and unions 18 1 18 2 x 18 3 18 4 R R R R All structure or union types shall be complete at the end of a translation unit An object shall not be assigned to an overlapping object An area of memory shall not be reused for unrelated purposes Unions shall not be used Preprocessing directives 19 1 A include statements in a file should only be preceded by other preprocessor directives or comments 114 19 2 x 19 3 19 4 19 5 19 6 19 7 19 8 19 9 19 10 19 11 19 12 19 13 19 14 19 15 19 16 19 17 BBS D D po MISRA C Rules Non standard characters should not occur in header file names in include directives The include directive shall be followed by either a lt filename gt or filename sequence C macros shall only expand to a braced initializer a constant a parenthesized expression a type qualifier a storage class specifier or a do while zero construct Macros shall not be define d or undef d within a block undef shall not be used A function should be used in preference to a function like macro A function like macro shall not be invoked without all of its arguments Arguments to a function like macro shall not contain tokens that look like preprocessing directives
153. ne clock cycle Read and write access via the Wishbone interface is asynchronous If the Wishbone ACK signal is asserted in the same clock cycle as the STB signal is asserted then a memory access through the Wishbone interface is also handled in one clock cycle 18 External Interface The signals and signal timing of the memory interface adhere to the Wishbone standard READ WRITE cycle The name of the signal is preceded by the name of the memory space The following signals are added to the interface The SEL and ADR roles are optional depending on the settings DAT_O DAT_ and WE depend on the number of specified read ports write ports and read write ports Interface Type Wishbone STB_O CYC_O ACK_I ADR_O optional SEL_O optional STB_O DAT_I DAT_O WE_O Interface Type Single Port DOUT DIN WE ADR SEL Interface Type Dual Port DOUTA DOUTBI DINA WEA ADRAT ADRBI SELAT SELBJ Interface Type True Dual Port DOUTAT DOUTB DINAT DINB WEA WEB ADRA ADRB SELA SELB 19 C to Hardware Compiler User Manual 2 5 Ports Input ports can be read and output ports can be written at any time during the execution of a function The value assigned to an output port remains valid when the function returns This is shown in the timing
154. nf but extra arguments are given as variable argument list arg See Section 7 2 17 stdarg h fprintf stream format fwprintf stream format Performs a formatted write to the given stream Returns EOF WEOF on error printf format wprintf format Performs a formatted write to the stream stdout Returns EOF WEOF on error sprintf 5 format Performs a formatted write to string s Returns EOF WEOF on error snprintf s n format swprintf s n format Same as sprintf but n specifies the maximum number of 3 characters including the terminating null character to be written vfprintf stream format vfwprintf stream format Same as fprintf fwprint f but extra arguments are given arg arg as variable argument list arg See Section 7 2 17 sidarg h vprintf format arg vwprintf format arg Same as print f wprintf but extra arguments are given as variable argument list arg See Section 7 2 17 sidarg h vsprintf s format arg vswprintf s format arg Same as sprint f swprint f but extra arguments are given as variable argument list arg See Section 7 2 17 sidarg h Character input output stdio h wchar h Description fgetc stream fgetwc stream Reads one character from stream Returns the read character or EOF WEOF on error 90 stdio h wehar h Libraries Description getc stream getchar stdin fgets s n stream gets s n s
155. ngetwc unlink vfprintf vfwprintf vfscanf vfwscanf vprintf vwprintf vscanf vwscanf vsprintf vswprintf vsscanf vswscanf wcertomb wcesrtombs wcestoimax wcestombs wcstoumax wctob wctomb wctrans wctype write Table C library reentrancy Not implemented Uses static variable which defines initial start time Uses iob See 1 Uses local buffer to build filename Function can be adapted to use user buffer This makes the function non ANSI See 4 Not implemented Uses static buffer to hold unget characters for each file Can be moved into iob structure See 1 Calls _ unlink Uses iob See 1 Calls _doscan Uses iob See 1 Calls _doscan Sets errno Sets errno Sets errno Sets errno Sets errno via calls to other functions N A skeleton function Sets errno via calls to other functions N A skeleton function Calls _ write Several functions in the C library are not reentrant due to the following reasons e The iob structure is static This influences all I O functions e The ungetc array is static This array holds the characters one for each stream when ungetc is called The variable errno is globally defined Numerous functions read or modify errno e _doprint and _doscan use static variables for e g character counting in strings Some string functions use locally defined static buffers This is prescribed by ANSI malloc uses a Static heap spa
156. nk to this C Code symbol In that case the prototype of the callee is automatically imported and updated when the C Code Symbol that contains the function definition is modified If the code symbol does not already exist you have to specify the prototype of its entry point 6 8 Building a Dataflow Pipeline using C Code Symbols The essence of a dataflow pipeline is that multiple C Code Symbols operate in parallel on one set of input data where each Code Symbol passed its output to a subsequent code symbol To optimize the throughput of the dataflow pipeline all Code Symbols operate in parallel where the throughput of the dataflow pipeline is defined by the throughput of the slowest dataflow pipeline stage 72 Design Patterns Design pattern Such dataflow pipelines can be constructed using multiple code symbols This is demonstrated in example NB2_Audio_DSP PrjFpg Alternatively such a design can also be implemented using one C Code Symbol and exploiting the C language extensions of the CHC compiler This is demonstrated in example chc_vga_video PrjFpg 6 8 1 Using Multiple Code Symbols Example Location Examples Soft Designs C to Hardware Audio DSP This feature is demonstrated in example NB2_Audio_DSP Pr4Fpg 1 Open schematic document Filter SchDoc Each of the C Code Symbols on the right side of the document U_Input Gain U_Delay U_Echo passes its output to the next and immediately continues to process a next input 2
157. nly the set of signals from the FIFO to component SQRCTRL are of interest for this design pattern 2 Double click on C Code Symbol SQRCTRL 3 Open the Ports tab C Code Symbol do_sqr_STB_I do_sqr CYC_1 Data Type Data Width do_sqr_ ACK_O Boolean 1 do_sqr_ADR_I 17 0 Floating Point Single do_sqx_DAT_O 31 0 s i dosa DAT 11 0 Boolean 1 do _sqr_SEL_I 3 0 do_sqr_WE_I do_sqr_CLK_I do_sqr_RST_I FIFO_EMPTY FIFO_DATA S1 0 FIFO_RE unpack _float_f 31_ 0 unpack_float START Move Up Move Down Import From Source File unpack_float_DONE Two input ports and one output port are defined in this tab These ports are declared in the associated C file input bool FIFO_E __input float FIFO_DATA __ output bool FIFO_RE In the source you see that the declaration of the output port FIFO_RE contains an initializer to make sure that the output is defined when the system is booted _ output bool FIFO_RE 0 Data is retrieved from the FIFO by executing the following C statements FIFO_RE 1 result FIFO_DATA FIFO _RE 0 Note that it is not necessary to declare ports as volatile since ___output and__input qualified objects are implicitly declared volatile If this was not the case the compiler might optimize accesses to ports away or change the order in which accesses take place If the diverse signals must be accessed within given time intervals you can use the intrinsic function ___ wait clock cyc
158. ns between multi byte characters and wide characters In these functions ps points to struct most ate_t which holds the conversion state information necessary to convert between sequences of multibyte characters and wide characters typedef struct wchar_t we_value wide character value solved so far unsigned short n_bytes number of bytes of solved multibyte unsigned short encoding encoding rule for wide character lt gt multibyte conversion mbstate_t When multibyte characters larger than 1 byte are used this struct will be used to store the conversion information when not all the bytes of a particular multibyte character have been read from the source In this implementation multi byte characters are 1 byte long MB_CUR_MAX and MB_LEN_MAX are defined as 1 and this will never occur mbsinit ps Determines whether the object pointed to by ps is an initial conversion state Returns a non zero value if so 97 C to Hardware Compiler User Manual mbsrtowcs pwes src n ps Restartable version of mostowcs See Section 7 2 22 stdlib h and wchar h The initial conversion state is specified by ps The input sequence of multibyte characters is specified indirectly by src wesrtombs s src n ps Restartable version of wcstombs See Section 7 2 22 sidlib h and wchar h The initial conversion state is specified by ps The input wide string is specified indirectly by src mbrtowc pwc s n p
159. nt to quickly implement a divider just add the required parameters and modify the C Code accordingly If you want the circuit to be combinatorial instead of clocked then double click the C Code Symbol open the Entry Point tab and select Interface Type Parallel Combinatorial 6 3 Connecting a Code Symbol to a Wishbone Master Device The Wishbone master device can either be a peripheral device or a processing core 6 3 1 Connecting a Code Symbol to a Wishbone Master Peripheral Design pattern e Qualify the entry point with __CC wishbone single nowait Example Location Examples Soft Designs C to Hardware VGA Video 65 C to Hardware Compiler User Manual Example chc_vga_video Pr4jFpg demonstrates how to connect a C Code Symbol to the Wishbone Master port of the BT656 Controller See schematic document init SchDoc Signal harness PIXEL_PIPELINE is connected to the External Video Memory Interface Signals of the BT656 component BT656 Controller VADR 4 2 YADRO OL VADRA 0 YAAAAAYAY AA STB CYC ACK a ADRD9 0 g uo DAT_A B1 0 SELB 0 WE 66 onc Sie DAT_B 31 0 1 Hold down the Ctrl key and double click on the harness connector PIXEL_PIPELINE The schematic document chc_video SchDoc opens PIXEL_PIPELINE Caras O CAM MEM D 2 Hold down the Ctrl key and double click on the CAM port of the U_FILTERS component If all is well you see that the BT656 WB
160. nted to by pir Returns the number of elements successfully read fwrite ptr size nobj stream Writes nobj members of size bytes from to the array pointed to by ptr to the given stream Returns the number of elements successfully written Random access stdio h Description fseek stream offset origin Sets the position indicator for stream When repositioning a binary file the new position origin is given by the following macros SEEK_SET 0 offset characters from the beginning of the file SEEK_CUR 1 offset characters from the current position in the file SEEK_END 2 offset characters from the end of the file ftell stream Returns the current file position for stream or 1L on error rewind stream Sets the file position indicator for the stream to the beginning of the file This function is equivalent to void fseek stream 0L SEEK_SET clearerr stream fgetpos stream pos Stores the current value of the file position indicator for stream in the object pointed to by pos fsetpos stream pos Positions stream atthe position recorded by fgetpos in pos 91 C to Hardware Compiler User Manual Operations on files stdio h remove file rename old new tmpfile tmpnam buffer Error handling stdio h clearerr stream ferror stream feof stream perror s Description Removes the named file so that a subsequent attempt to
161. o unreachable code All non null statements shall have a side effect A null statement shall only occur on a line by itself Labels should not be used The goto statement shall not be used The continue statement shall not be used The break statement shall not be used except in a switch An if or loop body shall always be enclosed in braces All if else if constructs should contain a final else Every non empty case Clause shall be terminated with a break All switch statements should contain a final default case A switch expression should not represent a Boolean case Every switch shall have at least one case Floating point variables shall not be used as loop counters A for should only contain expressions concerning loop control A violation is reported when the loop initialization or loop update expression modifies an object that is not referenced in the loop test Iterator variables should not be modified in a for loop 108 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 BS aa po Sard po Rate D SSPBDDSFSBIAIIAAIAAIIAAIAA r gt IID gt Se eS SS a a a a D o EE Se ee ee D anana D D Se E A D aa gt lt gt o MISRA C Rules Functions shall always be declared at file scope Func
162. object data bss max rodata stack absolute HEH EH HE AE FE FE FE HE EE FE FE FE FE EE EE EE EE EEE EEE EE EEE EE EEE EE EEE EE EE EE EH Memory Map HEH EH aE AE AE FE AE FE FE FE HE EH EEE HE EE FE FE FE EH EE EE HEE EE EEE HEE EE EE EE EE HIS qualifier __ HIS alt qualifier _ mem1 scope external interface parallel size 1024 bytes type single port RAM width 32 address width 8 symbol address size properties histogram 0x0 0 bss absolute 121 C to Hardware Compiler User Manual 122 Chapter 10 CHC Qualifier File Format The CHC qualifier file qua contains a list of qualifiers for functions and data objects This file is passed to the CHC compiler via option qualifier file file The CHC compiler reads the contents of the qualifier file and inserts the qualifiers into the parse tree when the C source file is parsed This way you can qualify objects in the C source file without changing the contents of the source file Syntax Each line in the qualifier file has an identifier part a qualifier part and an optional path part More formally the contents of the file are as follows Note means zero or one means zero or more means one or more means or qualifier file lines lines line lines line identifier part qualifier part path part identifier part function name variable name function name variable name qualifier part lt qualifie
163. oblem in a design Note that this manual does notdescribe the Altium Designer graphical user interface GUI features through which the CHC compiler is accessed See Section 1 1 2 Suggested Reading for directions where to find that type of information 1 1 1 Required Knowledge to use the CHC Compiler Familiarity with the C programming language is essential Experience with optimizing your code for a given target processor architecture helps to decide which code fragments would probably benefit most from compilation to hardware Knowledge about hardware design languages is not required After compilation the generated HDL file must be integrated with the rest of the hardware design Subsequently the resulting design must be instantiated on the FPGA In Altium Designer this process is fully automated 1 1 2 Suggested Reading The Altium Wiki http wiki altium com provides all documentation concerning Altium Designer We suggest to read the following pages and documents as well They provide an introduction to the CHC compiler and to the Application Specific Processor and C Code Symbols that both depend on the features supplied by the CHC compiler Introduction to C to Hardware Compilation Technology in Altium Designer e TU0130 Getting Started with the C to Hardware Compiler Tutorial Designing Custom FPGA Logic using C WB_ASP Configurable Application Specific Processor Schematic C Code Symbol e Altium Labs You can either a
164. ocessor core The hardware resources available to the CHC compiler are described in the resource definition file while the linker script language file LSL file describes the memories available to the CHC compiler The resource definition file describes the available number of functional units and their characteristics that the compiler can instantiate The LSL file describes the available number of memories and their characteristics that the compiler can use and or instantiate The compiler automatically distributes data objects over multiple memory spaces Only if the compiler is not able to create a memory partitioning that satisfies your performance requirement it is necessary to use memory type qualifiers It may also be 36 C Language Implementation useful to use memory space qualifiers to explicitly qualify variables and or pointers that are located in point to the memory that is shared with the processor core Initialized Variables with Static Storage The memory on the FPGA system is initialized at system configuration time when the bit file that configures the FPGA is loaded into the FPGA Variables located in memory that is instantiated by the CHC compiler these memories are components under the top level VHDL entity are initialized You can use the compiler option init mem on reset to specify to initialize internal memories on reset Additional hardware and copy tables will be generated which will reinitialize the internal m
165. ode ASP Operating Mode The entry point of an embedded program is the main function If the CHC compiler is used in ASP operating mode the main function must be executed by a processing core All functions that are compiled into hardware can be called from software running on the core As such each hardware function can be regarded as an individual entry point of the ASP component No startup code is linked into the hardware circuitry By default rt 1__alloc qualified initialized static data is initialized when the FPGA is configured and ____ rt 1_alloc qualified uninitialized data is also cleared when the FPGA is configured If you want to initialize and clear the __ rt 1_alloc qualified data objects on reset instead of during FPGA configuration only do the following 1 Inthe Projects panel right click on the name of the embedded project and select Project Options The Options for Embedded Project PrjEmb appears 2 Onthe Compiler Options tab in the left pane expand the C Compiler entry and select Miscellaneous 3 Enable Initialize ASP internal memories on reset 4 Click OK to confirm the new settings and to close the dialog Default Operating Mode If the CHC compiler is used in default mode the main function can be but does not have to be defined The startup behavior is different in these cases e Function main is defined In this case execution starts in function _START which is defined in the C library You
166. ogical amp amp or operator shall not contain side effects The operands of a logical amp amp or shall be primary expressions The operands of logical operators amp amp and should be effectively Boolean Expressions that are effectively Boolean should not be used as operands to operators other than amp amp and Bitwise operators shall not be applied to operands whose underlying type is signed The right hand operand of a shift operator shall lie between zero and one less than the width in bits of the underlying type of the left hand operand This violation will only be checked when the shift count evaluates to a constant value at compile time The unary minus operator shall not be applied to an expression whose underlying type is unsigned The comma operator shall not be used Evaluation of constant unsigned integer expressions should not lead to wrap around The underlying bit representations of floating point values shall not be used A violation is reported when a pointer to a floating point type is converted to a pointer to an integer type The increment and decrement operators should not be mixed with other operators in an expression Control statement expressions 13 1 13 2 13 3 13 4 13 5 13 6 13 7 R A R R R R R Control flow 14 1 14 2 14 3 14 4 14 5 14 6 14 7 14 8 14 9 R R D anaana nana D D ar ate St te Cate Assignment
167. oken down in components Two arithmetic data types are defined which are capable of holding the integer representation of times clock_t unsigned long long time_t unsigned long The type struct tm below is defined according to ISO C99 with one exception this implementation does not support leap seconds The struct tm type is defines as follows struct tm 95 C to Hardware Compiler User Manual int tm_Sec int tm_min int tm_hour int tm_mday int tm_mon int tm_year int tm_wday int tm_yday int tm_isdst j Time manipulation clock difftime tl t0 mktime tm tp time timer Time conversion asctime tm tp ctime timer gmt ime timer localtime timer Formatted time seconds after the minut 0 59 minutes after the hour 0 59 hours since midnight 0 23 day of the month 1 31 months since January 0 11 year since 1900 Ef days since Sunday 0 6 days since January 1 0 365 usi Daylight Saving Time flag Returns the application s best approximation to the processor time used by the program since it was started This low level routine is not implemented because it strongly depends on the hardware To determine the time in seconds the result of clock should be divided by the value defined by CLOCKS_PER_SEC Returns the difference t1 t0 in seconds Converts the broken down time in the structure
168. ol signals START DONE CLOCK and RESET are mapped at respectively the Wishbone signals STB_1 ACK_O CLK_I and RSTI This calling convention can also be used in default operation mode to create a C Code Symbol that can be called from a processing core You can access C Code Symbols with this interface type in the C source via a memory pointer dereference Interface via NIOS II custom instruction interface The following modifiers are available Modifier function number Description This parameter is only supported in combination with bus type wishbone It is used to address the location of the function s ACT and DONE signals within the static stack frame see Figure 2 2 Address map in Section 2 3 2 Wishbone Multi Cycle Bus Adapter The function number must be a unique number in the range of 0 31 32 Modifier ack nowait pipeline allow_stalls ii range latency range register_outputs C Language Implementation Description This modifier only effects the behavior of callers of an external function When the callee has this modifier set the caller must keep the START pin asserted and the parameters values valid until the DONE pin of the callee is asserted In this way the caller can safely make the call even if the callee is not in the idle state When the START signal is asserted the callee also has the nowait modifier set the caller will block until the callee is started Without the nowait modifier
169. ol to open the associated C source file wb2rgb c In the source code you see how the parameters of the function are processed and how the results are passed to another C Code Symbol via a call to function NEXT bt 656_addr rgb_right rgb_left y h 6 3 2 Connecting a Code Symbol to a Processing Core If you have an embedded project and you want to off load several functions to hardware then it is likely easier to use an ASP instead of a C Code Symbol see Section 6 1 Creating an ASP for more information Design pattern The C Code Symbol can be accessed from code executing on the processing core by either a memory access operation such as a pointer dereference or via a function calls The pointer dereference mechanism is used if the C Code Symbol should be accessed in the same way as a traditional peripheral which typically offers a number of registers that you can read and or write The function call interface is often used if the Code Symbol implements an optimized version of a software function where a set of parameters are passed to the function Example Location Examples Soft Designs C to Hardware CodeSymbols Explained Example CodeSymbolExample Pr4jFpg demonstrates how to connect C Code Symbols to a processing core via both interface types 6 3 2 1 Accessing a C Code Symbol via Pointer Dereferences Design pattern 1 Qualify the entry point with __CC wishbone single 2 Select device type Peripheral inthe Wis
170. oldexept Not implemented feof Uses values in iob See 1 feraiseexcept Not implemented ferror Uses values in iob See 1 fesetenv Not implemented fesetexceptflag Not implemented fesetround Not implemented fetestexcept Not implemented fFeupdateenv Not implemented fflush fgetc fgetwc Fgetpos fgets fgetws Floor floorf floorl fma fmaf fmal fmax fmaxf fmaxl fmin fminf fminl fmod fmodf fmodl fFopen fpclassify fprintf fwprintf fputc fputwe fputs fputws fread free freopen fFrexp frexpf frexpl fFscanf fwscanf fseek fFsetpos Estat ftell fwrite getc g etwe getchar getwchar getcwd getenv gets getws gmt ime hypot hypotf hypotl llogb ilogbf ilogbl imaxabs imaxdiv isalnum iswalnum Modifies iob See 1 Uses pointer to iob See 1 Sets the variable errno and uses pointer to iob See 1 2 Uses iob See 1 Not implemented Not implemented Not implemented Uses iob and calls malloc when file open for buffered IO See 1 Uses iob See 1 Uses iob See 1 Uses iob See 1 Calls fgetc See 1 free uses static buffer management structures See malloc 5 Modifies iob See 1 Uses iob See 1 Uses iob and calls _Iseek Accesses ungetc array See 1 Uses iob and sets errno See 1 2 Not implemented Uses iob and sets errno Calls _Iseek See 1 2 Uses iob See 1 Uses iob
171. ome of the MISRA C checks Also note that some checks cannot be performed when the optimizations are switched off 4 11 C Compiler Error Messages The C compiler reports the following types of error messages F Fatal errors After a fatal error the compiler immediately aborts compilation E Errors Errors are reported but the compiler continues compilation No output files are produced W Warnings Warning messages do not result into an erroneous output file They are meant to draw your attention to assumptions of the compiler for a situation which may not be correct You can control warnings with embedded compiler option Treat warnings as errors which is passed to the CHC compiler as well 1 While in your C source from the Project menu select Project Options The Options for Embedded Project dialog appears 2 Expand the C Compiler entry and select Diagnostics 3 Set Treat warnings as errors to True I Information Information messages are always preceded by an error message Information messages give extra information about the error 55 C to Hardware Compiler User Manual S System errors System errors occur when internal consistency checks fail and should never occur When you still receive the system error message S9 internal consistency check failed please report please report the error number and as many details as possible about the context in which the error occurred 56 Chapter 5 Paralleli
172. ompiler cannot create a schedule without wait states When one pipeline stalls all stages are halted no flushing occurs pragma clear pragma noclear By default uninitialized global or static variables are cleared to zero on startup With pragma noclear this step is skipped Pragma clear resumes normal behavior This pragma applies to constant data as well as non constant data pragma extern symbol Force an external reference extern assembler directive even when the symbol is not used in the module pragma fastfloat on off default restore This pragma will try to remove intermediate normalize and denormalize operations for floating point arithmetic This will lead to faster code and more accurate results However the results can differ from the results from the software floating point library therefore this option is disabled by default Use pragma fastfloat restore to restore the previous value pragma ifconvert method default restore This pragma controls the method used to do if conversion to convert control flow into data flow using predicates If conversion leads to more parallelism but can also lead to more resource usage and especially to larger delays for certain control flow paths Method can be one of full The compiler does if conversion for all hyperblocks control flow regions with a single entry but possibly multiple exits none No if conversion is done the original control flow is used in t
173. omplex hyperbolic tangent of z casinh casinhf casinhl Returns the complex arc hyperbolic sinus of z cacosh cacoshf cacoshl Returns the complex arc hyperbolic cosine of z catanh catanhf catanhl Returns the complex arc hyperbolic tangent of z Exponential and logarithmic functions cexp cexpf cexpl Returns the result of the complex exponential function e7 clog clogf elogi Returns the complex natural logarithm Power and absolute value functions cabs cabsf cabsl Returns the complex absolute value of z also known as norm modulus or magnitude cpow cpowf cpowl Returns the complex value of x raised to the power y x where both x and y are complex numbers esqrt csqrtf esqrtl Returns the complex square root of z Manipulation functions carg cargf cargl Returns the argument of z also known as phase angle cimag cimagf cimagl Returns the imaginary part of z as a real respectively as a double float long double conj conjf conjl Returns the complex conjugate value the sign of its imaginary part is reversed cproj cprojf cprojl Returns the value of the projection of z onto the Riemann sphere creal crealf creall Returns the real part of z as a real respectively as a double float long double 7 2 3 ctype h and wctype h The header file ct ype h declares the following functions which take a character c as an integer type argument The header file wctype h declares parallel wide character functions which take a character c of t
174. open it fails Returns a non zero value if not successful Changes the name of the file from old name to new name Returns a non zero value if not successful Creates a temporary file of the mode wb that will be automatically removed when closed or when the program terminates normally Returns a file pointer Creates new file names that do not conflict with other file names currently in use The new file name is stored in a buffer which must have room for L_tmpnam characters Returns a pointer to the temporary name The file names are created in the current directory and all start with tmp At most TMP_MAX unique file names can be generated Description Clears the end of file and error indicators for stream Returns a non zero value if the error indicator for stream is set Returns a non zero value if the end of file indicator for stream is set Prints s and the error message belonging to the integer errno See Section 7 2 4 errno h 7 2 22 Stdlib h and wehar h The header file std1ib h contains general utility functions which fall into the following categories Some have parallel wide character declared in wchar h Numeric conversions Random number generation Memory management Environment communication Searching and sorting Integer arithmetic Multibyte wide character and string conversions Macros EXIT_SUCCES 0 EXIT_FAILURE 1 RAND MAX 32767 B_CUR_MAX 1 Predefined exit codes that ca
175. optimizations Alias for abcdefgikimopqstuvwy Enables aggressive global optimization techniques The relation between source code and generated instructions is complex and hard to understand Inlining i and loop unrolling u are enabled These optimizations enhance execution time at the cost of extra generated hardware pragma pipeline on off default restore Enables disables pipelining for loop bodies This pragma has no effect on __ CC pipeline qualified functions pragma source on off default restore 29 C to Hardware Compiler User Manual pragma nosource With these pragmas you can choose which C source lines must be listed as comments in assembly output pragma stdinc on off default restore This pragma changes the behavior of the include directive When set the options I and no stdinc of the compiler are ignored pragma tradeoff level default restore Specify tradeoff between speed 0 and size 4 pragma unroll_ factor number default restore pragma endunroll_ factor With this pragma you can specify an unroll factor if you have set pragma optimize unroll The unroll factor determines to which extent loops should be unrolled Consider the following loop pragma unroll_factor 2 for i 1 i lt 10 i xtt pragma endunroll_factor With an unroll factor of 2 the loop will be unrolled as follows for i 1 i lt 5 it J xtt
176. orted in both signed and unsigned variants The extended integer types i e the types not having names specified in the ISO C99 standard are called __intx where x is the width C Type Size mem Size reg Align Limits signed __int1 8 1 8 Ox1 0x0 unsigned__int1 8 1 8 0 0x1 signed __int2 8 2 8 Ox2 0x1 unsigned__int2 8 2 8 0 0x3 signed __int3 8 3 8 0x4 0x3 signed __int11 16 11 16 0x400 Ox3ff unsigned __int11 16 11 16 0 Ox7ff signed __int23 32 23 32 0x400000 Ox3fffff unsigned__int23 32 23 32 0 Ox7fffff signed __int61 64 61 32 0x1000000000000000 Oxtfffffffffffffff unsigned__int61 64 61 32 0 Ox1fffffffffffffff signed __int62 64 62 32 0x2000000000000000 Ox1fffffftfffffffff unsigned __int62 64 62 32 0 Ox3fftffffffffffff signed __int63 64 63 32 0x4000000000000000 Ox3fffffffffffffff unsigned__int63 64 63 32 0 OXx7 ffffffTtfftttfT In Altium Designer you can specify the bit width of return types parameters and ports from the C Code Symbol 1 Double click on a port on the C Code Symbol The C Code Entry Parameter dialog appears 2 Enter the number of bits in the Integer Width field On the schematic sheet the width of the inout and output ports through which the C Code Symbol is connected to other components is updated Also the C source code is automatically u
177. part of the CHC compiler generated circuit it is instantiated by the CHC compiler and is not visible outside the top level entity An external resource is not instantiated by the CHC compiler but is accessed via the external interface the CHC compiler adds the appropriate signals to the top level entity This interface is currently not available to the user 2 1 External Interface by Example This example shows how the interface elements specified in a C program are made available as ports in the top level entity In Altium Designer the ports of this top level entity are visible on the schematic sheet C program interfaces c include lt stdint h gt Provides extended types uint3_t coef 0OxF Array coef is located in internal memory __ input uint3_t p_in This is an input port _ import uint3_t called_func uint3_t par_cf This is an imported function _ export uint4_t entry_point uint3_t par_ep This is an entry point l return p_in coef par_ep called_func par_ep Compiling with cche lsl file solo l1sl init mem on reset interfaces c results into entity c_root is port CLOCK in std_logic the clock signal for the generated circuit DONE out std_logic signals the return from entry_point RESET in std_logic External Interface reset the generated circuit RESET_DONE out std_logic signals that reset is finished RETVAL out std_logic_vector 3 do
178. pdated accordingly Typedefs The CHC compiler has predefined typedefs for all integer types both signed and unsigned 23 C to Hardware Compiler User Manual The standard header file st dint h contains typedefs for all integer widths int x_t and the unsigned variants uintx_t The extended integer types and the extension of the standard header file conform to the ISO C99 specification typedef __int7_t int7_t typedef __uint7_t uint7_t 3 2 Volatile The CHC compiler accesses explicitly or implicitly volatile qualified data objects in the order as specified in the source file This applies also to objects that are located in different memory spaces 3 3 Changing Data Alignment unaligned _packed__ and __align Normally data pointers and structure members are aligned according to the table in the previous section Suppress alignment With the type qualifier __ unaligned you can specify to suppress the alignment of objects or structure members This can be useful to create compact data structures In this case the alignment will be one bit for bit fields or one byte for other objects or structure members At the left side of a pointer declaration you can use the type qualifier unaligned to mark the pointer value as potentially unaligned This can be useful to access externally defined data You can always convert a normal pointer to an unaligned pointer Conversions from an unaligned pointer to an aligned pointer are
179. perating mode of the C to Hardware Compiler where the C source code is partially translated into an electronic circuit and partially into an instruction sequence that is processed by a processor core The electronic circuit is build by the hardware compiler whereas the instruction sequence is generated via a traditional embedded compile assemble link locate design flow The term HW SW mode is used as a synonym for ASP mode CHC is an acronym for C to Hardware Compiler a C to RTL compiler developed and distributed by Altium In this manual C to Hardware Compiler and CHC compiler are used both The name of this compiler on the command line is che The term C to RTL compiler is commonly used to identify the class of C compilers that translate C source code into an electronic circuit The output of the compiler is typically a file that describes the circuit at the RTL level in VHDL or Verilog A series of interconnected Code Symbols where each Code Symbol passes output data to a subsequent Code Symbol that takes the data as input All Code Symbols in a dataflow pipeline are active i e execute simultaneously The term embedded compiler is used to identify a traditional C compiler that translates a C program into a sequence of instructions that are executed by a microcontroller or DSP The External Interface is the part of the C application that is visible to its environment It consists of the pins generated on the top level entity as well as th
180. pragmas offer the following advantages e The pragma text does not clutter the code it can be defined anywhere before a function or even in a header file So the pragma setting and the source code are uncoupled When you use different header files you can experiment with a different set of pragmas without altering the source code The pragma has an implicit end the end of the statement can be a loop or block So no need for pragma restore endoptimize etc 26 C Language Implementation Example pragma labl optimize P volatile int v voi void int i a a 42 lab1 for i l i lt 10 i the entire for loop is part of the pragma optimize a i back to optimization level as defined before labl v a Supported pragmas The compiler recognizes the following pragmas other pragmas are ignored Pragmas marked with support a label prefix pragma alias symbol defined_symbol Define symbol as an alias for defined_symbol It corresponds to an equate directive at assembly level The symbol should not be defined elsewhere and defined_symbol should be defined with static storage duration not extern or automatic pragma allow_stalls on off default restore Allow or disallow stalls in the pipeline schedule for a pipeline loop body If this pragma is set the generated schedule is allowed to contain wait states When this pragma is not set an error is generated if the c
181. r shall not contain side effects The operands of a logical amp or shall be primary expressions Assignment operators shall not be used in Boolean expressions Logical operators should not be confused with bitwise operators Bitwise operations shall not be performed on signed integers A shift count shall be between 0 and the operand width minus 1 This violation will only be checked when the shift count evaluates to a constant value at compile time The unary minus shall not be applied to an unsigned expression sizeof should not be used on expressions with side effects The implementation of integer division should be documented The comma operator shall only be used in a for condition Don t use implicit conversions which may result in information loss Redundant explicit casts should not be used Type casting from any type to or from pointers shall not be used The value of an expression shall be evaluation order independent This rule is checked using worst case assumptions This means that a violation will be reported when a possible alias may cause the result of an expression to be evaluation order dependent No dependence should be placed on operator precedence rules Mixed arithmetic should use explicit casting Tests of a non Boolean value against 0 should be made explicit F P variables shall not be tested for exact equality or inequality Constant unsigned integer expressions should not wrap around There shall be n
182. r you can use Altium Designer to mark these variables from the ASP configuration dialog instead of using the __ rt1_alloc qualifier 1 Right click on the ASP component and select Configure WB_ASP The Configure WB_ASP Properties dialog appears 2 On the right side of the dialog you ll find the section Symbols in Hardware 3 In the upper part in the column Allocate in Hardware select the variables that you want to be located by the hardware compiler This is the equivalent of the __ rt 1_alloc qualifier 3 7 3 Memory Qualifier _mem0 _mem15 Memory type qualifiers are used to specify the memory space in which a data object is allocated or to specify the memory space to which a pointer points Syntax _ memx where Xis a digit in the range 0 15 Limiting conditions A list of declaration type specifiers cannot contain different memory type qualifiers e Structure or union members cannot have memory qualifiers 37 C to Hardware Compiler User Manual Semantics If the same memory qualifier appears more than once in the same specifier qualifier list either directly or via one or more typedefs the behavior is the same as if it appeared only once For ASPs the memory space qualified with __mem0 is the shared memory space A _ memx qualified pointer cannot be converted to a pointer without a type qualifier or with a different type qualifier or vice versa A conforming implementation may map memory qualified o
183. r the build process is fully automated For ordinary use you do not need to understand the level of detail that is presented in this chapter 4 1 CHC Compiler Options Command line options overview Normally you do not need to set compiler options the fully automated build process uses default settings that work for all situations Nevertheless it is possible to set your own compiler options for example to manually choose for certain optimizations The CHC compiler options are not further explained in this manual except where absolutely necessary You can ask for a list of options with their descriptions by invoking the CHC compiler from the command line 1 Make sure that you have started Altium Designer to gain licensed access to the CHC compiler on the command line In Altium Designer recompile your embedded project to activate the license 2 Open a command prompt window and browse to System Tasking chc bin in the installation directory of Altium Designer 3 Invoke the CHC compiler with the command che help options This gives a list of all available options with their descriptions The same applies to ashe and hdlhc Setting options when building an ASP To manually set a CHC compiler option in Altium Designer you need to have an embedded project which may be part of an FPGA project To access the compiler options 1 Inthe Projects panel right click on the name of the embedded project and select Project Options T
184. ragraph on reentrancy applies to multi process environments only If reentrancy is required for calling library functions from an exception handler another approach is required For such a situation it is of no use to allocate e g multiple iob structures In such a situation several pieces of code in the library have to be declared atomic this means that interrupts have to be disabled while executing an atomic piece of code 106 Chapter 8 MISRA C Rules This chapter contains an overview of the supported and unsupported MISRA C rules 8 1 MISRA C 1998 This section lists all supported and unsupported MISRA C 1998 rules See also Section 4 10 C Code Checking MISRA C A number of MISRA C rules leave room for interpretation Other rules can only be checked in a limited way In such cases the implementation decisions and possible restrictions for these rules are listed x means that the rule is not supported by the C compiler R is a required rule A is an advisory rule 1 R The code shall conform to standard C without language extensions x 2 A Other languages should only be used with an interface standard 3 A Inline assembly is only allowed in dedicated C functions x 4 A Provision should be made for appropriate run time checking 5 R Only use characters and escape sequences defined by ISO C x 6 R Character values shall be restricted to a subset of ISO 106460 1 7 R Trigraphs shall not be used 8
185. re the previous call has terminated To create such a schedule the compiler unrolls loops and rewrites control flow constructs as predicated instructions Unique hardware resources are assigned to the functional units that are active in each processing state As a result the amount of consumed hardware resources can increase significantly if a function is pipelined You can configure the characteristics of the created pipeline by specifying the initiation interval and the latency The initiation interval ii specifies how many clock cycles are taken before starting the next iteration Thus an ii 2 means that a new function invocation can be started every second clock cycle As a rule of thumb the lower the latency the more hardware resources will be used The latency refers to the time in clock cycles form the first input to the first output or function return for functions of type void Additionally you can specify whether or not the generated schedule may stall Stalls can be caused by memory accesses or calls to external hardware functions CHC cannot generate a pipeline for all C code Some conditions can prevent a pipelined schedule are e Excessive control flow 62 Stalls without the al low_stalls option set Multiple __ import functions Alias dependence analysis shows loads and store are not collapsible Lack of hardware resources e g the number of read write ports to access memory The latency range property
186. ric and therefore do not have a parallel function in tgmath h All arguments must be expressions of real floating type math h tgmath h Description fpclassify Returns the class of its argument FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL Or FP_ZERO isfinite Returns a nonzero value if and only if its argument has a finite value isinf Returns a nonzero value if and only if its argument has an infinite value isnan Returns a nonzero value if and only if its argument has NaN value isnormal Returns a nonzero value if an only if its argument has a normal value signbit Returns a nonzero value if and only if its argument value is negative 7 2 15 setjmp h The current version of the CHC compiler does not support the functions set jmp and longjmp The set jmp and long jmp in this header file implement a primitive form of non local jumps which may be used to handle exceptional situations This facility is traditionally considered more portable than signal h 85 C to Hardware Compiler User Manual int setjmp jmp_buf env Records its caller s environment in env and returns 0 void long jmp jmp_buf env Restores the environment previously saved with a call to set jmp int status 7 2 16 signal h Signals are possible asynchronous events that may require special processing Each signal is named by a number The following signals are defined SIGINT 1 Receipt of an interactive attention signal SIGILL 2 D
187. rrno can be set to ERR_POS by the file positioning functions ftell fsetpos and fgetpos 3 ungetc Currently the ungetc buffer is static For each file entry in the iob structure array there is one character available in the buffer to unget a character 4 local buffers tmpnam creates a temporary filename and returns a pointer to a local static buffer This is according to the ANSI definition Changing this function such that it creates the name in a user specified buffer requires another calling interface Thus the function would be no longer portable strtok scans through a string and remembers that the string and the position in the string for subsequent calls This function is not reentrant by design Making it reentrant requires support of a kernel to store the information on a per process basis rand generates a sequence of random numbers The function uses the value returned by a previous call to generate the next value in the sequence This function can be made reentrant by specifying the previous random value as one of the arguments However then it is no longer a standard function 5 malloc Malloc uses a heap space which is assigned at locate time Thus this implementation is not reentrant Making a reentrant malloc requires some sort of system call to obtain free memory space on a per process basis This is not easy to solve within the current context of the library This requires adaptation to a kernel This pa
188. rs gt qualifiers qualifier qualifiers qualifier rue any rue any empty path part t path empty The path part is optional If the path partis omitted the identifier or the function has global scope If the path partis given it specifies that the identifier or function has a static scope i e module scope Example of a function and a variable with a static storage main lt _ rtl __CC wishbone 2 gt locvar lt __export gt file2 c Example of automatic variables funcfoo var2 lt export gt funcfoo locvari lt near gt foo c Example of qualifiers of pointers If the identifier is a pointer then the qualifiers affect the storage location of the pointer i e the qualifiers are added between the most right and the identifier int gt gt gt qualifiers are added here lt lt lt p 123 C to Hardware Compiler User Manual Restriction of this syntax e Itis not possible to qualify the memory a pointer points to 124 Chapter 11 Glossary ASP ASP mode CHC Compiler C to RTL compiler C to Hardware compiler Dataflow pipeline Embedded compiler External interface HASM HDL Hardware function HW SW mode Initiation interval Latency MIL Operating mode Output parameter Pipeline Application Specific Processor The ASP is placed as a component WB_ASP on the FPGA design This component can contain one or more hardware functions An o
189. s lt s2 0 if s1 s2 or gt 0 if s1 gt s2 94 Libraries string h wehar h Description strcmp s1 s2 wescmp s1 s2 Compares string s7 to s2 Returns lt 0 if s1 lt s2 Oif s s2 or gt 0 if s7 gt s2 strncmp s1 s2 n strcoll s1 s2 strxfrm sl1 s2 n Search functions string h wcsncmp s1 s2 n wescoll s1 s2 wesxfrm sl1 s2 n wcehar h Compares the first n characters of s7 to the first n characters of s2 Returns lt 0 if s1 lt s2 0 if s1 s2 or gt 0 if s1 gt 82 Performs a local specific comparison between string s1 and string s2 according to the LC_COLLATE category of the current locale Returns lt 0 if s1 lt s2 0 if s1 s2 or gt 0 if s1 gt s2 See Section 7 2 12 locale h Transforms a local string s2 so that a comparison between transformed strings with strcmp gives the same result as a comparison between non transformed strings with st rcol11 Returns the transformed string s7 Description memchr s c n strchr s c strrchr s c strspn s set strcespn s set strpbrk s set strstr s sub strtok s dim wmemchr s c Nn wceschr s Cc wesrchr s c wcesspn s set wcescspn s set wcespbrk s set wesstr s sub westok s dlm Miscellaneous functions string h memset s c n strerror errno strlen s wcehar h wmemset s c
190. s Converts a multibyte character s to a wide character pwc according to conversion state wcertomb s wc ps btowc c wctob c mbrlen s n ps 7 2 26 wctype h ps See also mbtowc in Section 7 2 22 stdlib h and wchar h Converts a wide character wc to a multi byte character according to conversion state ps and stores the multi byte character in s Returns the wide character corresponding to character c Returns WEOF on error Returns the multi byte character corresponding to the wide character c The returned multi byte character is represented as one byte Returns EOF on error Inspects up to n bytes from the string s to see if those characters represent valid multibyte characters relative to the conversion state held in ps Most functions in wct ype h represent the wide character variant of functions declared in ct ype h and are discussed in Section 7 2 3 ctype h and wctype h In addition this header file provides extensible locale specific functions and wide character classification wctype property iswctype wc desc Constructs a value of type wct ype_t that describes a class of wide characters identified by the string property lf property identifies a valid class of wide characters according to the LC_TYPE category see Section 7 2 12 locale h of the current locale a non zero value is returned that can be used as an argument in the iswctype function Tests whether the wide character wc is a
191. s should be compiled to hardware The CHC compiler also reads a linker script language file LSL file An LSL file describes the target architecture in terms of memory spaces and buses information that is required to link and locate software and data sections The LSL files are generated by Altium Designer based on the components placed on the schematic sheet the interconnection between components and the component configuration setting you have specified when building the schematic sheets The result of the compilation phase are one or more hardware assembly files 1 3 2 Hardware Assembly HASM and Assembling Hardware Assembly HASM in short is a language for describing digital electronic circuits It is the hardware equivalent of a regular assembly language Typically you will not read or edit HASM files as they are processed automatically in the background when you compile a project HASM files are generated by the CHC compiler and are further transformed by the hardware assembler The HASM language defines a rigid and specialized execution model that suits the needs of a compilation system that translates C into hardware description languages such as VHDL or Verilog HASM is a higher level language than VHDL and Verilog a shorter notation for a restricted functionality The syntax of the language is derived from traditional assembly languages for processor cores that support instruction level parallelism The semantics of the language
192. s and memory The compiler tries to construct a high performance memory system based on the characteristics of both the source code and the targeted FPGA device The FPGA device characteristics are defined in a resource definition file and in an linker description language file LSL file To exploit the bandwidth the compiler tries to benefit from concurrent memory access wherever possible For this the CHC compiler needs to know the available memories and their buses The compiler uses this information to divide data objects between these memories in such a way that it benefits the most from concurrent memory accesses Furthermore the compiler calculates the maximum size needed for each memory and minimizes the number of address lines needed for memory access in the final hardware assembly output The compiler allocates variables of integral and float types whose address is not taken in registers Variables whose address is taken are allocated in memory Large data structures and arrays are typically allocated in memory However based on the characteristics of the C source code the CHC compiler can allocate individual structure and array members in registers The compiler analyzes variable access and pointer dereference patterns Based on this analysis the variables and pointers are grouped in parallel accessible clusters Data objects allocated in different clusters can be accessed concurrently Clusters that contain data that cannot be accessed
193. s and the return value No control signals such as CLOCK or RESET are created The generated hardware is combinatorial If the compiler cannot create a combinatorial circuit to implement the C program then the compiler will issue an error 31 C to Hardware Compiler User Manual Bus parallel wishbone wishbone single nios_ci Description A parallel multi cycle interface is used for communication with the external environment Ports are created for all function parameters and the return value The following control signals are created CLOCK RESET RESET_DONE START and DONE You can apply this calling convention to any function independent of the number of parameters the types of the parameters and return value and the complexity of the function A Wishbone multiple bus cycles interface is used for communication with the external environment The function parameters and the return value as well as the START and DONE signals are passed via the Wishbone bus The parameters return value and START and DONE signals are mapped in a static stack frame i e a consecutive set of addressable storage locations The CLOCK and RESET signals are mapped at the Wishbone CLK_I and RST_I signals The RESET_DONE signal is not available through this interface The number of Wishbone cycles required to pass the data depends on the number and types of the parameters You can apply this calling convent
194. s are shown in the following tables e Size mem lists the size of the object when stored in memory e Size reg lists the size of the object when stored in a register 21 C to Hardware Compiler User Manual The CHC compiler tries to minimize the size of a data object based on the use of the variable in the source code thus saving the number of flip flops and number of wires that need to be instantiated in the hardware This optimization does not affect the return value of the sizeof operator ISO C99 data types in 32 bit mode C Type Size mem Size reg Align Limits _Bool 8 1 8 Oor1 signed char 8 lt 8 8 0x80 0x7F unsigned char 8 lt 8 8 0 OxFF short 16 lt 16 16 Ox8000 0x7FFF unsigned short 16 lt 16 16 0 OxFFFF wchar_t int 32 lt 32 32 Ox80000000 0x7FFFFFFF unsigned int 32 lt 32 32 0 0oxFFFFFFFF 8 1 8 Oor1 enum 8 lt 8 8 0x80 0x7F 32 lt 32 32 0x80000000 0x7FFFFFFF long 32 lt 32 32 0x80000000 0x7FFFFFFF ptrdiff_t unsigned long 32 lt 32 32 0 0xFFFFFFFF size_t 0x8000000000000000 rong tong ed il a 0X7FFFFFFFFFFFFFFF unsigned long long 64 lt 64 32 0 OxFFFFFFFFFFFFFFFF PR 3 402E 38 1 175E 38 float 23 bit mantissa 32 32 32 1 175E 38 3 402E 38 double 64 64 32 1 798E 308 2 225E 308 long double 52 bit mantissa 2 225E 308 1 798E 308 pointer 32 lt 32 32 0 0oxFFFFFFFF ISO C9
195. s in the object file as an alias for another symbol For example volatile static int __a extern int b __attribute__ weak alias __a _ export _ rtl int entry_point void 40 C Language Implementation return b declares a to be a weak alias for __a const You can use __attribute__ const to specify that a function has no side effects and will not access global data This can help the compiler to optimize code See also attribute pure The following kinds of functions should not be declared __ const__ A function with pointer arguments which examines the data pointed to A function that calls a non const function export You can use ___attribute__ export to specify that a variable function has external linkage and should not be removed by the compiler When option not static is not specified the compiler treats external definitions at file scope as if they were declared static As aresult unused variables functions will be eliminated and the alias checking algorithm assumes that objects with static storage cannot be referenced from functions outside the current module int i __attribute__ export i has external linkage format type arg_string_index arg_check_start You can use ___attribute__ format type arg_string_index arg_check_start to specify that functions take printf scanf strftime or strfmon style arguments and that calls to these functions must be type check
196. se as argument to the set vbuf function Size of the string used to hold temporary file names 8 tmpxxxxx Maximum number of unique temporary filenames that can be generated 0x8000 Expand to an integer expression suitable for use as the third argument to the fseek function Expressions of type pointer to FILE that point to the FILE objects associated with standard error input and output streams 87 C to Hardware Compiler User Manual File access stdio h Description fopen name mode Opens a file for a given mode Available modes are tet read open text file for reading w write create text file for writing if the file already exists its contents is discarded wan append open existing text file or create new text file for writing at end of file r open text file for update reading and writing w create text file for update previous contents if any is discarded a append open or create text file for update writes at end of file fclose name Flushes the data stream and closes the specified file that was previously opened with fopen fflush name If stream is an output stream any buffered but unwritten date is written Else the effect is undefined freopen name mode stream Similar to fopen but rather than generating a new value of type FILE the existing value is associated with a new stream setbuf stream buffer If buffer is NULL buffering is turned off for the stream Otherwise setbuf is equiva
197. sented as they are characters for prototypes alphas betas are represented by 1 Examples v1 0r1 gt 1 v1 0rb gt 1 __SINGLE_FP__ Expands to 1 if you used option no double Treat double as float otherwise unrecognized as macro _ STDC __ Identifies the level of ANSI standard The macro expands to 1 if you set option language Control language extensions otherwise expands to 0 __STDC_HOSTED__ Always expands to 0 indicating the implementation is not a hosted implementation __STDC_VERSION__ Identifies the ISO C version number Expands to 199901L for ISO C99 or 199409L for ISO C90 __TASKING__ Identifies the compiler as a TASKING compiler Expands to 1 _ TIME__ Expands to the compilation time hh mm ss __VERSION__ Identifies the version number of the compiler For example if you use version 2 1r1 of the compiler _ VERSION __ expands to 2001 dot and revision number are omitted minor version number in 3 digits __TSK3000__ Expand to 1 if the CHC is compatible with the TSK3000 processor and compiler option __C3000__ Cc3000 When necessary Altium Designer sets this option automatically __PPC__ Expand to 1 if the CHC is compatible with the Power PC processor and compiler option __CPPC__ Ccppc When necessaryAltium Designer sets this option automatically __ARM__ Expand to 1 if the CHC is compatible with the ARM processor and compiler option Ccarm __CARM__ When ne
198. sm Understanding Parallelism This chapter is a brief introduction on writing software for high performance processing architectures Because a translation to hardware yields the best results if many instructions can be executed simultaneously it is necessary to have a good understanding of parallelism The issues in this chapter are independent of the execution environment it is valid for C to Hardware compilation but also for execution environments like DSPs or superscalar RISC processors The term instruction is associated with traditional processor cores It defines the action that is carried out for example mul div add and its operands for example an immediate value a register name or a reference to a memory location In this section we use the term operation to refer to the instructions that are executed by the electronic circuit created by the CHC compiler An operation defines the action that is carried out for example mul divide add as well as its operands The CHC compiler creates small and fast electronic circuits only if the C source is parallelizable So you need to understand the factors that inhibit parallelism so you can avoid them Once operations are performed concurrently the bandwidth of memory system that feeds data to the functional units usually becomes a bottleneck You need to understand the issues that restrict memory bandwidth and the methods to increase memory bandwidth Granularity The term
199. so Section 3 7 Memory and Memory Type Qualifiers 1 3 4 HDL Generation The non relocatable ELF file is transformed into a hardware design language HDL This is done by the HDL generator hdlhc The HDL generator can generate VHDL extension vha and or Verilog extension v C to Hardware Compiler User Manual 1 4 Shared Data An FPGA design may contain both software functions i e instructions stored in memory and fetched and executed by a soft processor core and hardware functions an ASP or C Code Symbol Such software and hardware functions may share data Also hardware functions may share data with other hardware components such as a display driver The figure below shows a schematized design containing a soft core an application specific processor ASP and several memory devices See also the FPGA design created in the tutorial TU0130 Getting Started with the C to Hardware Compiler See Figure 1 2 FPGA with Soft core ASP and Memory The physical memories displayed can be e Accessible from the soft core only e Accessible from the ASP only or Shared memory that is accessible from both the soft core and the ASP Notice that physical memories can either be implemented on the FPGA chip this type of memory is typically called Block RAM or can be implemented outside the FPGA Soft Core software functions ASP __mem1 Memory bus Block RAM __ mem2 Block RAM
200. so Section 7 2 14 math h and tgmath h The following functions are only available for ISO C90 copysignf float f float s Copies the sign of the second argument s to the value of the first argument f and returns the result 80 Libraries copysign double d double s Copies the sign of the second argument s to the value of the first argument d and returns the result isinff float f Test the variable fon being an infinite IEEE 754 value isinf double a Test the variable d on being an infinite IEEE 754 value isfinitef float f Test the variable fon being a finite IEEE 754 value isfinite double d Test the variable don being a finite IEEE 754 value isnanf float f Test the variable fon being NaN Not a Number IEEE 754 isnan double d Test the variable d on being NaN Not a Number IEEE 754 scalbf float f int p Returns f 2 p for integral values without computing 24N scalb double d int p Returns d 24p for integral values without computing 2 N See also scalbn in Section 7 2 14 math h and tgmath h 7 2 8 inttypes h and stdint h The header files stdint h and inttypes h provide additional declarations for integer types and have various characteristics The stdint h header file contains basic definitions of integer types of certain sizes and corresponding sets of macros This header file clearly refers to the corresponding sections in the ISO C99 standard The inttypes h header file includes stdint h
201. t program which is callable from an __rt1 qualified function in the current project To interface with an__ import qualified function the compiler adds the required signals to the top level entity The __ import qualifier must be used in combination with the __rt1 and _ cc qualifier on function prototypes The imported function must have been defined elsewhere You can use ___ import also as a data type qualifier on variables of scalar type in combination with ___ port and __ ro to indicate that the variable must appear as an input port on the C Code Symbol __CC bus modifier For each function that should be compiled to hardware a __cc calling convention qualifier is necessary The __cc qualifier is applicable to function definitions and prototypes and describes the call interface to the external environment that is it describes the ports through which the hardware functions can be accessed from the external environment The semantics of each signal and the timing of the signals as a group is fully defined via this qualifier The __cc qualifier must be used in combination with the __rt1 and __export qualifiers and has the following syntax CC bus modifier where bus specifies the interface of the function to its external environment Possible values are Bus Description combinatorial A parallel combinatorial interface is used for communication with the external environment Ports are created for all function parameter
202. t_sw4 10 ist_sw5 main teset_backgrounds General Properties sw_find_edges Extra space Component Designator ASP sw_luma Visible Manage Signals Figure 4 2 Configure OpenBus ASP dialog 2 Enable both option Generate ASP and option Use ASP from Software This will effectively invoke the CHC compiler when you build and synthesize your project You can disable the option Use ASP from software to test your project without calling the hardware compiled functions In this case all hardware will be generated but because the embedded software compiler is now told to compile these functions to software the software variant of the functions are called during execution Note that this does not work if you typed the function qualifier __rt1 in your source code by hand Invoking the CHC compiler is only useful if functions are selected to translate to hardware As explained in Section 3 6 Function Qualifiers and Data Type Qualifiers you can either manually mark these functions in the C source with the function qualifier ___rt1 However you can also select them in this dialog 3 Inthe Symbols in Hardware section in the lower part under the Implement in Hardware column select the functions that should be translated to hardware If a hardware function is called by a software function mark it as Export to Software too This is the equivalent of the export function qualifier 4 Inthe Symbols in Hardware section in the upper part
203. tdin ungetc c stream fputc c stream putc c stream putchar c stdout fputs s stream puts s Direct input output stdio h getwc stream getwchar stdin fgetws s n stream ungetwc c stream fputwc c stream putwc c stream putwchar c stdout fputws s stream Description Same as fgetc fgetwc except that is implemented as a macro NOTE Currently defined as getchar getwchar because FILE I O is not supported Returns the read character or EOF WEOF on error Reads one character from the stdin stream Returns the character read or EOF WEOF on error Implemented as macro Reads at most the next n 1 characters from the stream into array s until a newline is found Returns s or NULL or EOF WEOF on error Reads at most the next n 1 characters from the st din stream into array s A newline is ignored Returns s or NULL or EOF WEOF on error Pushes character c back onto the input stream Returns EOF WEOF on error Put character c onto the given stream Returns EOF WEOF on error Same as fpuc fputwc except that is implemented as a macro Put character c onto the st dout stream Returns EOF WEOF on error Implemented as macro Writes string s to the given stream Returns EOF WEOF on error Writes string s to the stdout stream Returns EOF WEOF on error fread ptr size nobj stream Reads nobj members of size bytes from the given stream into the array poi
204. te Address at cccccccececaeceee cece eens eeeeeeeeseeeeeeeeeeeeeaeeeeaees 38 3 8 AUMDULGS eiin xoneebda sche tended sant Ge rajenana He E E R oqadedd es tenaia E A sa wibie nolaasha E E Maria nome 39 SOA EIDPAN GS ornina onana n OTA E E E E saad ana uapeagnaadedamenn E a aE Ea EAS E E anes EEEE 43 4 Using the CHC Compiler 0 00 0 EE EE EEE nee etre et eea ee ee eens eteggs 45 4 1 CHC Compiler Options ieina aana aa da re E EA ae badd AAE EERE ESE EEEE EE EEEE 45 4 2 GHC Compiler Operating Modes csssrsisiireceiiriri iii vend veda wens deci weed edna vi na cota aiai rnia cue K TE ANNE vende wets 45 42 1 ASP Operating ModE sssini beaa ana nE a E a E EES EA OEE ER EOR E 46 4 2 2 Default Operating Mode 20 0 0 EE EE nine ee trent neat 48 4 3 Entry Points and Startup Code ssusccccksecciweg cheated anaa bute oueedance A aoa aE EE aa a Ena E eaaa aa EE oaa 50 4 4 Simulating the Compiler Outputs issctcscccseraseienenssieoneieakced aaien KE aR a a ERENER ANENE REE EARE E 51 4 5 Synthesizing the Compiler Output eseeeseseeeesesenererertrtsttttttttsrtrtttttstttttttttrert eee ened eee esata eeaeeaeeaeeaeeaeeas 51 4 6 How the Compiler Searches Include Files ccceceeeeeee nee ee eee teen ee ee nese een e eaten esas deta eeaeeaeeaeeaeeaeeaeeaeeaeeaes 52 4 7 How the Compiler Searches the C library ceeee cece cece eee eee eee eee eter eee e a eee EEEE rnEeE et eee eeeeeeeeeeee es 52 4 8 Rebuilding the
205. ter is typically placed between the memory and the components CHC does not instantiate arbiters for internal ___ export qualified memories However it is guaranteed that the hardware function does not drive the signals of the memory s interface unless it performs a read or write operation As a result an external component can safely access the memory during the time intervals that the hardware function is not active 2 4 3 Timing Diagram of the Memory Interface CLOCK A S FAT A Se Ne aa ee a ee ee WE e DIN ADR SEL Memory content DO O sola WT tola t3 MO MEM A MEM B MEM C External dual ported memories shall support READ_FIRST Xilinx terminology behavior Altera uses the term OLD_DATA for this purpose This means that if data is read from and written to the same address then the value of DO is the old data stored in memory ADR and not DIN External single ported memories may exhibit either READ FIRST or WRITE_FIRST behavior The generated hardware function may not function properly if these requirements are violated 2 4 4 Memory Interface Signals The CHC compiler supports single ported dual ported and true dual ported memories Access to single ported memory is supported via either a memory or a Wishbone interface Access to dual ported and true dual ported memory is supported via a Memory interface CHC generated hardware expects that both memory read and write cycles through the memory interface take o
206. the C library are reentrant others are not The table below shows the functions in the C library and whether they are reentrant or not A dash means that the function is reentrant Note that some of the functions are not reentrant because they set the global variable errno or call other functions that eventually set errno If your program does not check this variable and errno is the only reason for the function not being reentrant these functions can be assumed reentrant as well The explanation of the cause why a function is not reentrant sometimes refers to a footnote because the explanation is too lengthy for the table Function _close _dofit _doprint _doscan _Exit _filbuf _flsbuf _getflt _iob _lseek _open _read _unlink _write abort abs labs llabs access acos acosf acosl acosh acoshf acoshl asctime asin asinf asinl asinh asinhf asinhl atan atanf atanl atan2 atan2f atan21 atanh atanhf atanhl atexit atof atoi atol bsearch btowc cabs cabsf cabsl cacos cacosf cacosl cacosh cacosh cfacoshl calloc Not reentrant because Uses global File System Simulation buffer fss_buffer Uses O functions which modify iob See 1 Uses indirect access to static iob array See 1 Uses indirect access to iob and calls ungetc access to local static ungetc buffer See 1 See exit Uses iob See 1 Uses iob See 1 Uses iob See 1 Defines static iob
207. the caller will block until the callee is finished Without the ack modifier the caller of an external function needs to be certain the callee is in the idle state Before the caller asserts the START signal the ack modifier is therefore always added for external functions in Altium Designer that do not have the start_on_edge It is not the default as it adds a little bit of overhead that is not needed for internal functions This parameter is only possible in combination with a __CC parallel qualifier and cannot be used together with the start_on_edge or register_outputs modifier Indicates that the caller will not wait until the hardware function returns but causes the caller to proceed immediately once the callee has consumed the input parameters As a result the caller and the callee can run in parallel The DONE pulse is given at the start of the function or for a wishbone single cycle interface the transaction is acknowledged when the function is started that is when the function s state machine goes from idle to busy This parameter is only possible in combination with a parallel busora wishbone single bus and cannot be used together with the register_outputs modifier Use this modifier to pipeline a function You can add modifiers to configure the pipeline Cc bus pipeline allow_stalls ii range latency range This pipeline modifier is only possible in combination with a parallel bus or a wishbone single b
208. the declaration of the static iob can use the standard file handles stdin stdout and stderr which are the first three entries in icob Thus all I O for these three file handles should be located in one module 2 errno declaration Several functions in the C library set the global variable errno After completion of the function the user program may consult this variable to see if some error occurred Since most of the functions that set errno already have a return type this is the reason for using errno it is not possible to check successful completion via the return type The library routines can set errno to the values defined in errno h See the file errno h for more information errno can be set to ERR_FORMAT by the print and scan functions in the C library if you specify illegal format strings errno will never be set to ERR_NOLONG or ERR_NOPOINT since the CHC C library supports long and pointer conversion routines for input and output errno can be set to ERANGE by the following functions exp strtol strtoul and tan These functions may produce results that are out of the valid range for the return type If so the result of the function will be the largest representable value for that type and errno is set to ERANGE errno is set to EDOM by the following functions acos asin log pow and sqrt If the arguments for these functions are out of their valid range e g sqrt 1 errno is set to EDOM e
209. the pipeline The pipeline produces an output L clock cycles after consuming an input The specified range is an expression for unbound an exact value 3 or 3 3 aminimum 3 amaximum 3 orarange 3 5 The default value is 1 If the pipeline scheduler cannot achieve the specified latency an error is issued pragma macro pragma nomacro on off default restore Enable or disable macro expansion pragma message message Print the message string s on standard output Arguments are first macro expanded pragma nomisrac nr default restore Without arguments this pragma disables MISRA C checking Alternatively you can specify a comma separated list of MISRA C rules to disable pragma optimize flags default restore pragma endoptimize You can overrule the default compiler optimization for the code between the pragmas optimize and endoptimize 28 C Language Implementation The pragma uses the following flags that are similar to compiler options for Optimization in embedded toolsets coalesce a A Coalescer remove unnecessary moves outparams b B Consider pointer access to function parameters as return value s and pass them via registers if possible This optimization is always performed for C Code Symbols when the compiler runs in default operating mode even when the pragma optimize 0 or compiler option optimize 0 is set See also attribute __out cse c C Common sub
210. the specified range With this modifier set the return values are valid until the function is started again Without this modifier the output values are only guaranteed to be valid in the clock cycle when the function s state machine returns from the busy to the idle state that is when the DONE signal is asserted With this modifier set the behavior of the DONE signal is altered The DONE signal is high when the function is idle and low when the function is busy It is lowered when the function s state machine goes from the idle state to the busy state and is raised when the function returns from the busy to the idle state Note that a function can only be called when it is in the idle state that is one clock cycle after the DONE signal is raised This means the register_outputs modifier should not be used in combination with the ack nowait or pipeline modifier This parameter is only possible in combination with a __CC parallel qualifier 33 C to Hardware Compiler User Manual Modifier Description start_on_edge By default a function starts on a high signal level of the START control pin if the function is in the idle state With the start_on_edge modifier set a rising edge detection circuit with two flip flops is generated for the internal start signal so that the function starts on a rising edge Note that if a function is not in the idle state the rising edge is missed The usual design pattern keep start high and parameters
211. this is encoded in the N field of the custom instruction opcode If you do not specify num the compiler automatically assigns a number 16 External Interface For each hardware function 8 additional opcodes are reserved for parameter passing The value of the N field of the opcodes used for parameter exchange are in the range num 8 num 1 8 1 So 8 2 2 18 parameters can be passed via the custom instruction interface to an hardware function If the compiler option nios header is set the compiler creates a header file that contains the custom instructions to call the hardware function Example __ export __CC nios_ci long add32 long a long b return a b __ export _ CC nios_ci char add8 char a char b return a bj The following header file is generated inline signed char add8 signed char a signed char b return signed char __builtin_custom_inii 0 int a int b inline long signed int add32 long signed int a long signed int b return long signed int __builtin_custom_inii l int a int b The following VHDL top level entity is generated entity c_root_nios is port dataa IN std_logic_vector 31 downto 0 datab IN std_logic_vector 31 downto 0 clk IN std_logic clk_en IN std_logic reset IN std_logic start IN std_logic n IN std_logic_vector 7 downto 0 done OUT std_logic result OUT std_logic_vector 31 downto 0 end c_root
212. tions with variable number of arguments shall not be used Functions shall not call themselves either directly or indirectly A violation will be reported for direct or indirect recursive function calls in the source file being checked Recursion via functions in other source files or recursion via function pointers is not detected Function prototypes shall be visible at the definition and call The function prototype of the declaration shall match the definition Identifiers shall be given for all prototype parameters or for none Parameter identifiers shall be identical for declaration definition Every function shall have an explicit return type Functions with no parameters shall have a void parameter list An actual parameter type shall be compatible with the prototype The number of actual parameters shall match the prototype The values returned by void functions shall not be used Void expressions shall not be passed as function parameters const should be used for reference parameters not modified A function should have a single point of exit Every exit point shall have a return of the declared return type For void functions return shall not have an expression Function calls with no parameters should have empty parentheses If a function returns error information it should be tested A violation is reported when the return value of a function is ignored include shall only be preceded by other directives or comments Non
213. tivates the c_root component First it resets and then activates component c_root by asserting the act signal The pcls_driver component also generates the clock signal When the c_root component finishes it asserts its done signal When this happens the pcls_driver prints the number of clock cycles consumed by the c_root component Component put char implements the C library function __ put char This function prints characters using the facilities of the textio package in the VHDL std library Example main c printf It s a strange world Invocation che main c lib libc ma omain vhdl When you load the files pcls_driver vhdl and main vhdl in your VHDL simulator and simulate the test_bench entity you will see the text It s a strange world in the simulator s text output window See also the file System Tasking chc lib src cstart c The file cstart c contains the startup code that is executed before the main function is called The test driver expects that all memory devices are created by the compiler If you specify in the LSL file that the compiler generated circuit interfaces with extern memory then the pcls_driver should be modified and provide an interface to the memory 4 5 Synthesizing the Compiler Output The generated RTL is formatted in accordance with design guidelines provided by Altera Altium Synplicity and Xilinx synthesis tools FPGA device specific building blocks are automatically in
214. tting a Dataflow Pipeline Stage in Two Parallel Stages Design pattern e Use the information provided in the CHC compiler report file If one or more states in a pipeline cannot meet timing requirements split the pipeline into two parallel operating pipelines Example Location Examples Soft Designs C to Hardware VGA Video This feature is demonstrated in example chc_vga_video PrjFpg All stages in the pixel processing pipeline of this design shall complete their operations within seven clock cycles to stay in sync with the camera output rate 1 Build the project and Also open the Code Explore to facilitate quick navigation within this file 2 Open the report file by clicking on the yellow marker that is visible in the Compile steps drop down of the Devices View 74 Design Patterns F Compile a A Synthesize Compile chc_vga_video ic Generate HDL for chc_vga_ a Open Report File Also open the Code Explorer to facilitate quick navigation within this file Select the Code Symbol of interest e g contrast_filter_u_contrast_filter rpt and navigate to the Resource Usage HEHEHE HE HEHEHE HE HH EEE HE HHH HE HH HH EH HE HEH HE HH HH EH HH HE EE HH HE EH HH HE EE EE HE EEE HE Resource Usage HE aE a HH AE FE a EE EEE EE EE EE EE EE EEE EE FE FE AE HE EE EEE HE EEE EE HEE EE EE contrast_filter calling convention parallel multi cycle entry point states 5 registers 124 bits clock cycl
215. ttributes that do not already start with an underscore __align value You canuse___attribute__ __align n to change the alignment of objects The alignment must be a power of two _ out You can use the attribute__out to qualify a function parameter With the attribute__out you force the CHC compiler to treat a function parameter with pointer type as an extra return value The caller cannot pass data via an __out qualified parameter to the callee The callee can pass data back to the caller via an ___ out qualified parameter In this case the compiler tries to pass the variable via registers If this is not possible the compiler issues an error The return value is asserted when the function returns this is not the case for __out qualified parameters their value is asserted on each assignment also the value remains asserted after function return See the first timing diagram in Section 2 3 1 Timing Diagrams of the Parallel Bus Interface The compiler issues an error message when you try to write to the pointer offset or when you also read the indirected pointer __ export void add int8_t a uint8_t b __out intl6_t sum sum 1 3 writing to pointer offset is illegal sum a b reading from indirected pointer is illegal 39 C to Hardware Compiler User Manual __role With attribute __role you can map function parameters on specific hardware interface signals see also Section 2 2 Pins The _ role attr
216. unctions for manipulating strings By convention strings in C are arrays of characters with a terminating null character Most functions therefore take arguments of type char However many functions have also parallel wide character functions which take arguments of type wchar_t These functions are declared in wchar h Copying and concatenation functions string h wehar h Description memcpy s1 s2 n memmove s1 s2 n strcpy s1 s2 strncpy sl1 s2 n streat sl s2 strncat sl s2 n Comparison functions string h wmemcpy s1 s2 n wmemmove sl s2 n wescpy s1 s2 wesncpy s1 s2 n wescat sl1 s2 wesncat s1 s2 n wchar h Copies n characters from s2 into s7 and returns s1 If s1 and s2 overlap the result is undefined Same as memcpy but overlapping strings are handled correctly Returns s1 Copies s2 into s1 and returns s1 If s1 and s2 overlap the result is undefined Copies not more than n characters from s2 into s1 and returns s1 If s1 and s2 overlap the result is undefined Appends a copy of s2 to s7 and returns s7 If s7 and s2 overlap the result is undefined Appends not more than n characters from s2 to s7 and returns s7 If s1 and s2 overlap the result is undefined Description memcmp s1 s2 n wmemcmp s1 s2 n Compares the first n characters of s7 to the first n characters of s2 Returns lt 0 if
217. under the Allocate in Hardware column select the data objects that should be allocated by the CHC compiler These data objects will be allocated in fast accessible Block RAM This is the equivalent of the __ export function qualifier The selections you make in this dialog are passed via a qualifier file to the CHC compiler In this particular case the content of the qualifier file Edge_Detection qua is hw_abs lt __rt1 gt hw_find_edges lt __rtl export __CC wishbone 0 gt hw_luma lt __rt1 gt hw_cache0 lt __rtl_alloc gt hw_cachel lt __rtl_alloc gt hw_cache2 lt __rtl_alloc gt 47 C to Hardware Compiler User Manual The CHC compiler and the embedded compiler will patch these qualifiers into the source code when the source code is parsed By using this mechanism the original source code remains unmodified The syntax of the qualifier file is described in Chapter 10 CHC Qualifier File Format Double click on the OpenBus interconnect the SRAM and SHARED_MEM components show how the connections between the core and memories are defined The configuration data specified in these dialogs is passed via the LSL file to both the CHC and embedded tools The LSL file is created automatically by Altium Designer 4 2 1 1 ASP Mode Compilation Process CHC toolset invocation The following tool invocations are extracted form the makefile Examples Soft Designs C to Hardware Edge Detection Embedded EmbOut ChcOutputs edge_dete
218. urn value is assigned to another variable in the caller the memory location mentioned above can be referenced only through the function return value e g if the pointer value is saved into another global variable in the call the function is not qualified for the malloc attribute 41 C to Hardware Compiler User Manual The lifetime of the memory location returned by such a function is defined as the period of program execution between a the point at which the call returns and b the point at which the memory pointer is passed to the corresponding deallocation function Within the lifetime of the memory object no other calls to malloc routines should return the address of the same object or any address pointing into that object noinline You can use __attribute__ noinline to prevent a function from being considered for inlining Same as keyword __noinline or pragma noinline always_inline With attribute__ always_inline you force the compiler to inline the specified function regardless of the optimization strategy of the compiler itself Same as keyword inline or pragma inline noreturn Some standard C function such as abort and exit cannot return The C compiler knows this automatically You can use __attribute__ noreturn to tell the compiler that a function never returns For example void fatal __attribute__ noreturn void fatal Print error message exit 1 The function fat
219. us and cannot be used together with the register_outputs or start_on_edge modifier See Section 5 3 Pipelining Without this modifier one input will be consumed and one output will be produced every iih clock cycle where iiis the initiation interval with a default of i i 1 The first output is produced after L clock cycles where L is the pipeline latency However the compiler may not be able to create such a schedule for every C function in which case an error message is given If the allow_stalls modifier is set the compiler may create a schedule that stalls during one or multiple clock cycles If stalls are allowed the DONE signal notifies the caller that the function s inputs are consumed Specifies the allowed range for the generated initiation interval i The default initiation interval is the minimum ji the compiler can create range can be an exact value or the notation min max can be used to provide an inclusive range for unbound an exact value 3 or 3 3 aminimum 3 a maximum 3 orarange 3 5 Specifies the allowed range for the latency L of the generated pipeline The pipeline produces an output L clock cycles after consuming an input range can be an exact value or the notation min max can be used to provide an inclusive range for unbound an exact value 3 or 3 3 aminimum 3 a maximum 3 orarange 3 5 The compiler issues an error when it cannot create a schedule with a latency of
220. using a header file With the __ noinline keyword you prevent a function from being inlined __noinline unsigned int abs int val unsigned int abs_val val if val lt 0 abs_val val return abs_val 35 C to Hardware Compiler User Manual Using pragmas inline noinline smartinline Instead of the inline qualifier you can also use pragma inline and pragma noinline to inline a function body pragma inline unsigned int abs int val unsigned int abs_val val if val lt 0 abs_val val return abs_val pragma noinline void main void int i i abs 1 If a function has an inline __noinline function qualifier then this qualifier will overrule the current pragma setting With the pragma noinline pragma smartinline you can temporarily disable the default situation that the C compiler automatically inlines small functions 3 7 Memory and Memory Type Qualifiers 3 7 1 Introduction Traditional processor cores provide a fixed set of hardware resources which are described in the processor s data books High performance processor cores including most signal processors implement multiple memory spaces to enable the processor core to access multiple data objects within a single clock cycle Parallel access to data is required to keep the processor core s functional units busy Programmable hardware offers an abundance of functional units and as a result the memory system is often the per
221. ut is predefinedas__ port __export __ro so the semantics of the separate qualifiers attributes apply Example C source document __ output bool LEDO __ output bool LED1 __input bool BUTTON 3 6 2 Inlining Functions inline ___noinline During compilation the C compiler automatically inlines small functions in order to reduce interconnect overhead smart inlining The compiler inserts the function body at the place the function is called If the function is not called at all the compiler does not generate code for it The C compiler decides which functions will be inlined You can overrule this behavior with the two keywords inline or__inline in C90 mode and __noinline You can also use this qualifier in combination with the __ rt 1 qualifier The inlined function then is integrated in the same hardware component as its caller With the inline keyword you force the compiler to inline the specified function regardless of the optimization strategy of the compiler itself inline unsigned int abs int val unsigned int abs_val val if val lt 0 abs_val val return abs_val You must define inline functions in the same source module in which you call the function because the compiler only inlines a function in the module that contains the function definition When you need to call the inline function from several source modules you must include the definition of the inline function in each module for example
222. ware All C programs can be converted to an electronic circuit by the CHC compiler However the characteristics of the program ultimately determine whether the CHC compiler can create an efficient hardware component or not The CHC compiler can only create a small and fast electronic circuit if the C source code is parallelizable in such cases the hardware executes many operations in parallel Graphics signal processing filter and encryption algorithms typically translate very well to hardware For these types of algorithms C based FPGA implementations outperform high end DSP and RISC processor cores 1 3 Toolset Overview The figure below shows the CHC toolset right and its relation to a regular embedded toolset left The use of both toolsets is required to create an Application Specific Processor ASP The term ASP identifies a set of hardware functions that are created to off load time consuming functions from an embedded core into FPGA hardware To compile C Code Symbols only the right part of the figure applies A C Code Symbol is an electrical design primitive The behavior of this primitive is described in C language It may but in opposition to an ASP does not have to interact with an embedded core generated from GUI settings generated from schematic C source file s qualifier file resource file linker script file wey oh qua peu sisi Pa ae Se ae Sse ke C compiler C libr
223. wnto 0 carries the return value of entry_point START in std_logic triggers the start of entry_point called_func_DONE in std_logic signals the return of called_func called_func_RETVAL in std_logic_vector 2 downto 0 tranmits the return value of called_func called_func_START out std_logic triggers the start of called_func called_func_par_cf out std_logic_vector 2 downto 0 carries the value of parameter par_cf p_in in std_logic_vector 2 downto 0 carries the value of input p_in par_ep in std_logic_vector 2 downto 0 carries the value of parameter par_ep i end entity c_root Signal RESET_DONE is optional if option init mem on reset is not specified the signal is omitted Memory initialization may take up several clock cycles if memory initialization is omitted then the reset is done on the clock up event following the release of RESET 2 2 Pins A pin is the word used here for a port on the top level entity It has three properties 1 Name 2 Width at least one wire but it can also be a bus 3 Role the part it plays in the CHC interface protocol An interface element results in one or more pins being added to the top level entity A pin can be user specified or it can be a control pin User specified pins are function parameters return values or ports Control pins are pins with a special role needed for the protocol spo
224. xecute the hardware function There are restrictions on the function s prototype The function s prototype must be return_type function __role in type_d DAT __role address type_a ADR __role byte_select type_s SEL __role we type_w WE The __ role attribute specifies how parameters are mapped on Wishbone signals __ role byte_select is optional this parameter may be omitted For example uint32_t countbits __role in __uint32_t DAT __role address uintl_t ADR __role byte_select uint4_t SEL __role we uintl_t WE Signals are mapped as follows where the width of the buses corresponds to the bit width of the parameters and the bit width of the return type In the countbits example above ADR_I and WE are single wires whereas DAT_1 31 0 DAT_O 31 0 and SEL_ 3 0 are 32 bit and 4 bit buses Function parameter Wishbone slave signal return value DAT_O DAT DAT_I ADR ADR_I SEL SEL_I WE WE Parallel interface control Wishbone slave signal signal START CYC_I STB_1 DONE ACK_O CLOCK CLK_I RESET RST_ 2 3 4 NIOS Bus Adapter The nios_ci bus adapter facilitates interaction between code executing on a NIOS II core and a CHC generated hardware function The NIOS II Custom Instruction Interface is used to interface the core and the hardware functions rtl _ export __CC nios_ci num void my_ASP void where num is a number in the range 0 255
225. y n is chosen as trunc x y r has the same sign as x Returns the remainder r of x ny n is chosen as trunc X y r may not have the same sign as x Not implemented Same as remainder In addition the argument quo is given a specific value see ISO Not implemented math h tgmath h Description cbrt cbrtf cbrt1 cbrt Returns the real cube root of x x1 Not implemented fabs fabsf fabsl fabs Returns the absolute value of x x abs labs llabs div ldiv lldiv are defined in stdlib h fma fmaf fmal fma Floating point multiply add Returns x y z Not implemented hypot hypotf hypotl hypot Returns the square root of x y7 pow powf powl power Returns x raised to the power y x sqrt sqrtf sqrtl sqrt Returns the non negative square root of x x 0 Manipulation functions copysign nan nextafter nexttoward math h tgmath h Description copysign copysignf copysignll copysign nan nanf nanl nextafter nextafterf nextafterl nextafter Returns the value of x with the sign of y Returns a quiet NaN if available with content indicated through t agp Not implemented Returns the next representable value in the specified format after x in the direction of y Returns y is x y Not implemented nexttoward nexttowardf nexttowardl nexttoward Same as nextafter except that the second argument in all three variants is of type long double Returns y if x y Not implemented 84 Positive
Download Pdf Manuals
Related Search
Related Contents
Bedienungsanleitung VSH Ⅰ.ハムスターに必要な二つの生活環境 ①【地下の生活 Produktanleitung/PDF MF-101 Lowpass Filter StarTech.com 10 ft Black 4-in-1 USB KVM Extension Cable 7463 Confidence Copyright © All rights reserved.
Failed to retrieve file