0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx Floating-Point 浮点IP加减法的仿真验证案例

454398 来源:FPGA开源工作室 作者:OpenSLee 2020-11-13 11:06 次阅读

作者:OpenSLee

1、float IP的创建

搜索float双击Floating-point

1 > Operation Selection 我们这里选择浮点数的加减法验证。

2 > Precision of Inputs 我们选择单晶浮点数(Single),指数位宽Exponent Width 8bit 尾数位宽24 bit

3 > Optimizations默认值

4 > Interface Options Latency选择1

2、浮点IP加减法的仿真验证

我们用python 自动生成100000个随机浮点数a和b以及a和b的相加或相减的结果。

python代码(float32(a)+float32(b)=float32(c)):

import bitstring, random 
span = 10000000
iteration = 100000

def ieee754(flt):
    b = bitstring.BitArray(float=flt, length=32)
    return b

with open("TestAdd.txt", "w") as f:
    for i in range(iteration):
        a = ieee754(random.uniform(-span, span))
        b = ieee754(random.uniform(-span, span))
        ab = ieee754(a.float  + b.float)
        f.write(a.hex +"_" +  b.hex  +  "_" + ab.hex + "/n")

浮点数加法验证python结果(部分):

4a953fc4_ca39838f_49e1f7f2
4b14900e_492290ab_4b1eb919
4aedbfc3_4b146c7e_4b85a630
ca4bb7f6_cb162f1d_cb491d1a
ca1ca77e_4ad19cc6_4a834907
c96e52c3_c9c7778d_ca1f5077
4ab9c1cc_cb187d76_ca6e7240
4b18508e_4a8e5556_4b5f7b39
cb103fa5_ca1765cf_cb361919
4a09db98_ca2feb0d_c9183dd4
ca626910_4a991e54_499fa730
c983aaa6_4b0534fd_4ae97f50
49e9e5f2_cad6005d_ca9b86e0
491b3266_4a3e2d28_4a64f9c2
ca935d66_caae8cbc_cb20f511
4a150544_4a645ebe_4abcb201

3、xilinx float IP的加法验证

s_axis_a_tdata,s_axis_b_tdata和m_axis_result_tdata分别代表浮点操作的a,b和结果c。

s_axis_operation_tdata的最低位为0时为加法,为1时为减法运算。

m_axis_result_tvalid当次信号为1时,结果有效。

浮点数加减法仿真顶层Float_AddSub_tb:

`timescale 1ns / 1ps
`define N_TESTS 100000
module Float_AddSub_tb();
    
 reg aclk;                           
 reg s_axis_a_tvalid;                
 wire s_axis_a_tready;               
 reg [31 : 0] s_axis_a_tdata;        
 reg s_axis_b_tvalid;                
 wire s_axis_b_tready;               
 reg [31 : 0] s_axis_b_tdata;        
 reg s_axis_operation_tvalid;        
 wire s_axis_operation_tready;       
 reg [7 : 0] s_axis_operation_tdata; 
 wire m_axis_result_tvalid;          
 reg m_axis_result_tready;           
 wire [31 : 0] m_axis_result_tdata;

reg [95:0] testVector [`N_TESTS-1:0];
reg test_stop;
reg [31:0] Expected_result;
reg [31:0] Expected_result_r;
integer mcd;
integer test_n;
integer pass;
integer error;

initial begin
  aclk = 0;
  test_n = 0;
  pass =0;
  error = 0;
  test_stop =0;
  s_axis_a_tvalid = 0;
  s_axis_b_tvalid = 0;
  Expected_result = 0;
  Expected_result_r = 0;
  s_axis_a_tdata = 0;
  s_axis_b_tdata = 0;
  s_axis_operation_tvalid = 1;
  s_axis_operation_tdata =8'b0000_0000;//Add
  //s_axis_operation_tdata =8'b0000_0001;//Sub
  m_axis_result_tready = 1;
  $readmemh("TestAdd.txt", testVector);//Add
  mcd = $fopen("ResultsAdd.txt");//Add
  
  //$readmemh("TestSub.txt", testVector);//Sub
 //mcd = $fopen("ResultsSub.txt");//Sub
  
  repeat(100000) begin
   #10 test_n = test_n + 1'b1;
  end
  
  wait(test_stop==1'b1)begin
    $fclose(mcd);
    $finish;
  end
end


always #(5) aclk = ~aclk;
  
  always @(posedge aclk) begin
    Expected_result_r  %d",test_n);
          pass = pass + 1'b1;
        end


      if ((m_axis_result_tvalid == 1) && (m_axis_result_tdata[31:11] != Expected_result_r[31:11]))
        begin
          $fdisplay (mcd,"Test Failed Expected Result = %h, Obtained s_axis_b_tdata = %h, Test Number -> %d",Expected_result,s_axis_b_tdata,test_n);
          error = error + 1'b1;
        end
      
      if (test_n >= `N_TESTS) 
      begin
        $fdisplay(mcd,"Completed %d tests, %d passed and %d fails.", test_n, pass, error);
        test_stop = 1'b1;
      end
  end    
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
floating_AddSUB your_instance_name (
  .aclk(aclk),                                        // input wire aclk
  .s_axis_a_tvalid(s_axis_a_tvalid),                  // input wire s_axis_a_tvalid
  .s_axis_a_tready(s_axis_a_tready),                  // output wire s_axis_a_tready
  .s_axis_a_tdata(s_axis_a_tdata),                    // input wire [31 : 0] s_axis_a_tdata
  .s_axis_b_tvalid(s_axis_b_tvalid),                  // input wire s_axis_b_tvalid
  .s_axis_b_tready(s_axis_b_tready),                  // output wire s_axis_b_tready
  .s_axis_b_tdata(s_axis_b_tdata),                    // input wire [31 : 0] s_axis_b_tdata
  .s_axis_operation_tvalid(s_axis_operation_tvalid),  // input wire s_axis_operation_tvalid
  .s_axis_operation_tready(s_axis_operation_tready),  // output wire s_axis_operation_tready
  .s_axis_operation_tdata(s_axis_operation_tdata),    // input wire [7 : 0] s_axis_operation_tdata
  .m_axis_result_tvalid(m_axis_result_tvalid),        // output wire m_axis_result_tvalid
  .m_axis_result_tready(m_axis_result_tready),        // input wire m_axis_result_tready
  .m_axis_result_tdata(m_axis_result_tdata)           // output wire [31 : 0] m_axis_result_tdata
);

endmodule

仿真结果:

Completed      100000 tests,       99999 passed and           0 fails.

通过仿真xilinx浮点ip的计算结果与python代码的输出结果一致,仿真成功。大家可以按照此方法仿真其他的算法中的计算公式或过程。首先利用C、matlab或者python等高级语言将算法的输入和输出一起打印出来,然后再读入到verilog的算法模型里面,通过打印出计算结果或误差来分析我们自己的算法的错误或者误差出现在哪里。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Xilinx
    +关注

    关注

    71

    文章

    2163

    浏览量

    120996
  • 仿真
    +关注

    关注

    50

    文章

    4039

    浏览量

    133411
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449
收藏 人收藏

    评论

    相关推荐

    如何用运放实现加减法运算

     前面的反相放大器和同相放大器可以实现乘法运算的功能,这一小节我们来看如何用运放实现加减法运算。
    发表于 02-02 14:12 4.4w次阅读
    如何用运放实现<b class='flag-5'>加减法</b>运算

    超长数加减法运算器及相关指令设计,实现精确计算

    8位单片机能够实现超长数计算吗?我说:"只要存储器够大,按照下面的方法设计的加减法运算器及指令,就能够编写程序完成。"1。用全加器搭建一个8位加法器;2。将最低下进位前连接一个1位寄存器,输入端连接
    发表于 09-22 03:09

    atmega128 单片机 20以内加减法训练机 做的过程 精选资料分享

    20以内加减法训练机基于单片机实现 20 以内整数加减法训练,要求具有加法、减法(结果不出现负数)、加减法三种训练模式,每次训练随机产生题目。可以选择每次训练题目的数目,可分为每组 5
    发表于 07-15 07:51

    基于单片机如何去实现20以内整数加减法训练呢

    基于单片机如何去实现20以内整数加减法训练呢?有哪些具体要求以及操作步骤呢?
    发表于 11-02 07:00

    爱特梅尔推出全新浮点单元(Floating Point Un

    爱特梅尔推出全新浮点单元(Floating Point Unit)技术  爱特梅尔公司(Atmel Corporation)宣布推出全新浮点单元(F
    发表于 04-21 17:05 702次阅读

    加减法电路

    加减法电路 利用一个差动输入的运放就可同时实现加减法运算,这种运算电路如图5.4-3所示。
    发表于 04-22 17:50 1.1w次阅读
    <b class='flag-5'>加减法</b>电路

    WP409利用Xilinx FPGA打造出高端比特精度和周期精度浮点DSP算法实现方案

    WP409利用Xilinx FPGA打造出高端比特精度和周期精度浮点DSP算法实现方案: High-Level Implementation of Bit- and Cycle-Accurate Floating-Point D
    发表于 01-26 18:03 25次下载

    Comparing_Fixed-and_Floating-Point_DSPs

    Comparing Fixed- and Floating-Point DSP。
    发表于 01-19 14:12 5次下载

    C语言教程之整数加减法练习

    C语言教程之整数加减法练习,很好的C语言资料,快来学习吧。
    发表于 04-22 17:45 0次下载

    Floating-Point设计编码风格与技巧

    尽管通常Fixed-Point(定点)比Floating-Point浮点)算法的FPGA实现要更快,且面积更高效,但往往有时也需要Floating-Point来实现。这是因为Fixe
    发表于 11-22 15:20 1527次阅读

    Xilinx Vivado HLS中Floating-Point浮点)设计介绍

    的数据动态范围,从而在很多算法中只需要一种数据类型的优势。Xilinx Vivado HLS工具支持C/C++ IEEE-54标准单精度及双精度浮点数据类型,可以比较容易,快速地将C/C++ Floating-Point算法转成
    发表于 01-12 05:43 1.1w次阅读

    Floating-Point IP接口操作介绍

    作者:OpenSLee 1、Floating-Point IP支持的运算操作 1)Multiply乘法 2) Add/subtract加法和减法 3)Accumulator累加 4) Fused
    的头像 发表于 11-13 15:17 3484次阅读

    atmega128 单片机 20以内加减法训练机 做的过程

    20以内加减法训练机基于单片机实现 20 以内整数加减法训练,要求具有加法、减法(结果不出现负数)、加减法三种训练模式,每次训练随机产生题目。可以选择每次训练题目的数目,可分为每组 5
    发表于 11-15 14:36 4次下载
    atmega128 单片机 20以内<b class='flag-5'>加减法</b>训练机 做的过程

    Xilinx FPGA里面的AXI DMA IP核的简单用法

    本文以浮点Floating-point IP核将定点数转换为浮点数为例,详细讲解AXI DMA IP核的使用方法。
    的头像 发表于 02-16 16:21 9400次阅读
    <b class='flag-5'>Xilinx</b> FPGA里面的AXI DMA <b class='flag-5'>IP</b>核的简单用法

    FPGA常用运算模块-加减法器和乘法器

    本文是本系列的第二篇,本文主要介绍FPGA常用运算模块-加减法器和乘法器,xilinx提供了相关的IP以便于用户进行开发使用。
    的头像 发表于 05-22 16:13 4596次阅读
    FPGA常用运算模块-<b class='flag-5'>加减法</b>器和乘法器