一、(* fsm_safe_state = "default_state" *)
这个属性是用于确保有限状态机(FSM)在异常情况下能够恢复到安全状态的重要指令。
1、作用:
指定当状态机发生异常或未定义行为时,强制恢复到指定的安全状态。
2、语法:
(* fsm_safe_state = "state_name" *)
二、使用示例
1、基础用法:
module safe_fsm (
input wire clk,
input wire rst_n,
input wire trigger,
output reg [1:0] status
);
// 状态定义
localparam IDLE = 2'b00;
localparam WORKING = 2'b01;
localparam DONE = 2'b10;
// 注意:2'b11 是未定义状态
(* fsm_safe_state = "IDLE" *)
reg [1:0] current_state, next_state;
// 状态寄存器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
current_state <= IDLE;
end else begin
current_state <= next_state;
end
end
// 状态转移逻辑
always @(*) begin
case (current_state)
IDLE: begin
status = 2'b00;
next_state = trigger ? WORKING : IDLE;
end
WORKING: begin
status = 2'b01;
next_state = DONE;
end
DONE: begin
status = 2'b10;
next_state = IDLE;
end
default: begin
status = 2'b00;
next_state = IDLE; // 安全恢复
end
endcase
end
endmodule
2、更复杂的安全状态机:
module traffic_light_fsm (
input wire clk,
input wire rst_n,
input wire emergency,
output reg [2:0] light // [red, yellow, green]
);
// 状态定义
localparam RED = 3'b001;
localparam YELLOW = 3'b010;
localparam GREEN = 3'b100;
localparam ALL_RED = 3'b001; // 安全状态
(* fsm_safe_state = "ALL_RED" *)
reg [2:0] state, next_state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= RED;
end else begin
state <= next_state;
end
end
always @(*) begin
case (state)
RED: begin
light = 3'b001;
next_state = emergency ? RED : GREEN;
end
GREEN: begin
light = 3'b100;
next_state = emergency ? RED : YELLOW;
end
YELLOW: begin
light = 3'b010;
next_state = emergency ? RED : RED;
end
default: begin
light = 3'b001; // 强制红灯
next_state = RED;
end
endcase
end
endmodule
三、综合效果
1、硬件实现
工具会生成额外的逻辑来检测非法状态并恢复:
-
状态寄存器编码验证
-
自动恢复电路
-
安全状态强制逻辑
2.、可靠性提升
-
抗辐照能力:防止宇宙射线等导致的位翻转
-
电源噪声免疫:电压波动时的状态保护
-
时序违例恢复:时钟偏移时的安全恢复
四、最佳实践
1、选择合适的安全状态
// 好的安全状态:停止、空闲、复位状态 (* fsm_safe_state = "IDLE" *) (* fsm_safe_state = "STOP" *) (* fsm_safe_state = "SAFE_MODE" *) // 避免的安全状态:可能引起危险操作的状态 // (* fsm_safe_state = "MOTOR_ON" *) // 危险! // (* fsm_safe_state = "HEATER_ON" *) // 危险!
2、结合其他安全属性
(* fsm_safe_state = "IDLE" *) (* fsm_encoding = "safe" *) // 使用安全编码 (* fsm_extract = "yes" *) // 明确提取为FSM reg [2:0] state;
3、完整的安全FSM模板
module safe_fsm_template (
input wire clk,
input wire rst_n
);
localparam SAFE_STATE = 3'b000;
localparam STATE_A = 3'b001;
localparam STATE_B = 3'b010;
localparam STATE_C = 3'b100;
(* fsm_safe_state = "SAFE_STATE" *)
(* fsm_encoding = "gray" *) // 使用格雷码减少位翻转影响
reg [2:0] current_state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
current_state <= SAFE_STATE;
end else begin
case (current_state)
SAFE_STATE: current_state <= STATE_A;
STATE_A: current_state <= STATE_B;
STATE_B: current_state <= STATE_C;
STATE_C: current_state <= SAFE_STATE;
default: current_state <= SAFE_STATE; // 硬件安全网
endcase
end
end
endmodule
五、适用场景
-
安全关键系统
-
汽车电子
-
医疗设备
-
工业控制
-
-
高可靠性应用
-
航空航天
-
通信基础设施
-
金融系统
-
-
恶劣环境
-
高辐射环境
-
极端温度
-
电源不稳定的场合
-
这个属性是提高数字系统可靠性的重要手段,特别是在对安全性要求高的应用中。
FSM安全状态设计与应用
637

被折叠的 条评论
为什么被折叠?



