verilog - 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
解决方案
我在互联网上看到了一个他们分配“未知值”的例子。这会提高性能吗?它在某种程度上是危险的吗?
不,这并不危险。分配未知值为综合工具提供了另一个优化的自由度。然而,重要的是要记住,硅中不存在未知状态。换言之,综合工具将在此状态下取值。你唯一表明的是你不关心那个状态。
但是,在您的代码中分配未知状态并不是真正必要的。由于您不关心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 页解释了在逻辑综合期间可以使用未知运算符的方式。
推荐阅读
- asp.net-core - 从 C 核心客户端到 .NET 核心服务器的 HTTPS GRPC 连接:TLS 握手失败
- c - 从管道读取后程序停留在后台
- excel - 是否可以在 excel 数据透视表中仅将报表过滤器应用于具有 vba 的一列
- firebase - 如何制定云防火墙安全规则,使登录用户只能访问他们的数据?
- java - 错误:尝试执行回滚时,未将数据库 URL 指定为参数或属性文件
- mysql - MySql InnoDB:更改表 > 添加主键:错误“行大小太大”
- c++ - 使用后声明
- javascript - 如何提供具有组合 API 的函数?
- angular - 将对象联合绑定到 ng-template
- visual-studio - 如果 Visual Studio 项目的设置取决于已更改的环境变量,则不会自动重新构建 Visual Studio 项目