最近在写spi通信状态机时遇到了信号被优化掉的情况,state是我定义的状态信号,综合后在网表中没有发现这个信号,并且在状态机中赋值的其他信号addra,cnt也被优化掉了,导致这三个信号始终不会发生改变。
下面是状态机的代码,我看了很多遍都没发现state状态信号赋值、状态转移逻辑存在问题,有大佬发现问题的话麻烦告诉我
parameter BGIN = 2'b00, // 启动状态
parameter START = 2'b01, // 开始状态
parameter WAIT = 2'b10, // 等待状态
// 控制SPI通信的状态机
always @(posedge S_AXI_ACLK) begin
if (!S_AXI_ARESETN) begin
state <= BGIN;
start <=0;
addra<=10'b0;
cnt <=16'b0;
end else begin
case (state)
BGIN: begin
if (Enable) begin
if(update_ready) begin
start <= 1;
cnt <=0;
state<=START;
end
else
start <= 1;
state <= BGIN;
end else begin
start <= 0;
addra<=10'b0;
cnt<=0;
state <= BGIN;
end
end
START: begin
if(STOP_SINGLE) begin
cnt <= 0;
state <= BGIN;
end
else begin
cnt <= cnt+1'b1;
addra<=addra+1'b1;
state <= WAIT;
end
end
WAIT: begin
if(done) begin
state <= START;
end
else if (cnt==DAC_CNTNUM) begin
cnt <= 16'b0;
state <= BGIN;
end
else begin
state <= WAIT;
end
end
default: begin
start <= 0;
state <= BGIN;
end
endcase
end
end
解决方法
在定义state信号前加上(* DONT_TOUCH = "1" *) ,防止其被优化,
(* DONT_TOUCH = "1" *) reg [1:0] state = BGIN; // 状态机的状态
加上后再综合那三个信号都出现在网表中了
关于防止综合优化参考 Vivado防止信号被综合掉的三种方法。
但是为什么会被优化还是不理解,有懂的麻烦告诉我一下。