记一次FPGA工程艰难的debug经历(模块一定要寄存器输出)

最近调试一个项目,时序没有报错,仿真没有问题,但是上板始终差一个bit,因为更换过器件,所以怀疑IP,各种怀疑,最后没办法,只能在signaltap上一个模块一个模块抓,然后跟仿真结果对比,最终定位到一个计数器。计数器的代码如下

always @(posedge clk or posedge reset) begin  // 模块3
    if (reset)
        dinCnter <= 0;
    else if (din_en == 1'b1 && dinCnter != 11)
        dinCnter <= dinCnter + 1'b1;
end

这里reset是一个本地的复位信号,在din_en的前一拍是拉高的,signaltap抓出来的结果如下,可以看到dinCnter并没有在din_en拉高后马上开始+1。
在这里插入图片描述
reset和din_en信号是上一个模块给过来的,大概的逻辑如下

assign   x        =  (a & b) | (c & d);		// 模块1输出
assign  din_in    =  (g & h) | (l & o);		// 模块1输出
assign  reset     =  x | p;                 // 模块2中的赋值语句
// 上面的计数器为模块2的子模块中的逻辑

对x和din_en打一拍输出结果就对了。

代码虽然不是我写的,但是我也觉得这样写没什么问题,这里没有几级组合逻辑,感觉可以接受(虽然已经是跨模块了),因为a、b、c、d、g、h、l、o都是寄存器输出的。

问题是为什么时序报告里没有这条关键路径?从结果来看很明显是din_en没有满足建立时间的要求。

总结这次经验,模块的输出一定要寄存器输出,输入最好也是。.
.
.
.
.
.
.
.
.
.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
作为一个十年的FPGA工程师,我的职业成长经历充满了挑战和机遇。开始的时候,我对FPGA的理解只是停留在书本知识上,缺乏实际操作的经验。然而,随着实践的积累,我逐渐掌握了FPGA设计的各个领域。 早期的成长经历是通过学习掌握FPGA的基础知识和工具的使用,如Verilog/VHDL编程语言、Xilinx/Vivado开发工具等。这让我有了在顶层设计的基础上完成简单的FPGA设计的能力。 随着时间的推移,我开始接触到更复杂的项目和挑战。我学习了如何优化FPGA设计,以减少功耗和资源占用,提升性能。同时,我也深入研究了高级设计技术,如时序约束、时钟域处理、IP核使用等。 在职业生涯中,我参与了多个大型项目的开发,这为我的成长提供了宝贵的机会。通过与团队合作,我学习到了如何与其他工程师合作,有效地进行沟通和协作。这帮助我成为一个具有良好团队合作精神的工程师。 此外,我也积极参加行业会议和培训,不断更新自己的知识和技能。我了解到了FPGA领域的最新发展和趋势,并将这些知识应用到实际的工程项目中。 在这十年中,我不仅在技术方面成长,还提升了自己的项目管理和解决问题的能力。我学会了如何合理地规划并管理项目的时间和资源,以确保项目按时交付。 总的来说,作为一个十年的FPGA工程师,我的成长经历是一个循序渐进的过程。通过不断的学习和实践,我逐渐掌握了FPGA设计的各个领域,并提升了自己的技术和管理能力。我相信,在未来的职业生涯中,我将继续不断学习和成长,为FPGA领域的发展做出更大的贡献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值