转换函数“To_bit”必须只有一个形式参数

时间:2012-10-05 07:55:07

标签: vhdl modelsim eda

我在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;

2 个答案:

答案 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 中有这个很好。