VHDL反转if以减少嵌套

VHDL反转if以减少嵌套,vhdl,readability,Vhdl,Readability,对于C#,通常建议您反转if语句以减少嵌套的if-语句的数量 例如,它建议使用以下代码: private void Foo() { 如果(某些条件) { //一些行动 } } 可转换为: private void Foo() { 如果(!someCondition)返回; //一些行动 } 有没有类似的方法可以用VHDL代码实现这一点?即使有可能,是否有充分的理由在VHDL中避免这种编码风格 我想知道是否有可能在VHDL中实现类似的功能 进程(时钟) 开始 如果(上升沿(时钟)),则 --一

对于C#,通常建议您反转
if
语句以减少嵌套的
if
-语句的数量

例如,它建议使用以下代码:

private void Foo()
{
如果(某些条件)
{
//一些行动
}
}
可转换为:

private void Foo()
{
如果(!someCondition)返回;
//一些行动
}
有没有类似的方法可以用VHDL代码实现这一点?即使有可能,是否有充分的理由在VHDL中避免这种编码风格

我想知道是否有可能在VHDL中实现类似的功能

进程(时钟)
开始
如果(上升沿(时钟)),则
--一些行动
如果结束;
结束过程;
变成

进程(时钟)
开始
如果(非上升沿(时钟)),则
返回;
如果结束;
--一些行动
结束过程;

您建议的策略称为提前返回,因为您提前从函数返回, 在到达终点之前。它可以在VHDL中完成,并且与其他语言一样有用,但缺点是它只能在子程序中使用。您不能从流程中“返回”

理论上,您可以将代码从流程内部移动到过程中,但这无助于实现您想要的目标。我建议您阅读第6.3节-并发过程调用语句
从Ashenden的设计师指南到VHDL,了解细节。简言之,在过程中如何使用wait语句有很多限制。

当然,VHDL进程不会提前返回,因为您不会从进程返回

除了从子程序(过程或函数)提前返回外,还有类似的方法来帮助构造循环:
退出(终止循环)和
下一步(终止当前迭代)

这些可以嵌入到示例中的
if
语句中,但有一种更方便、可读的形式:

loop
   ...
   exit when A = '1';
   ...
   next when B = '1';
   ...
end loop;
重点是什么?(Resharper是否描述了您为什么要这样做?)

我对在VHDL语言中实现这一点的想法:

在可合成代码中,很有可能——无论你用什么诡计“优化”你的逻辑——如果结果是相同的功能,合成器(几乎)总是(以我的经验)找到逻辑等价性,这意味着对于相同的函数,它最终会得到与直接编写时相同的最佳逻辑。(欢迎反例!)

在tetsbench代码中,我想您可能可以使用相同的循环

从代码可读性的角度来看:可能会有好处,但如果您有那么多嵌套的
if
s,那么您的整体结构可能需要重新思考…

不要这样做

非上升沿(时钟)
不保证IEEE可合成逻辑标准可合成。如果你知道有什么工具可以合成这个,我很想知道

此外,您不会得到任何好处,因为(正如其他回复者所说,
return
语句在流程中无效

试试看:尽管这种风格行不通,但这是一个合理的建议。
如果您想了解非传统的代码编写方法,最好的方法是编写、模拟和综合代码。通过实验,您将学到很多,并最终成为团队中最聪明的设计师。

您不需要在VHDL中的
if
语句中添加额外的括号。您可以将
if(不上升沿(时钟))然后
转换为可读性更强的
if(不上升沿(时钟))然后
。Resharper提出了提高可读性的建议。本文对此进行了讨论