本文翻译spyglass检查中的 Av_fsm_analysis 规则。
无法到达的状态
RTL中有两种情况会出现无法达到的状态:
- 没有条件跳转到这个状态
- 有条件,但条件不会被触发
死锁状态
RTL有两种情况会出现死锁状态:
- 没有条件跳出这个状态
- 跳出条件不会被触发
无效跳转条件
指的是跳转条件不会被触发。这种情况有可能会导致无法到达的状态或者死锁状态。
活锁
活锁指的就是状态机只在一部分状态中循环。当以下两种情况同时出现时,状态机会引起活锁:
- 活锁中的状态数量小于状态机中所有状态的数量;
- 没有条件可以从活锁状态中退出
举例
RTL
`define S0 5b00000
`define S1 5b00001
`define S2 5b00010
`define S3 5b00011
`define S4 5b00100
`define S5 5b00101
`define S6 5b00110
`define S7 5b00111
`define S8 5b01000
`define 59 5b01001
module Fsm(input rst, clk, in, en1, en2, en3, en4, output reg out);
reg [15:0] counter;
always @(posedge clk or posedge rst) begin
if(rst) begin
counter <=0;
out <=1b0;
end else begin
counter <= counter+1;
out<= state[3] & in;
end
end
always @(posedge clk or posedge rst) begin
if(rst) begin
state <= `S0;
end else begin
case(state)
`S0:
if(en1) begin
state < `S1;
end else if(en2) begin
state < `S2;
end else begin
state <=`S3;
end
`S1:
if(courter >=16b0011111111111111)begin
state <=`S4;
end
`s2:
state<=`S5;
`S3:
if(en3) begin
state<=S5
end
`s5:
if(en3 ==0) begin
state<=`S6;
end else if(en3 =1) begin
state<=`S9;
end else begin
state<= `S0;
end
`S6:
state<=`S7:
`S7:
state<=`S8;
`S8:
if(en3)begin
state<=`S6;
end
`S9:
if(en1 || en2)begin
state <=S4
end
endcase
end
end
endmodule
约束文件:
current_design Fsm
clock -name Fsm.clk -period 10
reset -name Fsm.rst -value 1
set_case_analysis -name Fsm.en1 -value 0
set_case_analysis -name Fsm.en2 -value 0
例子中的状态机在约束文件的作用下,S1,S2,S4是无法达到的状态,S9是死锁状态,S6,S7,S8组成活锁