在 VHDL 中创建状态机的更好方法是什么(if 语句或时间)



我正在为一个项目编写代码,想知道编写VHDL状态机的最佳代码实践是什么:

是吗

if(state = state1) then
do_something;
elsif(state = state2) then
do_something;
elsif(state = state3) then
etc ...
end if;

或:

case state
when state1 =>
do_someting;
when state2 =>
do_something;
etc ...
end case;

就可读性和代码效率而言,什么是最好的?

两者皆有。注意事项。

由于状态是相互不相交的(不能同时处于状态1和状态2(,语义是相同的(不同于"如果"的其他用法,后者优先考虑第一个分支(。

无论哪种方式,都不要忽视完整性("else"或"when others"(,即使;否则为空";只是为了让验证团队满意你没有忘记它。

如果你在高可靠性的环境中工作(例如,辐射会导致SEU状态变化,而你无法轻易将修理工送入轨道(,请使用安全或稳健的状态机实践

这两者都清楚地传达了您的意图,因此这方面是好的。

对于合成,使用case,您告诉合成工具每个条件都是互斥的。

使用if,默认情况下您正在构建一个优先级结构。然后你要求综合工具来找出逻辑是互斥的。

对于状态机的外层,即状态解码器,我建议使用case语句,而不是if语句。多路复用器也是如此。

令人担忧的是,合成是一个NP完全过程,这意味着没有确切的算法总是能产生最好的结果,所以它会进行搜索。最终,它不得不停止狩猎——其中一个因素可能是时间。

我的总体目标是可读代码。所以,当一种编码风格有利于可读性,并且易于使用合成工具时——就像这里的案例一样,我倾向于使用它。

最新更新