项目场景:
目前在做FPGA验证,使用到了synplify+vivado的流程(rtl使用了synopsys的ip,vivado似乎不能直接使用,而且vivado读取rtl文件时间也很长,需要3-4个小时才能读取完,主要是工程有点大,源文件比较多,用synplify可以提高效率),
问题描述
在FPGA测试时,AXI总线没有数据(VCS仿真了FPGA环境,系统可以正常运行),以为是时序问题(工程太大了,跑vivado的时候关闭了report,fpga时钟频率也很低,只有二十几兆,就没有care timing),删减了大部分逻辑,跑了个简化版的,仍然不行(从rtl到net就不行了,有点蒙)
没办法,只好抓几个信号了,一看波形aready没有。。。(更蒙了),master一直在等待slave的ready(仿真波形,ready在释放rstn后置位),fpga波形是没法抓了,跑一次vivado,需要一天时间,效率太低了,找到原因得猴年马月了,灵机一动,把网表写出来用vcs仿真
追踪波形,发现时钟没了。。。。对比了下rtl和net,时钟被更改了。。。活见鬼
原因分析:
rtl 源设计:
寄存器时钟来源于source clk 和他的分频时钟
always @ (posedge clk or negedge rstn)
if (!rstn ) clk_div <= 'd0;
else if (div_en) clk_div <= ~clk_div;
wire clk_gate = clk_gate_en &clk;
wire clk1 = clk_gate | clk_div;
always @ (posedge clk1 or negedge rstn)
if (!rstn) reg1 <= 'd0;
else ...
从逻辑上来看,综合后reg1的时钟应该是源时钟和分频时钟组合后的时钟,如下图所示
但根据net来,却只有源时钟一个来源,分频时钟不见了。。。
为了确定时vivado综合出的问题还是synplify,又查看了edf的原理图,一样的结构,时钟被修改了。。。使用了clk1的寄存器,时钟来源都是原始值clk(gate时钟会被disable),分频时钟被认定为signal,导致寄存器没有时钟,无法触发
看了下synplify脚本,分频时钟没有定义(前期调试,时钟没有约束完,而且以往的dc经验告诉我,即使不约束也不会出现这种问题)
解决方案:
提示:这里填写该问题的具体解决方案:
添加时钟约束,从新跑synplify综合,分频时钟被识别到了。。。。由于没有定义为时钟,把分频时钟clk_div从寄存器的clk端移除,连接到数据通路,这个原因有点不理解