VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.

VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.,vhdl,Vhdl,VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.all; 实体危险单元为 港口( BranchD:标准逻辑; RsD:标准逻辑向量(4到0); RtD:标准逻辑向量(4到0); RsE:标准逻辑向量(4到0); RtE:标准逻辑向量(4到0); 写入记录:在标准逻辑向量中(4到0); 记忆记

VHDL:几个';和';逻辑在';如果';失败
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用ieee.std_logic_arith.all;
实体危险单元为
港口(
BranchD:标准逻辑;
RsD:标准逻辑向量(4到0);
RtD:标准逻辑向量(4到0);
RsE:标准逻辑向量(4到0);
RtE:标准逻辑向量(4到0);
写入记录:在标准逻辑向量中(4到0);
记忆记忆:在标准逻辑中;
RegWriteE:标准逻辑中;
WriteRegM:标准逻辑向量(4到0);
RegWriteM:标准逻辑中;
WriteRegW:标准逻辑向量(4到0);
RegWriteW:标准逻辑中;
StallF:输出标准逻辑;
暂停:输出标准逻辑;
ForwardAD:输出标准逻辑;
FlushE:输出标准逻辑;
ForwardAE:输出标准逻辑向量(1到0);
ForwardBE:out标准逻辑向量(1到0)
);
终端单元;
危险单元的架构是
信号lwstall:std_逻辑:='0';
信号分支安装:标准逻辑:='0';
开始
流程(BranchD、RsD、RtD、RsE、RtE、WriterEdge、MemtorEdge、RegWriteEE、WriteRegM、RegWriteEM、WriteRegW、RegWriteW)
开始
-----------转发:前一个目标与下一个源匹配--------------------
如果(RsE/=“00000”且RsE=WriteRegM和RegWriteM),则

在七个这样的错误中,前四个出现是因为条件(对于if语句)必须计算为布尔值,没有使用返回布尔值的std_逻辑和布尔操作数定义的“和”运算符。最后三个值对布尔操作数求值,并应返回一个std_逻辑(std_ulogic)值,同样没有定义。前四个问题可以通过将
RegWriteM
更改为
RegWriteM='1'
来解决。其余三个需要if语句(或条件信号分配,在这种情况下,您不应该使用Synopsys软件包(-2008))。小心初始化信号:
signal lwstall:std_logic:=“0”;信号分支安装:标准逻辑:='0'。初始值将被您的逻辑合成器忽略,因此您的门将与您的模拟不匹配。您的设计不应依赖于信号的初始化。我还注意到您在此处驾驶
lwstall
lwstall@MatthewTaylor至少有一些FPGA合成器可以正确处理初始信号值,例如Vivado、ISE和Quartus。@MatthewTaylor这就是我通常不喜欢信号初始化的原因。您必须小心初始化哪个信号,因为它们可能被初始化,也可能没有被初始化(取决于信号是否被注册)。很容易迷失方向。这会导致模拟/硬件不匹配。此外,初始化会隐藏未驱动信号的问题。我更喜欢在模拟中看到“U”的传播,这比配置后的初始值更有价值。
Library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.std_logic_arith.all;

ENTITY hazard_unit IS
 PORT(
  BranchD:in std_logic;
  RsD:in std_logic_vector(4 downto 0);
  RtD:in std_logic_vector(4 downto 0);
  RsE:in std_logic_vector(4 downto 0);
  RtE:in std_logic_vector(4 downto 0);
  WriteRegE:in std_logic_vector(4 downto 0);
  MemtoRegE:in std_logic;
  RegWriteE:in std_logic;
  WriteRegM:in std_logic_vector(4 downto 0);
  RegWriteM:in std_logic;
  WriteRegW:in std_logic_vector(4 downto 0);
  RegWriteW:in std_logic;

  StallF:out std_logic;
  StallD:out std_logic;
  ForwardAD:out std_logic;
  FlushE:out std_logic;
  ForwardAE:out std_logic_vector(1 downto 0);
  ForwardBE:out std_logic_vector(1 downto 0)
 );
END hazard_unit;

ARCHITECTURE behavioral OF hazard_unit IS
  signal lwstall:std_logic:='0';
  signal branchstall:std_logic:='0';
  begin
  process(BranchD,RsD,RtD,RsE,RtE,WriteRegE,MemtoRegE,RegWriteE,WriteRegM,RegWriteM,WriteRegW,RegWriteW)
    begin
-----------Forwarding: former destination matches next source rs--------------------
    if    (RsE/="00000" and RsE=WriteRegM and RegWriteM) then    
         ForwardAE<="10";
    elsif ((RsE/="00000") and (RsE=WriteRegW) and RegWriteW) then
         ForwardAE<="01";
    else 
         ForwardAE<="00";
    end if;
-----------Forwarding: former destination matches next source rt---------------------
    if    ((RtE/="00000") and (RtE=WriteRegM) and RegWriteM) then    
         ForwardBE<="10";
    elsif ((RtE/="00000") and (RtE=WriteRegW) and RegWriteW) then
         ForwardBE<="01";
    else 
         ForwardBE<="00";
    end if;
----------LW Stall: lw instrucion's destination register RtE matches source register RsD, RtD---------------------
    lwstall<=((RsD=RtE) or (RtD=RtE)) and MemtoRegE;
----------Control hazard: Forwarding when result of ALU in the mem stage
    ForwardAD<=(RsD/=0) and (RsD=WriteRegM) and RegWriteM;
----------Control hazard: Stall when result of ALU in the exe stage
    branchstall<=(BranchD and RegWriteE and (WriteRegE=RsD or WriteRegE=RtD)) or (BranchD and MemtoRegM and (WriteRegM=RsD or WriteRegM=RtD));
    StallF<=lwstall or branchstall;
    StallD<=lwstall or branchstall;
    FlushE<=lwstall or branchstall;          
  end process;
end hazard_unit;