我在 VHDL 测试用例上运行 modelsim 时遇到上述错误,我无法理解为什么会出现错误。
测试用例:
LIBRARY IEEE;
Use ieee.std_logic_1164.all;
entity a is
port (in11 : in std_logic
);
end a;
a 中的架构是:
component b_1
port ( in1 : in bit);
end component;
begin
inst : b_1 port map ( in1=> **to_Bit**(in11));
end a;
这是一个 modelsim 错误,实际上它应该报告您不允许在端口映射中实际使用此函数,这有效:
LIBRARY IEEE; Use ieee.std_logic_1164.all;
entity a is port (in11 : in std_logic ); end a;
architecture a of a is
signal inBit : Bit;
component b_1 port ( in1 : in bit); end component;
begin
inBit <= to_bit(in11);
inst : b_1 port map ( in1=> inBit); end a;
港口地图中的实际值存在一些限制,参见vhdl 参考:
实际的端口或信号必须用静态名称来表示 (见 6.1)。实际的(如果是表达式)必须是全局静态的 表达式(见 7.4)。
问题是,这两种情况都应该是全局静态的......
VHDL-93 允许关联列表中的类型转换和转换函数。 转换函数是只有一个参数的函数的一种特殊情况。
我们看一下
to_bit
的声明:
function to_bit(s : std_ulogic; xmap : bit := '0') return bit;
虽然
to_bit(s)
看起来像一个有效的转换函数,但事实并非如此,因为声明包含两个参数。
第二个参数 xmap
用作 is_x(s)
为 true 时的结果。
这不是 ModelSim 错误,但错误消息可能有点神秘。 ModelSim 认为
to_bit
应该是一个转换函数,但拒绝使用它,因为它有第二个参数,因此不是有效的转换函数。
一个简单的包装函数就可以解决这个问题:
function to_bit(s : std_ulogic) return bit is
begin
return to_bit(s, '0');
end;
请注意,该函数也可以具有名称
to_bit
,因为 VHDL 支持函数重载。如果能把它放在包中就好了 std_logic_1164。