【BUG记录】Xilinx复数乘法器、乘法器IP核,在modelsim仿真时,出现一个时钟内先算错,再算对的情况

问题描述

在vivado中使用复数乘法器IP核时,使用modelsim仿真看计算结果,发现了如下的情况:
在这里插入图片描述
图中,clk是IP核的工作时钟,result是乘法的计算结果,×代表计算结果不对,√表示计算结果正确,valid是IP核产生的输出结果有效信号(高有效)。
在一个时钟内,输出的结果先是算不对,然后又算对了。而我期望的波形如下:
在这里插入图片描述

问题分析

  1. 如果是输入的两个乘数没有按照自己想要的顺序对齐,即使算错,也应该是以时钟为单位错,不能是在一个时钟内先错后对。
    通过更改代码,使得两个乘数串位,发现上述问题依旧存在,故排除该问题。
  2. 怀疑是乘法器配置的问题,有可能影响的只有signed usigned选项。
    排列组合输入数据的signed usigned选项,上述问题依旧存在,排除该问题。
  3. 怀疑是输入数据的问题,目前输入的两个乘数,一个是1-48的递增,一个是5位数的负数,把两个乘数都换成1-48的递增,上述问题解决了,但是没懂,为啥负数就会导致计算错误。
  4. 把乘法器使用的资源从dsp48改为lut,计算结果正确。
    反复确认操作4,发现,使用lut时,计算结果就正确,使用dsp48时,计算结果就会先错再对。

在这里插入图片描述

在这里插入图片描述
也不光是一个LUT、DSP选项导致的。使用DSP的情况下,如果是1~48自己乘自己,就也能算对,乘数中带负数的话,就会先错后对。

先用着LUT吧,后面LUT不够需要优化了再说。

【24/2/28更新】:
LUT马上就不够用了,这里非得用DSP不可。
经过多次尝试,发现使用DSP的乘法器出现先算错,后算对的情况,可能和乘法结果的位数有关系,位数过大,就会有此问题,乘数较小,就不会有该问题。或许是因为DSP底层硬件的限制,它超过多少位之后,就不能一次算完,看了调用DSP48的原语:

   MULT_MACRO #(
      .DEVICE("7SERIES"), // Target Device: "7SERIES" 
      .LATENCY(3),        // Desired clock cycle latency, 0-4
      .WIDTH_A(18),       // Multiplier A-input bus width, 1-25
      .WIDTH_B(18)        // Multiplier B-input bus width, 1-18
   ) MULT_MACRO_inst (
      .P(P),     // Multiplier output bus, width determined by WIDTH_P parameter
      .A(A),     // Multiplier input A bus, width determined by WIDTH_A parameter
      .B(B),     // Multiplier input B bus, width determined by WIDTH_B parameter
      .CE(CE),   // 1-bit active high input clock enable
      .CLK(CLK), // 1-bit positive edge clock input
      .RST(RST)  // 1-bit input active high reset
   );

其支持的是25bit*18bit的有符号乘法,超过了就会有bug?

解决方法:这里不想深入研究乘法器的设计,就顺着这个bug,既然它是在上升沿处有错误数据,那就在下降沿取乘法器输出,这样取出的数据就是计算正确的,再用上升沿打一拍,将其转换到上升沿,用于后续模块的使用。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用ModelSim仿真IP核的步骤如下: 1. 首先,确保已经安装了ModelSim软件并且成功运行。 2. 在工程目录下创建一个新的文件夹(可以根据个人喜好命名),用于放置仿真相关的文件。 3. 打开ModelSim软件,点击菜单栏上的“File” -> “Change Directory”,选择之前创建的文件夹作为工作目录。 4. 在工作目录下创建一个新的VHDL或Verilog文件,用于编写仿真代码。可以使用文本编辑器编写代码,并保存为`.vhd`(对于VHDL)或`.v`(对于Verilog)格式。 5. 在编写代码,需要注意引入所需的IP核库文件。可以通过添加IP核的引用路径来实现。方法是点击菜单栏上的“Library” -> “Use” ->“Specify Search Libraries”,然后选择需要引用的IP核路径。 6. 在代码中实例化所需的IP核,并将其与其他逻辑电路进行连接。根据IP核的要求,设置其相应的输入和输出端口。 7. 编写仿真测试代码,用于对IP核进行功能验证。可以使用ModelSim提供的测试库函数来生成测试向量,并对设计进行仿真验证。 8. 完成编写代码后,点击ModelSim界面上的“Compile”或“Simulate”按钮,进行编译和仿真。 9. 在仿真结果窗口中,可以观察IP核的输入输出波形,以及其他相关信号的变化情况。可以通过设置仿真间和观察时钟周期来控制仿真过程。 10. 通过观察仿真结果,可以验证IP核设计的正确性,并进行必要的调试和优化。 总结:使用ModelSim仿真IP核的过程中,需要创建工作目录,编写仿真代码,并引入所需的IP核库文件。然后进行编译和仿真,观察仿真结果,验证设计的正确性。根据需要进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值