不能使用模板作为顶层函数-高层次设计
一、顶层函数的要求
1.顶层函数必须是一个确定的,实例化的硬件模块,其接口必须完全确定;
2.c++模板不是一个具体的函数,其在编译阶段是多态的,因为模板函数是函数的框架抽象,不是具体的函数;
3.如果模板函数没有实例化,那么九没有确定的函数实体,硬件无法综合
4.hls需要选定一个特定的模板实例作为顶层,而模板本身的顶层概念不是很清晰
5.模块函数的很多参数是不确定的,这个会改变接口类型,导致综合工具无法静态分析
二、模板函数的说明
1.模板的本质:模板不是函数,是生成函数的模板,需要实例化。HLS需要一个具体的函数作为入口点,进行调度、接口推断等。
2.硬件模块的确定性:硬件端口必须具有固定位宽和类型,模板参数会影响这些,如果不实例化,工具无法确定端口。
3.综合流程的要求:HLS工程设置中指定顶层函数名,该名称必须对应一个具体的非模板函数。模板函数可能有一组重载,但编译器在未实例化时无法确定其签名。
4.接口综合(pragma)的绑定:接口指令需要针对具体的函数参数,如果参数类型依赖模板参数,指令可能无法正确应用。
5.可能的绕过:可以通过实例化一个具体的模板函数,然后将其作为顶层,但模板本身不能。
三、模板不是“实体”,而是“生成器”
C++ 模板本身不是函数,而是函数的生成蓝图。只有给定模板参数进行实例化时,编译器才会生成一个具体的函数实体。例如:
template<int W>
ap_int<W> add(ap_int<W> a, ap_int<W> b) { return a + b; }
add 这个符号在没有实例化(如 add<32>)之前,并不对应任何一个可执行的函数。Vivado HLS 必须为顶层模块生成一个确定的 Verilog/VHDL 实体,它要求一个具体的函数入口,包含:
确定的函数名(用于生成模块名)
确定的参数类型和数量(用于生成端口)
确定的内部实现(用于综合)
当设计者指定“顶层函数为模板”时,工具无法确定要综合哪一个实例,因为模板参数未指定,也就不存在对应的硬件模块。
四、硬件接口的位宽与类型必须完全确定
template<typename T>
void top(T in, T& out) { ... }
那么 T 可能是 int、ap_int<32>、float 等完全不同的类型,它们对应的硬件位宽、接口协议(ap_none、ap_vld、AXI4‑Stream 等)都会完全不同。在未实例化时,HLS 无法进行
