Spyglass检查之状态机

本文翻译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组成活锁
在这里插入图片描述

Guess you like

Origin blog.csdn.net/zhong_ethan/article/details/106648589