2

我在 VHDL 测试用例上运行 modelsim 时遇到错误,我无法理解为什么这是一个错误。

测试用例:

LIBRARY IEEE;
Use ieee.std_logic_1164.all;

entity a is
port (in11 : in std_logic
);
end a;

a的架构a是:

component b_1 
 port ( in1 : in bit);
end component;


begin
   inst : b_1 port  map ( in1=> **to_Bit**(in11));
end a;
4

2 回答 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;

有一些限制适用于端口映射中的实际值,参见 vhdlref:

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

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

于 2012-10-05T08:05:11.130 回答
0

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

于 2017-04-19T10:39:26.167 回答