记一次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没有满足建立时间的要求。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值