Vhdl 如何修改modelsim完成的初始化?

Vhdl 如何修改modelsim完成的初始化?,vhdl,modelsim,Vhdl,Modelsim,我的问题与modelsim完成的初始化有关。 我想使用特定范围内的整数(例如,范围0到511)。 以下是VHDL中的声明: signal cnt : natural range 0 to 511; 如果我没有初始化此信号(例如在重置中),modelsim将默认分配最左边的值。我的信号是0 我的问题是,我想强制modelsim在模拟中将其值初始化为“U”或“X”,而不是最左边的值,有可能吗?可以在声明时为信号提供一个初始化值: signal foo: foo_type := foo_type_v

我的问题与modelsim完成的初始化有关。 我想使用特定范围内的整数(例如,范围0到511)。 以下是VHDL中的声明:

signal cnt : natural range 0 to 511;
如果我没有初始化此信号(例如在重置中),modelsim将默认分配最左边的值。我的信号是0


我的问题是,我想强制modelsim在模拟中将其值初始化为“U”或“X”,而不是最左边的值,有可能吗?

可以在声明时为信号提供一个初始化值:

signal foo: foo_type := foo_type_value;
注意
:=
赋值运算符,对于信号而言,它可能有点违反直觉

但是,不可能将
'U'
'X'
分配给类型为
自然
的信号,因为它们不是
自然
值。相反,您可以做的是确定值512相当于信号的
U
,并在声明时分配:

signal cnt : natural range 0 to 512 := 512;
由于此额外值不应在初始化后使用,您可以(应该)添加并发断言以检测不需要的情况:

assert cnt /= 512 report "Ooops! cnt=512" severity warning;
另一种选择是使用ieee.numeric_std.unsigned而不是
natural

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
signal cnt : unsigned(8 downto 0) := (others => 'U');

但在使用之前,请确保您了解其中的差异。例如,如果您试图在其值为0时减少自然
cnt
,您将得到一个错误,而
unsigned
版本
cnt
将自动换行到
“111111111”

你好,雷诺,感谢您花时间回答。我的问题不清楚。当我们对未初始化的范围使用整数时,模拟工具(我使用的是modelsim)将范围的最左边的值分配给它们。我想知道,当“范围”整数未初始化时(我没有在modelsim.ini中定义),是否无法更改此规则并给出一个随机值。在我的设计中,一些量程信号没有初始化,并且取最左边的值,该值始终为0。问题是我们不知道合成器将为这些未初始化的信号分配哪个值。我想我理解你的观点。但是,如果初始化值很重要,为什么不使用重置来正确地强制所有内部寄存器为预定义(和常量)值呢?然后,您将以重置阶段开始模拟,并保证硬件将像模拟一样工作(当然,如果硬件在通电后也重置)。你的信号的初始值将不再相关。@Matthieu你能在你的问题中澄清这一点吗。你到底想要实现什么?这不是模拟器的规则,而是VHDL中的规则,所有对象都使用最左边的值进行初始化:
T'left
,其中
T
是用于声明对象的子类型:
O'subtype'left
。合成器和模拟器对于类型
std_logic
具有相同的行为,它被简化为
01Z
。A
natural
是一种数字类型U'和X'是不可能的。