我正在为一个项目编写代码,想知道编写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完全过程,这意味着没有确切的算法总是能产生最好的结果,所以它会进行搜索。最终,它不得不停止狩猎——其中一个因素可能是时间。
我的总体目标是可读代码。所以,当一种编码风格有利于可读性,并且易于使用合成工具时——就像这里的案例一样,我倾向于使用它。