FPGA设计中时钟约束的重要性

本文探讨了FPGA设计中时钟约束的重要性,解释了时钟约束的作用,阐述了未正确约束可能导致的时序失败和竞争冒险问题。通过设置时钟约束,可以指导编译器优化布局布线,避免相位混乱。同时,介绍了如何使用set_false_path处理不同源时钟间的延迟,并提出使用异步fifo来确保数据流的正确性。良好的时钟约束对于FPGA设计的效率和稳定性至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知各位刚刚开始接触FPGA的童鞋有没发现,自己的工程综合,编译贼长时间了。

“废话,FPGA设计本来就很耗时间啊”

话是这么说,但如果编译理论上一两个小时就应该能结束,实际上却花了十几个小时,而且在生成比特文件的时候直接挂了。经常在完成implementaion 后,显示timing failed。

这种情况很大可能就是时钟没有做好约束。

有的童鞋可能就要问了,时钟约束到底是啥,有啥用,vivado不是保证逻辑正确就OK了吗?

create_clock -period 10.000 -name my_clk[get_ports refclk_p]

有的同学可能在写约束文件的时候会不知不觉加上类似这句话。这句话有什么用呢?

实际上是告诉编译器(比如vivado)这个port进来的信号时钟周期是这么多。

“还是不懂啊”

假如一个时钟需要驱动另外一个模块,时钟信号进入模块的时候经过一个buffer。这样就生成了经过buffer后的时钟(称之为Clk后),和经过buffer前的时钟(称之为Clk前)。那么编译器默认这两个时钟信号应该是同一个时钟源。但是由于进入的端口到buffer的走线长度,以及本身信号经过buffer产生的延迟,这两个时钟肯定不是同相的。如果工程比较复杂,经过buffer比较多,会出现什么情况呢?两个时钟的相位完全乱掉。可能Clk前状态还是高,而Clk后的状态是低。这样就会形成竞争冒险。

而约束了时钟周期后,vivado心里至少有个数,

“这个时钟频率挺高的,那我优化的时候,buffer放得离port近一些,延迟尽量低一些”

但是没啥用啊,buffer有时候必须放那么多,buffer的延迟减少不了,软件opt的时候优化了半天,route布线了半天也没啥结果。于是把Timing的结果告诉你,这里时序有点问题,但是如果你觉得没啥事情也能继续跑。

那就只能降时钟频率了?

恭喜你,没法完成甲方需求,项目经理要找你了。

这个时候怎么办呢?

干脆和viv

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值