Vivado_HLS 学习笔记2-接口综合

常见的模块接口

如果设计的模块有IO的协议要求,应该尽早地在设计过程中进行设置.

  • 数组Port

    • 设置为单端口的RAM: Directive-> Resource -> core: RAM_1P_BRAM. : RTL中最终不会包括该外部的BRAM, 而是需要你在vivado中添加一个RAM以和该设计IP连接;
    • 多端口RAM(一般把输入端口设置为多端口):ap_memory 注意必须进行循环展开,否则一个循环只会读取一个RTL端口的数据,就算directive指定了多端口也没用.
    • 设置为FIFO接口(一般把输出端口设置为FIFO) ap_fifo;
    • 数组分块(循环展开时): 输出端口Directive-> ARRAY_PARTITION-> type: block, factor:4; 若输入为双口RAM,则输入端口Directive-> ARRAY_PARTITION-> type: block, factor:2;

    可以学习ug871的Ch4 lab3 and lab4.

  • Scalar Port(传值的形参)

    • 添加输入有效vld信号: Directive-> Interface -> mode: ap_vld. 当port_vld为高,模块内才会读port.
    • 添加输出应答ack信号: Directive-> Interface -> mode: ap_ack. 当模块读port,port_ack才会拉高.
    • 添加握手(以上两个) : Directive-> Interface -> mode: ap_hs.
    • 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
  • 双向IO(传指针的形参):

    • 添加有效vld信号: Directive-> Interface -> mode: ap_vld.
    • 添加应答ack信号: Directive-> Interface -> mode: ap_ack.
    • 添加握手(以上两个): Directive-> Interface -> mode: ap_hs.
    • 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
    • 添加输出有效ovld信号: Directive-> Interface -> mode: ap_ovld. 输入无vld信号
    • 添加FIFO接口: Directive-> Interface -> mode: ap_fifo,包括输出的写使能和输入的FIFO满信号;
    • 添加HLS总线协议: Directive-> Interface -> mode: ap_bus
  • Block-level Protocol: 用于模块的控制端口的协议设计

    • 当模块内消耗多于1个时钟周期,ap_clk和ap_rst会被自动添加;
    • 对顶层模块进行Directive -> Interface -> mode: s_axilite, m_axi等
    • Block-level的控制协议只有4种: ap_ctrl_none(无附加端口的协议), ap_ctrl_hs(default), ap_ctrl_chain, s_axilite(SoC常用);
    • ap_ctrl_none(无附加端口的协议)只能用于组合逻辑电路,仅消耗1个时钟周期的pipeline任务,数组流或hls_stream接口.
    • ap_ctrl_hs中, ap_start,ap_done,ap_idle, ap_ready是控制端口,有了它, RTL模块可以被除IO口外的其他端口控制.
      • ap_start: 拉高1,并至少维持到ap_ready拉高.ap_ready拉高后,ap_start如果拉低到0,表示C函数将停止运行;如果保持高,则表示C函数将继续运行.
      • ap_ready: 可以接收新的数据输入;
      • ap_done: 模块计算结束,此时如果有ap_return,则是该数据的有效标志;
      • ap_idle: 空闲状态;
      • 返回值 ap_return 的接口协议为: ap_ctrl_hs
      • clock_enable端口:必须保证是ap_ctrl_hs协议的端口,才可以添加: 选择targeted solution, 右键solution setting-> config_interface -> 勾选clock_enable
      • 对输入输出添加寄存器: 必须保证是ap_ctrl_hs协议的端口,才可以添加;
      • 设置RTL属性: 右键sollution setting-> config_rtl-> 设置rst_en.
    • s_axilite: 使控制端口可被CPU使用.
  • 注意一般IO协议一旦设定好,就不会再改变. 因此此类directive应放置到C Source文件中,而不是Driective文件.

结构体struct作为接口

结构体应该在header 文件中定义.

  • Data_Pack Mode: 降低latency, 升高Throughput
    在directive中定义:
    field_level: 每个field会扩展到8-bit;
    struct_level: 实际位宽被保留,整体位宽被扩展到8-bit对齐;

枚举类型作为接口

  • enum 枚举类型

枚举类型中每个数根据枚举列表顺序,被自动实现为一个integer: 0,1,2...
typedef enum
{
M_INIT,
M_ADD,
M_SUB,
M_HOLD
} mymode_t;

mymode_t mode;

原文地址:https://www.cnblogs.com/charleechan/p/13184173.html