场景
Vivado版本: 2016.4
FPGA开发板:NEXYS 4 DDR
所在项目:31条单周期CPU
完整报错信息
[Place 30-574] Poor placement for routing between an IO pin and BUFG.
If this sub optimal condition is acceptable for this design,
you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file
to demote this message to a WARNING.
However, the use of this override is highly discouraged.
These examples can be used directly in the .xdc file to override this clock rule.
< set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets reset_IBUF] >
reset_IBUF_inst (IBUF.O) is locked to IOB_X0Y82
and reset_IBUF_BUFG_inst (BUFG.I) is provisionally placed by clockplacer on BUFGCTRL_X0Y1
解决问题思路
在过去的一次课程作业中实现了分频器,在这个实验当中,没有用到板子上的晶振,也就是E3管脚,但是又有时钟信号,所以需要在XDC文件中添加:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets XXX]
XXX是要作为clk的时钟的信号的端口名,报错信息里的get_nets reset_IBUF只是表述一种格式,不要生搬硬套。举例如下:
如果你的模块名是:
module test(
input clk_in
);
...
endmodule
然后你并不打算使用板子上的晶振,比如你只是想通过按板子上的按钮或者开关来手动模拟时钟,那么在下板时就会报这个错。这时候在xdc文件中添加一句:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_in]
就可以生成比特流了。
故当这条报错跳出来的时候我很困惑,因为我的引脚确实是板子的晶振E3,难道Vivado不认为我这个是晶振?新建一个工程,移植过去,还是报错。Xillinx官方社区的大意也不太理解。
Github上有讨论:
https://github.com/hamsternz/ArtyEtherentTX/issues/1
但并没什么帮助。
然后找到这个:
https://wiki.nus.edu.sg/pages/viewpage.action?pageId=167808307
可能需要翻墙,截图如下:
大意是:连接到一个同步电路的时钟输入的信号不是同步的,换成人话就是:有一个信号作为了一个同步电路的时钟输入,但这个信号不是同步的信号,然后我还是不能理解。
在我的CPU里,比如Ram,我是采取写需要clk,读直接读的方法,并且读写隔离,如:
module ram(clk, rst, ...)
always @ (*) begin
//读操作
end
always @ (posedge clk)begin
//写操作
end
endmodule
这样岂不是必然报错?
最后,我死马当活马医,还是添加了上述所说的set_property CLOCK_DEDICATED_ROUTE FALSE,最后下板出现了预期的结果!
结论
这条xdc语句更像C++里的一条屏蔽错误的宏定义一样。具体的错误原因还是没有找到。但无论你的管脚要不要用板子上的晶振,出了这条报错都暂且需要这么解决。
————————————————
版权声明:本文为CSDN博主「showhands5」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43162818/article/details/89434960