Vivado [Place 30-574] Poor placement for routing between an IO pin and BUFG 尝试解决

场景

  1. Vivado版本: 2016.4
  2. FPGA开发板:NEXYS 4 DDR
  3. 所在项目: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++里的一条屏蔽错误的宏定义一样。具体的错误原因还是没有找到。但无论你的管脚要不要用板子上的晶振,出了这条报错都暂且需要这么解决。

你可能感兴趣的:(Verilog)