Vitis HLS 学习笔记--添加 RTL 黑盒函数

目录

1. 简介

2. 用法详解

2.1 需要的文件

2.1.1 RTL 函数签名

2.1.2 黑盒 JSON 描述文件

2.1.3 RTL IP 文件

2.2 操作步骤

3. 总结


1. 简介

Vitis HLS 工具可以将现有的 Verilog RTL IP(即硬件描述语言编写的模块)集成到 C/C++ HLS 项目中。通过这种方式,Vitis HLS 能够将 RTL 代码与 C/C++ 代码一起综合,形成最终的硬件设计。

RTL 黑盒允许设计者在 HLS 设计中的特定区域(如顺序区域、流水线区域或数据流区域)内使用 Verilog 或 VHDL 编写的 RTL IP。这样做的好处是可以重用现有的硬件模块,同时利用 HLS 的优势来加速整个设计和开发过程。

简单的说,如果你有一个用 Verilog 编写的性能优化好的 IP,可以将其作为黑盒插入到 HLS 项目中,而不需要将其重新用 C/C++ 实现。这样可以节省时间,并确保硬件设计的高效性和可靠性。

2. 用法详解

2.1 需要的文件

2.1.1 RTL 函数签名

RTL 代码的 C 语言函数签名,是指用于代表RTL模块的C函数的声明。这个签名定义了函数的名称、输入参数和返回类型,这样C代码就可以调用它,就像调用任何其他C函数一样。这个签名通常放在一个头文件(.h)中,以便在整个项目中使用。

#include "ap_int.h"

//--------------------------------------------------------
//RTL 代码的 C 语言函数签名
//--------------------------------------------------------
void rtl_model(ap_int<10>  a1, ap_int<10>  a2, ap_int<10>  a3, ap_int<10>  a4,
               ap_int<10>  b1, ap_int<10>  b2, ap_int<10>  b3, ap_int<10>  b4,
               ap_int<10>& z1, ap_int<10>& z2, ap_int<10>& z3, ap_int<10>& z4);

//--------------------------------------------------------
void example(ap_int<10> a1, ap_int<10> a2, ap_int<10> a3, ap_int<10> a4,
             ap_int<10> b1, ap_int<10> b2, ap_int<10> b3, ap_int<10> b4,
             ap_int<10>& sigma) {

    ap_int<10> tmp1, tmp2, tmp3, tmp4;

    rtl_model(a1, a2, a3, a4, b1, b2, b3, b4, tmp1, tmp2, tmp3, tmp4);
    sigma = tmp1 + tmp2 + tmp3 + tmp4;
}

2.1.2 黑盒 JSON 描述文件

{
"c_function_name"     : "rtl_model",
"rtl_top_module_name" : "rtl_model",
"c_files" : [{ 
              "c_file" : "rtl_model.cpp",
              "cflag" : ""
            }],
"rtl_files" : [
                "rtl_model.v"
              ],
"c_parameters" : [{
                   "c_name" : "a1",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a1"
                                 }
                  },
                  {
                   "c_name" : "a2",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a2"
                                 }
                  },
                  {
                   "c_name" : "a3",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a3"
                                 }
                  },
                  {
                   "c_name" : "a4",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "a4"
                                 }
                  },{
                   "c_name" : "b1",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b1"
                                 }
                  },
                  {
                   "c_name" : "b2",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b2"
                                 }
                  },
                  {
                   "c_name" : "b3",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b3"
                                 }
                  },
                  {
                   "c_name" : "b4",
                   "c_port_direction" : "in",
                   "rtl_ports" : {
                                  "data_read_in" : "b4"
                                 }
                  },
                  {
                   "c_name" : "z1",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z1",
		                  "data_write_valid" : "z1_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z2",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z2",
	                          "data_write_valid" : "z2_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z3",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z3",
	                          "data_write_valid" : "z3_ap_vld"
                                 }
                  },
                  {
                   "c_name" : "z4",
                   "c_port_direction" : "out",
                   "rtl_ports" : {
                                  "data_write_out"   : "z4",
	                          "data_write_valid" : "z4_ap_vld"
                                 }
                  }],
"rtl_common_signal" : {
                        "module_clock"                    : "ap_clk",
                        "module_reset"                    : "ap_rst",
                        "module_clock_enable"             : "ap_ce",
                        "ap_ctrl_chain_protocol_idle"     : "ap_idle",
                        "ap_ctrl_chain_protocol_start"    : "ap_start",
                        "ap_ctrl_chain_protocol_ready"    : "ap_ready",
                        "ap_ctrl_chain_protocol_done"     : "ap_done",
                        "ap_ctrl_chain_protocol_continue" : "ap_continue"
                      },
"rtl_performance" : {
                     "latency" : "2",
                     "II"      : "1"
                    },
"rtl_resource_usage" : {
                        "FF"   :   "0",
                        "LUT"  :   "0",
                        "BRAM" :   "0",
                        "URAM" :   "0",
                        "DSP"  :   "1"
                       }
}

2.1.3 RTL IP 文件

`timescale 100ps/100ps

(* use_dsp = "simd" *)
(* dont_touch = "1" *)  
module rtl_model (input            ap_clk, ap_rst, ap_ce, ap_start, ap_continue,
                  input [9:0]      a1, a2, a3, a4, b1, b2, b3, b4,
                  output           ap_idle, ap_done, ap_ready,
                  output           z1_ap_vld, z2_ap_vld, z3_ap_vld, z4_ap_vld,
                  output reg [9:0] z1,        z2,        z3,        z4);

   wire ce = ap_ce;
   
   reg [9:0] areg1, areg2, areg3, areg4;
   reg [9:0] breg1, breg2, breg3, breg4;
   reg       dly1, dly2;
   
   always @ (posedge ap_clk)
     if (ap_rst)
       begin
          z1    <= 0;
          z2    <= 0;
          z3    <= 0;
          z4    <= 0;
          areg1 <= 0;
          areg2 <= 0;
          areg3 <= 0;
          areg4 <= 0;
          breg1 <= 0;
          breg2 <= 0;
          breg3 <= 0;
          breg4 <= 0;
          dly1  <= 0;
          dly2  <= 0;     
       end
     else if (ce)
       begin
          z1    <= areg1 + breg1;
          z2    <= areg2 + breg2;
          z3    <= areg3 + breg3;
          z4    <= areg4 + breg4;
          areg1 <= a1;
          areg2 <= a2;
          areg3 <= a3;
          areg4 <= a4;
          breg1 <= b1;
          breg2 <= b2;
          breg3 <= b3;
          breg4 <= b4;
          dly1  <= ap_start;
          dly2  <= dly1;          
       end

   assign z1_ap_vld = dly2;
   assign z2_ap_vld = dly2;
   assign z3_ap_vld = dly2;
   assign z4_ap_vld = dly2;
   assign ap_ready  = dly2;
   assign ap_done   = dly2;
   assign ap_idle   = ~ap_start;
      
endmodule // rtl_model

2.2 使用 RTL 黑盒向导

整体步骤和常规的 Vitis HLS 步骤一致,特殊点在于多了一个 JSON 文件需要配置:

  • 从顶层函数内或者从 Vitis HLS 工程的子函数内调用 C 语言函数签名。
  • 在 Vitis HLS IDE 中使用“Add Files”(添加文件),将黑盒 JSON 描述文件添加到 HLS 工程中。
  • 运行 Vitis HLS 设计文件照常进行仿真、综合和协同仿真。

使用 RTL 黑盒向导操作步骤:

在导航到工程中,打开 RTL 黑盒向导:

 

3. 总结

Vitis HLS 的引入为硬件设计师提供了一种灵活高效的设计途径,通过允许 RTL 黑盒的使用,设计师可以在不牺牲性能的前提下,重用现有的硬件模块,同时利用 HLS 的高层次抽象和快速迭代能力来加速设计和开发过程。这种方法既节省了将硬件模块重新用 C/C++ 实现的时间,也保持了设计的高效性和可靠性。通过简化操作步骤和提供直观的工具,如 RTL Blackbox Wizard,Vitis HLS 降低了硬件设计的复杂性,使得开发者能够更加专注于创新和优化。

相关推荐

  1. Web课程学习笔记--CSS模型

    2024-06-16 09:30:02       37 阅读
  2. 软件测试错题集(、白测试)

    2024-06-16 09:30:02       31 阅读
  3. 测试和白测试总结

    2024-06-16 09:30:02       18 阅读
  4. 软件测试之测试与白测试

    2024-06-16 09:30:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 09:30:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 09:30:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 09:30:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 09:30:02       20 阅读

热门阅读

  1. 使用winehq在Mac上成功运行Win系统exe应用程序

    2024-06-16 09:30:02       9 阅读
  2. PHP序列化基础概念:深入理解数据存储与传输

    2024-06-16 09:30:02       8 阅读
  3. 【分形技术在神经网络建模中的应用】

    2024-06-16 09:30:02       9 阅读
  4. 【Ubuntu20.04】安装XRDP远程桌面服务

    2024-06-16 09:30:02       9 阅读
  5. 【LC刷题】DAY08:151 55 28 459

    2024-06-16 09:30:02       10 阅读
  6. C++中的堆和栈内存定义以及区别

    2024-06-16 09:30:02       6 阅读
  7. 【DPDK学习路径】七、创建RX/TX队列

    2024-06-16 09:30:02       10 阅读
  8. 一网双引擎的定义和优势

    2024-06-16 09:30:02       6 阅读