请教一下各位,我用的artix 7 100t芯片,vivado2019,我写了一个串口接收模块,功能调试好了以后,在这个代码里面有ila的时候,模块功能就是正常的,当我把ila注释掉了以后,功能就不对了,具体就是里面有个reg rxFinish,用来指示是否接收完成,在正常接收情况下,有ila的时候rxFinish可以取到1,没有ila的时候rxFinish不会等于1,我试过把这个模块里面的所有reg 和 wire 前面都加上(* dont_touch = "true" *)了的,但是都没用,必须要加上ila才行,这个串口接收模块是在多个地方例化了的,太奇怪了,请各位帮助分析一下这是什么情况,感谢
部分代码如下
always@(posedge clk50m)begin
case(stateRx)
0:begin
if(RX == 0)begin
stateRx <= 1;
beginCnt<=1;
end
rxFinish<=0;
end
1:begin//startBit
if(BaudePulse == 1)begin
stateRx<= 2;
bitCntRx<=0;
end
end
2:begin//data bit
if(halfBaudPulse == 1)begin
bitCntRx<= bitCntRx + 1;
rxBuffer[bitCntRx] <= RX;
if(bitCntRx >= 7)begin
stateRx <= 3;
end
end
end
3:begin // stop bit
if(halfBaudPulse == 1)begin
beginCnt <= 0;
stateRx <= 0;
rxFinish<=1;
end
end
default:begin
stateRx<=0;
end
endcase
end
ila_0 your_instance_name (
.clk(clk50m), // input wire clk
.probe0(RX), // input wire [0:0] probe0
.probe1(BaudePulse), // input wire [0:0] probe1
.probe2(rxFinish), // input wire [0:0] probe2
.probe3(halfBaudPulse), // input wire [0:0] probe3
.probe4(0), // input wire [15:0] probe4
.probe5(stateRx) // input wire [7:0] probe5
);
ARTIX-7讲解vivado基本使用流程
https://blog.csdn.net/weixin_43529932/article/details/106983712
后来我发现是case(stateRx)等于0那里,判断rx为0的时候,把beginCnt赋值为1,case状态跳到1状态去等着波特率信号,beginCnt是用来开启波特率计数的,但是有时候case在1状态beginCnt居然不等于1,说明beginCnt在case 0状态检测到RX 为低电平的时候给beginCnt赋值居然失败了,这就无法解释了,verilog reg变量赋值居然会不成功,请各位帮助分析一下
fpga 在综合后会优化代码,这个优化可能会影响你代码的逻辑,会优化掉你的一些逻辑。
在加入ila时,一些原本优化掉的信号或逻辑,由于信号中加入了ila ,这些优化会放弃,加了ila 反而使功能正常了。
这应该还是该模块的逻辑设计有问题。
也可以手动用 keep 去标记这些可能被优化掉的信号,强制编译器不优化这些信号
(*keep*) reg xxx
(*keep*) wire xxx