顶层参数约束为axis接口-vivado hls第七十九章

axis表示的是AXI4-Stream接口
1.axis接口可以指定input参数
2.axis接口可以指定output参数
3.axis接口不能指定iout参数
4.void test(int a);中的a作为input scalar变量,可以约束为axis接口
5.void test(int& b);中的b作为output scalar变量,可以约束为axis接口
6.void test(int c[200]);中的数组c可以作为input array变量,可以约束为axis接口
7.void test(int d[200]);中的数组d可以作为output array变量,可以约束为axis接口
8.void test(int* e);中的指针e可以约束为axis接口
9.void test(int* f);中的指针f可以约束为axis接口
10.hls::stream变量,自动约束为axis接口
AXI4-STREAM接口
1.axi4-stream接口可以应用于任意输入参数和任意数组或者指针输出参数
2.axi4-stream接口是按照顺序流传输的方式来进行数据的传输的,所以不可以同时支持读写的实参
3.axi4-stream接口包含非寄存器,输入寄存,输出寄存,输入输出信号都寄存四种状态
• 正向:仅寄存 TDATA 和 TVALID 信号。
• 反向:仅寄存 TREADY 信号。
• 双向:寄存所有信号(TDATA、TREADY 和 TVALID)。这是默认方式。
• 关:不寄存任何端口信号
可综合设计模块内部使用axis
1.在设计内,如果实现需要 FIFO,必须使用 STREAM 指令将所有数组指定为流传输
2.在设计内部,对数组应用 STREAM 指令时,硬件内实现生成的 FIFO 包含的元素数量与数组同样多。-depth 选项可用于指
定 FIFO 的大小。
3.顶层接口上的 hls::stream<> 默认情况下使用 ap_fifo 接口来实现
4.设计内部的 hls::stream<> 作为 FIFO 来实现,深度为 2。最优化指令 STREAM 用于更改此默认大小
为什么axis接口不需要像m_axi那样设置depth参数?
axis接口是一种轻量级的流式接口,主要用于点对点的数据流传输,其控制逻辑(ready/valid握手)天然地处理了数据流的同步,通常不需要深度的缓冲区。而m_axi是内存映射接口,用于访问DDR等存储器,需要depth参数来指定访问请求队列的深度
axis接口使用案例一:
#include "ap_int.h"
// 假设使用上面定义的 axis 结构体
template <int D>
struct axis {
ap_uint<D> data;
ap_uint<D/8> keep;
ap_uint<1> last;
};
void pass_scalar_over_axis(axis<32>& input_scalar,
axis<32>& output_scalar) {
// 告诉 Vivado HLS 将 input_scalar 和 output_scalar 接口实现为 AXI4-Stream
#pragma HLS INTERFACE axis port=input_scalar
#pragma HLS INTERFACE axis port=output_scalar
// 你的处理逻辑:这里只是简单地将输入标量传递给输出
// 在实际应用中,你可能会根据 input_scalar.data 进行计算
output_scalar.data = input_scalar.data + 42; // 示例处理
output_scalar.keep = input_scalar.keep; // 通常保持 keep 不变
output_scalar.last = input_scalar.last; // 或者根据你的协议设置 last
}
案例二:
void dataflow_top(axis<32> &inStream, axis<32> &outStream, axis<32> &configScalar) {
#pragma HLS DATAFLOW
#pragma HLS INTERFACE axis port=inStream
#pragma HLS INTERFACE axis port=outStream
#pragma HLS INTERFACE axis port=configScalar
static hls::stream<intermediate_t> pipe1;
static hls::stream<intermediate_t> pipe2;
// 假设 module_one 使用 configScalar 作为配置输入
module_one(inStream, configScalar, pipe1);
module_two(pipe1, pipe2);
module_three(pipe2, outStream);
}
案例三:
#include "hls_stream.h"
void data_processing_top(hls::stream<axis_data> &input_stream,
hls::stream<axis_data> &output_stream) {
#pragma HLS INTERFACE axis port=input_stream
#pragma HLS INTERFACE axis port=output_stream
// 你的处理逻辑会在这里
axis_data input_packet;
input_stream.read(input_packet); // 阻塞读取,直到有数据可用
axis_data output_packet;
output_packet.data = input_packet.data * 2; // 示例处理:数据乘2
output_packet.last = input_packet.last; // 传递 TLAST 信号
output_stream.write(output_packet); // 阻塞写入,直到下游准备好
}
案例四:
void processing_system(hls::stream<axis_data> &in, hls::stream<axis_data> &out) {
#pragma HLS DATAFLOW
#pragma HLS INTERFACE axis port=in
#pragma HLS INTERFACE axis port=out
static hls::stream<axis_data> stage1_to_stage2; // 使用HLS的stream类做内部通道
static hls::stream<axis_data> stage2_to_stage3;
module_stage1(in, stage1_to_stage2);
module_stage2(stage1_to_stage2, stage2_to_stage3);
module_stage3(stage2_to_stage3, out);
}
hls::stream<> 类实现的串流具有如下属性:
hls::stream<> 的行为与无限深度的 FIFO 相似。
按顺序对其执行读写操作。从 hls::stream<> 读取数据之后,无法再次对其进行读取。
hls::stream<> 作为顶层接口上的实参时,impl 为:ap_fifo or AXIS。
hls::stream<> 作为局部或全局变量时,impl 为:fifo。
vivado hls接口综合
一、如果使用C/RTL协同仿真功能来验证RTL设计,必须满足至少其中一项:
1.顶层接口必须使用ap_ctrl_hs或者ap_ctrl_chain块级接口对顶层函数进行综合
2.如果顶层接口不是ap_ctrl_hs或者ap_ctrl_chain块级接口的情况,也就说顶层接口使用ap_ctrl_none,那就需要满足下面其中
的一种:
a.必须使用纯组合逻辑设计
b.顶层函数的启动间隔必须等于1
c.接口包含的数据必须全部使用ap_hs或者axis接口模式来传输和实现。



更多推荐



所有评论(0)