首页 > 解决方案 > FSM 中不可达状态的默认值

问题描述

我有一个具有 3 个状态的状态机。每个状态都有与之关联的特定输出值。在综合过程中,如果我没有将输出分配到第 4 个状态,我会收到警告。没有到第 4 个状态的转换,因此无法访问。我应该在第 4 个状态下分配哪些输出?

我在互联网上看到了一个他们分配“未知值”的例子。这会提高性能吗?它在某种程度上是危险的吗?

reg [1:0] state;
reg [7:0] out;

always @(state) begin
    case (state)
        2'b00: out = 8'hAA;
        2'b01: out = 8'hBB;
        2'b10: out = 8'hCC;
        default: out = 8'bxxxx_xxxx;
    endcase
end

标签: verilogfsm

解决方案


我在互联网上看到了一个他们分配“未知值”的例子。这会提高性能吗?它在某种程度上是危险的吗?

不,这并不危险。分配未知值为综合工具提供了另一个优化的自由度。然而,重要的是要记住,硅中不存在未知状态。换言之,综合工具将在此状态下取值。你唯一表明的是你不关心那个状态。

但是,在您的代码中分配未知状态并不是真正必要的。由于您不关心2'b11状态(因为它无法访问),您可以简单地执行以下操作:

reg [1:0] state;
reg [7:0] out;

always @(state) begin
    case (state)
        2'b00: out = 8'hAA;
        2'b01: out = 8'hBB;
        default: out = 8'hCC;
    endcase
end

这可能类似于综合工具所做的事情。

请记住,虽然分配未知状态是可合成的,但与未知状态相比却不是!Thomas & Moorby's 的 Verilog 硬件描述语言(第 5 版)在第 39 页解释了在逻辑综合期间可以使用未知运算符的方式。


推荐阅读