寄存器本来可以写1后自动回0,加进去其他IP后,就无法回0
时间:10-02
整理:3721RD
点击:
碰到一很奇怪的问题,搞了两个多礼拜了,还是没法搞定,望各位大侠帮忙解答下,谢谢!
always @ (posedge clk or negedge reset_n)
if(~reset_n)
cntrl[31:0] <= 0;
else
if (cntrl[2])
cntrl[2] <= 1'b0;
else if (byte_en[0] && cntrl_write)
cntrl[2]<= regb_wdata[2];
以上是一个成熟IP的代码,我把这个简化了呈现出来。cntrl[2]有写1后,下一个clk会自动回0的功能。
cntrl寄存器共有32位,其他位的写入读出是完全OK的。cntrl[2]在我的SOC加进来的模块IP不多的情况下,读写也是正常的。但一旦我把自身的加解密IP加进去后,写1就没办法回0了。起初在Nexys4板子上用的XC7A100T的时候,LUT占用到了60%多,一度以为是资源紧张引起的问题。可后来用AC701的XC7A200T,LUT才占用不到30%,问题依旧出现。
SOC规模有点大,vivado布局布线后的网表又有点分辨不清楚,目前怀疑是不是vivado工具把这个电路给优化精简后出问题了?
是不是有其他策略设置可以避免类似情形的发生?(怕电路中仍旧隐藏一些类似的现象,只是暂时没发觉)。
vivado 2014.1, vivado 2015.3都试过了,一样的现象
用综合后的网表做下仿真就可以了。
跑综合后function仿真是OK的啊,imple后的还没仿,机器跑起来龟爬啊。
布局布线后的网表,如果不加SDF,速度还是可以接受的,如果加SDF,速度会比较慢
