在查询类似帖子时我发现这一问题是由于在设计实现时vivado认为没有输出端口所以报错。
于是在.v文件中我添加了一个随意的端口,并且在.xdc文件中为它分配了管脚
这样做的确可以让设计实现的过程顺利进行,但是会发现在summary中,设计实现的资源量与分析综合的资源量有较大差距,在设计实现的资源量表格中几乎无资源占用(我的工程中甚至只占用了一个IO口),并且时序报告中显示NA,这显然是不正确的。
经过我的排查,这一报错在我的工程中出现的原因是我的顶层文件中有多个内部输出没有分配输出端口,所以在设计实现时vivado才会报错告诉我需要有输出端口,用上述做法固然能解决报错,但设计实现时却会因为内部输出没有输出端口而被优化掉,这解释了为什么设计实现后出现结果异常。
针对这种问题,有两种解决方法,一种是老老实实把每个内部输出分配一个输出端口(这里的内部输出指的是从一个例化模块输出而不再输入到其他模块的输出),另一种,在我们不知道分配到哪个管脚合适,只是想看设计报告时,可以通过对内部输出信号添加“keep true”的方式,阻止它被视为多余输出导致整个模块被优化掉的情况,如下所示:
这样就能正常进行设计实现,这是我在出现[Place 30-494]错误时我的工程存在的问题与我的解决办法,遇到这一报错可以检查一下代码中是否有被vivado视为多余的输出端口并为它添加一些处理。
另外,虽然使用上述方案可以通过implementation,但是大概率布局布线后的结果仍然有问题。在仅采用keep true 的方法时,布局布线后的结果会发现占用资源量很少,打开schematic发现布线后的结构如图所示,可以看出几个主要功能模块都没有分配时钟资源,这是因为虽然我们人为指定了线网不允许优化,但是布局布线时相关模块的输出并没有实际作用,所以模块被优化掉了。
为了完整计算实现功能需要占用的资源量,有两个改进策略:
一是为输出信号安排输出端口,并在约束文件中为其分配管脚,这对一些验证性工作来说有些没必要,因为很可能端口不够用
二是设置一个ila核作为对输出信号的监测,这种方法在上版验证时很有用。我采用这一方案解决了布线后功能未实现的问题