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

问题描述 投票:0回答:2

我在 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;
vhdl modelsim
2个回答
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;

港口地图中的实际值存在一些限制,参见vhdl 参考:

实际的端口或信号必须用静态名称来表示 (见 6.1)。实际的(如果是表达式)必须是全局静态的 表达式(见 7.4)。

问题是,这两种情况都应该是全局静态的......


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.