Verilog FSM中不可访问状态的默认值
我有一个有3个状态的状态机。每个状态都有与之关联的特定输出值。在合成过程中,如果没有将输出分配到第4个状态,则会收到警告。没有过渡到第4个状态,因此无法访问。在第4个状态下,我应该分配什么输出 我在互联网上看到了一个例子,他们指定了“未知值”。这会提高性能吗?在某种程度上是危险的吗Verilog FSM中不可访问状态的默认值,verilog,fsm,Verilog,Fsm,我有一个有3个状态的状态机。每个状态都有与之关联的特定输出值。在合成过程中,如果没有将输出分配到第4个状态,则会收到警告。没有过渡到第4个状态,因此无法访问。在第4个状态下,我应该分配什么输出 我在互联网上看到了一个例子,他们指定了“未知值”。这会提高性能吗?在某种程度上是危险的吗 reg [1:0] state; reg [7:0] out; always @(state) begin case (state) 2'b00: out = 8'hAA;
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
我在互联网上看到了一个例子,他们指定了“未知值”。这会提高性能吗?在某种程度上是危险的吗
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
不,这并不危险。指定一个未知值可以为合成工具提供另一个优化自由度。然而,重要的是要记住,硅中不存在未知状态。换句话说,合成工具将在此状态下假定一个值。你唯一要表明的是你不在乎那种状态
但是,在代码中指定未知状态并不是真正必要的。由于您不关心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
这可能与合成工具的功能类似
请记住,虽然分配未知状态是可合成的,但与未知状态相比则不是!第39页解释了在逻辑综合过程中未知运算符的使用方式。首先,感谢您的回答。我认为您的代码版本可读性较差。另外,您如何知道这是合成器将选择的值?也许8点更有效率?是的,这就是为什么我加上“它可能类似于”。是的,通过指定“x”,合成工具可以更有效地进行优化。但是,如果您允许未知值,则很难在行为模拟和门级网络列表模拟之间建立关联。这是一种你需要决定的风格:你是否希望在你的设计中允许未知的信号。