VHDL反转是否减少嵌套

时间:2014-03-14 19:11:41

标签: vhdl readability

对于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;

4 个答案:

答案 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,你的整体结构可能需要重新思考......