函数 log2l 没有函数 body
Function log2l has no function body
我是 Vivado HLS 的新手(使用 Vivado HLS 2018.3)。我正在编写此代码以使用 128 位消息和 17 位生成多项式生成 16 位 CRC(循环冗余校验)。在源代码中,我使用 log2l() 来找出位数。此代码在 C 仿真期间运行顺利,但在 C 综合期间,它抛出错误:
Function 'log2l' has no function body
请查看下面的完整源代码:
#include "header.h"
#include "ap_int.h"
using namespace std;
int crc(ap_int<128> dword,ap_int<17> gen){
int l_gen = floor(log2l(gen) + 1);
ap_int<136> dividend = dword << (l_gen-1);
// shft specifies the no. of least significant bits not being XORed
int shft = (int) (floor(log2l(dividend))+1) - l_gen;
ap_int<16> rem; //rem variable stores the CRC value
while (shft >= 0){
// bitwise XOR the MSBs of dividend with generator
// replace the operated MSBs from the dividend with
// remainder generated
rem = (dividend >> shft) ^ gen;//
// (dividend & ((1 << shft) - 1)) : bits of dividend that were not XORed
dividend = (dividend & ((1 << shft) - 1)) | (rem << shft); // new dividend
// change shft variable
shft = (int) (floor(log2l(dividend))+1) - l_gen;
}
// finally, AND the initial dividend with the remainder (=dividend)
ap_int<144> codeword; //128 bit message plus 16 bit CRC = 144 bit
codeword = (dword << (l_gen - 1)) | dividend;
cout << "Remainder: " << dividend << endl;
cout << "Codeword to be sent : " << codeword << endl;
return 0 ;
}
我使用的测试台是:
#include "header.h"
#include "ap_int.h"
using namespace std;
int crc(ap_int<128> , ap_int<17> );
int main()
{
ap_int<128>dataword ;
ap_int<17> generator;
dataword = 36;
generator = 13;
crc(dataword, generator);
cout<<" Majid wins";
return 0;
}
header 文件是:
#include<iostream>
#include<math.h>
#include "ap_fixed.h"
#include "hls_stream.h"
在 C 模拟中,我得到的输出是:
Remainder: 1
Codeword to be sent : 289
Majid wins
我只使用了三个文件:source、testbench 和 header。
请告诉我为什么这段代码在 C 综合中不起作用。另外,如果您发现我的代码有任何问题,请告诉我。谢谢!
我怀疑这与包含数学库有关。我想 Vivado HLS 有一些配置或标志可以在编译中提供,然后在综合中提供关于数学函数的使用。
不过,一个简单有效的解决方法是自己实施 floor(log2(x))
,如下所示:
template <typename T>
unsigned int mylog2 (T val) {
#pragma HLS PIPELINE II=1
if (val == 0) return (1 << (val::size-1)); // A very big number, assuming T is always ap_int<>
if (val == 1) return 0;
unsigned int ret = 0;
while (val > 1) {
val >>= 1;
ret++;
}
return ret;
}
我很确定 Vivado 会优化功能并生成合适的硬件模块。
参考:How to do an integer log2() in C++?
编辑:我添加了一个 Pipeline pragma 以确保获得一个 1-cycle 硬件模块。
我是 Vivado HLS 的新手(使用 Vivado HLS 2018.3)。我正在编写此代码以使用 128 位消息和 17 位生成多项式生成 16 位 CRC(循环冗余校验)。在源代码中,我使用 log2l() 来找出位数。此代码在 C 仿真期间运行顺利,但在 C 综合期间,它抛出错误:
Function 'log2l' has no function body
请查看下面的完整源代码:
#include "header.h"
#include "ap_int.h"
using namespace std;
int crc(ap_int<128> dword,ap_int<17> gen){
int l_gen = floor(log2l(gen) + 1);
ap_int<136> dividend = dword << (l_gen-1);
// shft specifies the no. of least significant bits not being XORed
int shft = (int) (floor(log2l(dividend))+1) - l_gen;
ap_int<16> rem; //rem variable stores the CRC value
while (shft >= 0){
// bitwise XOR the MSBs of dividend with generator
// replace the operated MSBs from the dividend with
// remainder generated
rem = (dividend >> shft) ^ gen;//
// (dividend & ((1 << shft) - 1)) : bits of dividend that were not XORed
dividend = (dividend & ((1 << shft) - 1)) | (rem << shft); // new dividend
// change shft variable
shft = (int) (floor(log2l(dividend))+1) - l_gen;
}
// finally, AND the initial dividend with the remainder (=dividend)
ap_int<144> codeword; //128 bit message plus 16 bit CRC = 144 bit
codeword = (dword << (l_gen - 1)) | dividend;
cout << "Remainder: " << dividend << endl;
cout << "Codeword to be sent : " << codeword << endl;
return 0 ;
}
我使用的测试台是:
#include "header.h"
#include "ap_int.h"
using namespace std;
int crc(ap_int<128> , ap_int<17> );
int main()
{
ap_int<128>dataword ;
ap_int<17> generator;
dataword = 36;
generator = 13;
crc(dataword, generator);
cout<<" Majid wins";
return 0;
}
header 文件是:
#include<iostream>
#include<math.h>
#include "ap_fixed.h"
#include "hls_stream.h"
在 C 模拟中,我得到的输出是:
Remainder: 1
Codeword to be sent : 289
Majid wins
我只使用了三个文件:source、testbench 和 header。
请告诉我为什么这段代码在 C 综合中不起作用。另外,如果您发现我的代码有任何问题,请告诉我。谢谢!
我怀疑这与包含数学库有关。我想 Vivado HLS 有一些配置或标志可以在编译中提供,然后在综合中提供关于数学函数的使用。
不过,一个简单有效的解决方法是自己实施 floor(log2(x))
,如下所示:
template <typename T>
unsigned int mylog2 (T val) {
#pragma HLS PIPELINE II=1
if (val == 0) return (1 << (val::size-1)); // A very big number, assuming T is always ap_int<>
if (val == 1) return 0;
unsigned int ret = 0;
while (val > 1) {
val >>= 1;
ret++;
}
return ret;
}
我很确定 Vivado 会优化功能并生成合适的硬件模块。
参考:How to do an integer log2() in C++?
编辑:我添加了一个 Pipeline pragma 以确保获得一个 1-cycle 硬件模块。