FSM 中不可达状态的默认值
Default value for unreachable states in FSM
我有一个有 3 个状态的状态机。每个状态都有与之关联的特定输出值。在综合过程中,如果我没有在第 4 状态下分配输出,我会收到警告。没有到第 4 个状态的转换,因此它是不可到达的。我应该在第 4 个状态分配什么输出?
我在网上看到一个例子,他们分配 "Unknown value"。这会提高性能吗?它在某种程度上是危险的吗?
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
I saw an example on the internet where they assigned "Unknown value". Does this improve performance? Is it dangerous in some way?
不,这并不危险。分配未知值为综合工具提供了另一个优化自由度。然而,重要的是要记住,硅中不存在未知状态。换句话说,综合工具将在此状态期间假定一个值。你唯一表示的是你不关心那个状态。
但是,在您的代码中分配一个未知状态并不是真正必要的。由于您不关心 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
这可能类似于综合工具的作用。
请记住,虽然分配未知状态是可合成的,但与未知状态进行比较则不然! The Verilog Hardware Description Language (5th edition) by Thomas & Moorby's 在第 39 页解释了在逻辑综合过程中可以使用哪种方式使用未知运算符。
我有一个有 3 个状态的状态机。每个状态都有与之关联的特定输出值。在综合过程中,如果我没有在第 4 状态下分配输出,我会收到警告。没有到第 4 个状态的转换,因此它是不可到达的。我应该在第 4 个状态分配什么输出?
我在网上看到一个例子,他们分配 "Unknown value"。这会提高性能吗?它在某种程度上是危险的吗?
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
I saw an example on the internet where they assigned "Unknown value". Does this improve performance? Is it dangerous in some way?
不,这并不危险。分配未知值为综合工具提供了另一个优化自由度。然而,重要的是要记住,硅中不存在未知状态。换句话说,综合工具将在此状态期间假定一个值。你唯一表示的是你不关心那个状态。
但是,在您的代码中分配一个未知状态并不是真正必要的。由于您不关心 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
这可能类似于综合工具的作用。
请记住,虽然分配未知状态是可合成的,但与未知状态进行比较则不然! The Verilog Hardware Description Language (5th edition) by Thomas & Moorby's 在第 39 页解释了在逻辑综合过程中可以使用哪种方式使用未知运算符。