Vhdl 为什么数组更新会损坏元素值?

Vhdl 为什么数组更新会损坏元素值?,vhdl,clash,Vhdl,Clash,下面的独立VHDL文件是从CLaSH的输出简化而来的,这应该可以解释它有点奇怪的结构 目的是在循环中增加s.tup2_sel1(0),其中s.tup2_sel0为“01”。然而,我在VHDL模拟器中看到的是,输出(因此,s.tup2_sel1(0))在数组更新后变为unknoqn(其值为“xxxxxxx”)。为什么数组元素会损坏 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use work.all;

下面的独立VHDL文件是从CLaSH的输出简化而来的,这应该可以解释它有点奇怪的结构

目的是在循环中增加
s.tup2_sel1(0)
,其中
s.tup2_sel0
“01”
。然而,我在VHDL模拟器中看到的是,
输出
(因此,
s.tup2_sel1(0)
)在数组更新后变为unknoqn(其值为
“xxxxxxx”
)。为什么数组元素会损坏

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.all;

entity CHIP8 is
  port(-- clock
       CLK    : in std_logic;
       -- asynchronous reset: active high
       RESET  : in std_logic;
       OUTPUT : out unsigned(7 downto 0));

  type array_of_unsigned_8 is array (integer range <>) of unsigned(7 downto 0);

  type tup2 is record
    tup2_sel0 : std_logic_vector(1 downto 0);
    tup2_sel1 : array_of_unsigned_8(0 to 1);
  end record;

end;

architecture structural of CHIP8 is
  signal y1 : array_of_unsigned_8(0 to 1);
  signal s  : tup2;
  signal s1 : tup2;
  signal y  : array_of_unsigned_8(0 to 1);
  signal x  : unsigned(7 downto 0);
begin
  y <= s.tup2_sel1;
  x <= y(0);

  process(y)
    variable ivec : array_of_unsigned_8(0 to 1);
  begin
    ivec := y;
    ivec(0) := x + 1;
    y1 <= ivec;
  end process;

  with s.tup2_sel0 select
    s1 <= (tup2_sel0 => "01", tup2_sel1 => y) when "00",
          (tup2_sel0 => "10", tup2_sel1 => y1) when "01",
          (tup2_sel0 => "10", tup2_sel1 => y) when others;

  process(CLK,RESET)
  begin
    if RESET = '1' then
      s <= (tup2_sel0 => "00", tup2_sel1 => array_of_unsigned_8'(0 to 1 => to_unsigned(0,8)));
    elsif rising_edge(CLK) then
      s <= s1;
    end if;
  end process;

  OUTPUT <= x;
end;

过程(y)
的灵敏度列表中缺少信号
x
。这可能是有意的,但在99%的情况下,这是一个错误

因为它是生成的代码,所以我无法判断编写代码发射器的人是否是像我这样聪明的VHDL程序员,他们知道敏感度列表是一种语法糖分,或者他们只是错过了向敏感度列表添加更多信号

敏感度列表是如何翻译的?
请参见此示例:

process(y, x)
begin
  -- some code
end process;
翻译为:

process
begin
  -- some code
  wait on y, x;
end process;
因此,如果他们聪明,他们可以推测只在
y
事件上恢复一个过程,而不是在“x”事件上。一些VHDL大师可能会使用它来优化流程唤醒,其他人则会称之为棘手的代码行


当信号包含诸如
U
-
X
W
之类的元值时,可以生成
X
值,并使用诸如
+1
之类的算术运算

除了重置条件外,我没有看到
tup2\u sel1
的任何初始值。

那么,您是否在模拟中应用了重置?

x
过程(y)
的灵敏度列表中缺失。这可能是有意的,但在99%的情况下,这是一个错误<当信号包含元值且使用
+1
时,可以生成code>X。除了重置条件外,我没有看到
tup2\u sel1
的任何初始值。那么,你在模拟中应用了
RESET
了吗?@Paebbels:是的,我在顶级测试台外部应用了RESET。也许我应该在问题中加入它的代码。虽然你的问题不是一个简单的问题,但值得去搜索那些答案是从过程敏感性列表中添加缺失信号的问题。如果吉姆·刘易斯读到这篇文章,他会推荐-2008和灵敏度列表中的单一元素
all
。(在这里标记过程语句很有用)。@user1155120:那么,让我们把这个带到meta;因为这里的情况是,只有在知道实际的解决方案/解释后,才有可能使代码变得“更简单”。在Paebbels发表有益的评论之前,我不知道我应该关注的仅仅是这一个过程。这对我来说是最低限度的:这个问题开始于我注意到CPU中约300行冲突中的错误,我将其简化为发出VHDL的东西,然后我将其简化为这个。总之,它是从大约6000行VHDL开始的。)。IEEE Std 1076.6-2004,RTL合成(撤销)要求模拟匹配(5.验证方法)“使用模拟验证合成结果的过程包括将等效输入应用于原始模型和合成模型,然后比较其输出,以确保其等效。”,6.4组合逻辑“对于组合逻辑,过程敏感度列表应列出过程声明中读取的所有信号。”)模型并不等效。
x
上缺失的敏感度并非故意的;事实上,它的缺失似乎是重新出现了一个被认为已修复的冲突错误:
process
begin
  -- some code
  wait on y, x;
end process;