我在VHDL Testcase上运行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;
答案 0 :(得分:4)
这是一个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;
有一些限制适用于端口映射中的实际值,c.f。 vhdlref:
实际的,如果是端口或信号,必须用静态名称表示 (见6.1)。实际的,如果是表达式,则必须是全局静态的 表达式(见7.4)。
问题是,两种情况都应该是全局静态的......
答案 1 :(得分:1)
VHDL-93允许关联列表中的类型转换和转换功能。 转换函数是只有一个参数的函数的特例。
让我们看看to_bit
:
function to_bit(s : std_ulogic; xmap : bit := '0') return bit;
虽然to_bit(s)
看起来像一个有效的转换函数,但它不是,因为声明包含两个参数。
当xmap
为真时,第二个参数is_x(s)
用作结果。
这是不一个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 中有这个很好。