VHDL:内部信号未定义,即使在架构声明部分中定义

VHDL:内部信号未定义,即使在架构声明部分中定义,vhdl,test-bench,alu,Vhdl,Test Bench,Alu,所以我一直在为我的VHDL课程做一些家庭作业,我似乎不理解这个问题。 这里的要点是创建一个ALU的加法器/减法器,它同时在2的补码和无符号32位总线上工作,这就是为什么我有一个称为sub_模式(a-B=a+!B+1)的条件,当激活时它也将是进位。 其余的不同输入和输出都是不言自明的。 我的问题是这种组件的测试台,即使carry_temp和r_temp已经在体系结构的声明部分进行了初始化,但最终显示为未定义。我猜这是由于过程中的for循环把一切都搞砸了。这是一个准确的猜测吗?如果是,是否可以继续将

所以我一直在为我的VHDL课程做一些家庭作业,我似乎不理解这个问题。 这里的要点是创建一个ALU的加法器/减法器,它同时在2的补码和无符号32位总线上工作,这就是为什么我有一个称为sub_模式(a-B=a+!B+1)的条件,当激活时它也将是进位。 其余的不同输入和输出都是不言自明的。 我的问题是这种组件的测试台,即使carry_temp和r_temp已经在体系结构的声明部分进行了初始化,但最终显示为未定义。我猜这是由于过程中的for循环把一切都搞砸了。这是一个准确的猜测吗?如果是,是否可以继续将两位总线相加,而不必完全创建由n个1位加法器组件构成的n位加法器

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity add_sub is
port(
    a        : in  std_logic_vector(31 downto 0);
    b        : in  std_logic_vector(31 downto 0);
    sub_mode : in  std_logic;
    carry    : out std_logic;
    zero     : out std_logic;
    r        : out std_logic_vector(31 downto 0)
);
end add_sub;

architecture synth of add_sub is

signal cond_inv : std_logic_vector(31 downto 0);
signal carry_temp : std_logic_vector(32 downto 0) := (others => '0');
signal r_temp : std_logic_vector(31 downto 0) := (others => '0');

begin           
behave : process(a,b,sub_mode)
begin 
    if sub_mode = '1' then 
        cond_inv <= b xor x"ffffffff";
    else
        cond_inv <= b;
    end if; 
    carry_temp(0) <= sub_mode;
    for i in 0 to 31 loop
        r_temp(i) <= a(i) xor cond_inv(i) xor carry_temp(i);
        
        carry_temp(i+1) <= 
            (a(i) and cond_inv(i)) or
            (a(i) and carry_temp(i)) or
            (cond_inv(i)and carry_temp(i));
    end loop;
    if r_temp = x"00000000" then 
        zero <= '1';
    else 
        zero <= '0';
    end if;
    r <= r_temp;
    carry <= carry_temp(32);
end process behave;
end synth;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体add_sub是
港口(
a:标准逻辑向量(31到0);
b:标准逻辑向量(31到0);
sub_模式:在标准_逻辑中;
执行:执行标准逻辑;
零:输出标准逻辑;
r:输出标准逻辑向量(31到0)
);
结束添加_sub;
add_sub的体系结构综合
信号状态变量:标准逻辑向量(31向下至0);
信号进位温度:标准逻辑向量(32到0):=(其他=>'0');
信号r_temp:std_逻辑_向量(31向下至0):=(其他=>'0');
开始
行为:过程(a、b、sub_模式)
开始
如果sub_mode='1',则

cond_inv
carry_temp
r_temp
都是从输入分配的。您确定在测试台上初始化了这些值吗?这和外表无关。每个位将单独分配。IEEE Std 1076-2008 14.7.3.4信号更新“网络是驱动器、信号(包括端口和隐式信号)、转换函数和分辨率函数的集合,它们共同决定网络上每个信号的有效值和驱动值。”驱动器在哪里?14.7.5.2初始化“初始化阶段由以下步骤组成:…f)对于模型中的每个非托管流程P,以下操作按指示顺序发生:1)流程执行,直到挂起初始化通常会克服默认初始值。另请参阅11.3过程语句和10.2等待语句,以正确构造
行为
过程的敏感度列表。提供一个。如果要在单个进程中编写此代码,那么需要立即更新的任何临时变量都需要是一个变量。为什么不松开循环并进行临时进位,然后简单地写入(进位临时进位):=('0'&a)+cond\u inv+进位(0);