具有整数参数的VHDL比较运算符的行为

时间:2012-03-15 16:24:09

标签: vhdl

考虑以下示例,使用VHDL-2008支持进行编译。

library ieee;
use ieee.numeric_std.all;
...
if (to_unsigned(0, 3) <= 8) then
   StatementsA
end if;
if (to_unsigned(1, 3) <= 8) then
   StatementsB
end if;

根据我的经验,StatementsA会被执行,但不会StatementsB。 逻辑上我希望两个语句都会被执行,因为0和1都小于8.我的理论是8被解释为3位数,并且最高位正在丢失,创建值为0.

问题

  1. 这是VHDL的预期行为吗?
  2. 这背后的逻辑/推理是什么?为什么不会自动将比较的大小调整为所需的整数大小?
  3. 什么是逻辑&amp;鼓励安全的做法,以避免这样的情况?

3 个答案:

答案 0 :(得分:2)

我无法确认您所看到的行为“ in your experience ”。这是我的vetsmod代码示例。

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity e is
end entity e;

architecture RTL of e is
begin
        name : process is
        begin
                if (to_unsigned(0, 3) <= 8) then
                        report "StatementsA";
                end if;
                if (to_unsigned(1, 3) <= 8) then
                        report "StatementsB";
                end if;
                wait;
        end process name;
end architecture RTL;

使用ModelSim编译并运行:

# run 5us 
# ** Note: StatementsA
#    Time: 0 ps  Iteration: 0  Instance: /e
# ** Note: StatementsB
#    Time: 0 ps  Iteration: 0  Instance: /e
#  exit 

您可以仔细检查并更新您的问题吗?

答案 1 :(得分:0)

顺便说一句,您使用的编译器是什么?我写了一个包含上述语句的小型虚拟程序,并且statementB确实执行了!我正在使用Modelsim。

答案 2 :(得分:0)

你确定你并没有真正意味着

library ieee;
use ieee.numeric_std.all;
...
if (to_unsigned(0, 3) <= 8) then
    StatementsA
elsif (to_unsigned(1, 3) <= 8) then
    StatementsB
end if;

此声明会产生您建议的行为。 VHDL在技术上并不是“短路”if-elsif-else语句。它们都将同步或异步执行;但是编译器将优先构建。

我想开发人员意识到大多数程序员都会编写if-elsif-else结构,这些结构意味着语句按特定顺序执行。为了适应这种编程感知,if-elsif-else结构的每个输出都有启用锁存器。返回TRUE的第一个条件语句启用当前条件的输出。通过这种方式,开发人员保持了我们所期望的“优先级”,同时保留了硬件描述语言的真实性。看看方块图,你会看到我的意思。我相信启用通过ANDing前一个条件的NOT和当前条件。如果先前条件为真,则对该条件语句下的所有语句关闭启用。如果为false,则对于低于该条件的所有条件都可以启用。