对于C#,JetBrains ReSharper经常建议您反转if
语句以减少嵌套if
语句的数量。
例如,它建议使用以下代码:
private void Foo()
{
if (someCondition)
{
// Some action
}
}
可以转换为:
private void Foo()
{
if (!someCondition) return;
// Some action
}
使用VHDL代码有类似的方法吗?即使有可能,有没有充分的理由在VHDL中避免这种编码风格?
我想知道是否有可能在VHDL中实现这样的目标
process(clock)
begin
if (rising_edge(clock)) then
-- Some action
end if;
end process;
变为
process(clock)
begin
if (not rising_edge(clock)) then
return;
end if;
-- Some action
end process;
答案 0 :(得分:1)
当然,VHDL流程没有提前返回,因为您不能从流程中返回...
除了从子程序(过程或函数)提前返回之外,还有类似的方法来帮助构造循环:exit
(终止循环)和next
(终止当前迭代)。
这些可以嵌入到if
语句中,如您的示例中所示,但这是一种更方便和可读的形式:
loop
...
exit when A = '1';
...
next when B = '1';
...
end loop;
答案 1 :(得分:1)
别。
not rising_edge(clock)
不能保证可通过IEEE可合成逻辑标准进行综合。如果你知道任何合成这个的工具,我很想知道。
此外,您将无法获得任何收益,因为(正如其他回复者所述)return
声明在流程中无效。
尝试一下:即使这种特殊风格不起作用,这也是一个公平的建议。 如果你想了解编写代码的非传统方法,最好的方法是编写代码,模拟它并合成它。通过实验,您将学到很多东西,最终成为团队中最聪明的设计师。
答案 2 :(得分:0)
您建议的策略称为提前返回因为您早期从函数返回, 在达到目的之前。它可以用VHDL完成,它和其他语言一样有用,但缺点是它只能用在子程序中。你不能从一个过程“返回”。
理论上,您可以将代码从进程内部移动到一个过程,但它无法实现您想要的功能。我建议您阅读第6.3节 - 并发过程调用语句 来自Ashenden的 Designer VHDL指南以了解详细信息。简而言之,对于如何在过程中使用 wait 语句有很多限制。
答案 3 :(得分:0)
重点是什么? (Resharper是否描述为什么你想要这样做?)
我想在VHDL-land中这样做:
在可合成代码中,很可能是 - 无论你是什么恶作剧,都可以优化"你的逻辑 - 如果结果是相同的功能,合成器将(几乎)总是(根据我的经验)找到逻辑等效,这意味着它最终具有相同功能的相同最佳逻辑,就像你直接写它时一样办法。 (反例欢迎!)
在tetsbench代码中,我猜你可能能够进行相同的循环吗?
从代码可读性的角度来看:可能会有所收获,但是如果你拥有那么多嵌套的if
,你的整体结构可能需要重新思考......