Vivado综合报错:case项4'b0110不可达问题咨询
delay_t(4'b0110)状态不可达问题 以下是针对性的排查方向:
检查跳转条件的逻辑有效性
逐行核对所有指向4'b0110的跳转代码,确认条件表达式是否存在逻辑矛盾(比如互斥条件用&&连接)、变量是否被硬编码为固定值导致条件恒假。例如:如果跳转条件是cnt == 10 && cnt == 20,这种矛盾条件永远无法触发。验证状态变量与case分支的位宽匹配
确认状态寄存器的位宽是否和case语句中的状态编码位宽一致。如果状态寄存器定义为reg [2:0] state;,但你写了4'b0110,综合器会自动截断为3'b110,若代码中无对应跳转,就会判定4'b0110不可达。排查default分支的覆盖范围
查看case语句的default分支是否在逻辑上提前覆盖了4'b0110的匹配场景。比如其他分支的条件包含了4'b0110的状态位组合,导致综合器认为该状态永远不会被匹配到。检查综合优化对状态的影响
打开Vivado综合报告的状态机分析部分,确认delay_t是否被综合器优化剔除。如果该状态的输出与其他状态完全一致,或者进入后无任何有效操作,综合器会将其合并或删除,进而提示不可达。可尝试添加(* fsm_encoding = "user" *)约束,或关闭状态机自动优化选项重新综合。确认前置状态的可达性
检查delay_t的所有前置状态是否本身可达。如果前置状态因为死循环、条件恒假等原因无法进入,自然不会有路径跳转到delay_t。核对状态编码的正确性
确认其他状态的编码没有与4'b0110重复,同时检查跳转语句中是否误写了编码(比如把4'b0110写成4'b0101),导致实际没有代码触发该状态。
内容的提问来源于stack exchange,提问作者tenet tenet

