- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Intel Support,
I am attempting to compile a library of RTL components to use in my HLS project.
The HLS project compiles when testing for x86-64 simulation, but the compiler complains about the desired RTL function being "undefined" when attempting to compile for test-fpga.
I have included the relevant files .v and .xml files, but cannot upload the .cpp or .h file though they are included when I compile the library
I am curious as to which file likely has the issue since I can do simulation but not compilation.
Thank you in advance
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The issue is in my expHBU.h file. I put
uint8_t expHBU(uint8_t input);
Rather than the CORRECT
extern "C" {
uint8_t expHBU(uint8_t input);
}
This extern is extremely esoteric and should be included in the reference manual.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello messn036,
For investigation, could you please upload your failure log?
Best regards,
Yoshiaki Saito
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
i++ component_testbench.cpp expHBU.a -v --dont-error-if-large-area-est -march=Cyclone10GX -o test-fpga
Target FPGA part name: 10CX220YF780I5G
Target FPGA family name: Cyclone10GX
Target FPGA speed grade: -5
Resolved expHBU.a to /home/grads/messn036/OpenCL-HUBERT/OpenCL-HUBERT/component_ip/expHBU.a
Analyzing component_testbench.cpp for testbench generation
Creating x86-64 testbench
Analyzing component_testbench.cpp for hardware generation
Verifying version information in the included files.
Expecting version 21.2.0.67.4 for all included files.
Included files passed version check. Checked: /home/grads/messn036/OpenCL-HUBERT/OpenCL-HUBERT/component_ip/expHBU.a
Preprocessing FPGA Libraries
Optimizing component(s) and generating Verilog files
component_testbench.cpp:9: Compiler Error: undefined reference to 'expHBU(unsigned char)'
HLS Main Optimizer FAILED.
make: *** [test-fpga] Error 1
I have done some basic troubleshooting in the meantime an narrowed down my error a bit. To compile the RTL library, I am using the following commands
fpga_crossgen exp_wrapper.xml --target hls --emulation_model expHBU.cpp -o expHBU.o
fpga_libtool --target hls --create expHBU.a expHBU.o
But It seems like I need to use different flags to get the xml and verilog to compile for NOT the x86-64 simulation but for the test-fpga version. Am I right here? When should I expect to compile the xml and verilog?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Additional information: If I compile the library with just the fpga_crossgen command (exclude the expHBU.a step)
fpga_crossgen exp_wrapper.xml --target hls --emulation_model expHBU.cpp -o expHBU.o
And then attempt a -march=Cyclone10GX compile
i++ component_testbench.cpp expHBU.o -v --dont-error-if-large-area-est -march=Cyclone10GX -o test-fpga
I get the following error
Compiler Error: Cannot find Library file ./test-fpga.prj/spec.xml
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello messn036,
Thank you for sharing the failure log with us.
I think the simple design is necessary to investigate it for us.
So could you share simple full design which can duplicate the error with us?
Best regards,
Yoshiaki Saito
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here are the source files I am using. I am trying to model the basic rtl library tutorial the best I can (which compiles fine in my environment). I'm sure its some easy syntax error that none of the compilers or packagers is catching.
I cannot upload the .cpp and .h files because this site rejects them. Here is the source
expHBU.h
#include <stdint.h>
#include "HLS/math.h"
uint8_t expHBU(uint8_t input);
expHBU.cpp
#include "expHBU.h"
uint8_t expHBU(uint8_t input){
return (uint8_t)exp(input);
}
component_testbench.cpp
#include "HLS/hls.h"
#include "HLS/stdio.h"
#include "HLS/math.h"
#include "expHBU.h"
component uint8_t executeexp(uint8_t exponent)
{
return expHBU(exponent);
}
component uint8_t executeexp_basic(uint8_t exponent)
{
return exp(exponent);
}
int main()
{
uint8_t exponent = 3;
uint8_t result = executeexp(exponent);
printf("result %d \n", result);
return 0;
}
Reminder: the x86 simulation works, but the FPGA compile does NOT
Thanks,
messn036
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The issue is in my expHBU.h file. I put
uint8_t expHBU(uint8_t input);
Rather than the CORRECT
extern "C" {
uint8_t expHBU(uint8_t input);
}
This extern is extremely esoteric and should be included in the reference manual.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello messn036,
Thank you for the update.
Basically, you need to add the extern “C” to call a function from C++ to C. This is general rule of C++.
C++ Language adds a prefix to a function name to support the class feature.
But, this feature is disabled when you add extern “C”.
So many C/C++ headers include:
#ifdef __cplusplus
extern "C" {
#endif
rtl_inet_uint16 rtl_htons(rtl_inet_uint16 hostshort);
rtl_inet_uint16 rtl_ntohs(rtl_inet_uint16 netshort);
rtl_inet_uint32 rtl_htonl(rtl_inet_uint32 hostlong);
rtl_inet_uint32 rtl_ntohl(rtl_inet_uint32 netlong);
#ifdef __cplusplus
}
#endif
Best regards,
Yoshiaki Saito
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello messn036,
I will close this thread if no further questions from you.
Best regards,
Yoshiaki Saito
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page