You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vivado综合警告[Synth 8-6014]:已移除未使用时序元件MVM_RST_reg

问题:Vivado综合警告[Synth 8-6014]疑惑

在Vivado中收到警告:[Synth 8-6014] Unused sequential element MVM_RST_reg was removed.,但我确认MVM_RST信号已连接并按逻辑使用,附上相关代码,求解释警告触发原因。

相关代码

MVM模块定义

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.math_real.all;
use work.parameters.all;

entity MVM is
  port (
    EN:         IN std_logic;
    DIN:        IN  signed(DATA_WIDTH_IN-1 downto 0);
    WEIGHT:     IN  signed(DATA_WIDTH_IN -1 downto 0);
    CLK:        IN  std_logic;
    RST:        IN  std_logic;
    MVM_RESULT: OUT signed(DATA_WIDTH_IN-1 downto 0):= (OTHERS => '0')
  );
end entity MVM;
  
architecture base of MVM is

begin
  process(CLK)
  variable acc_value : signed(DATA_WIDTH_IN-1 downto 0):= (OTHERS => '0');
  begin
   IF rising_edge(CLK) then
      IF RST='1' THEN
        acc_value := (OTHERS => '0'); -- reset accumulated value to 0
      ELSIF EN='1' THEN 
        acc_value := resize((acc_value + WEIGHT* DIN), DATA_WIDTH_IN); 
        MVM_RESULT <= acc_value;
      END IF;
    END IF;
  END process;

end base;

组件声明

component MVM is
  port (
    EN:                             in          std_logic;
    DIN:                            IN          signed(DATA_WIDTH_IN-1 downto 0);
    WEIGHT:                         IN          signed(DATA_WIDTH_IN-1 downto 0);
    CLK:                            IN          std_logic;
    RST:                            IN          std_logic;
    MVM_RESULT:                     OUT         signed(DATA_WIDTH_IN-1 downto 0)
  );

信号定义

signal MVM_RST:                     std_logic;

模块例化

MVM_UNITS: MVM
            port MAP(
                EN                  => MVM_En,
                DIN                 => DIN_Array(i) ,
                Weight              => WEIGHT_Array(i),
                CLK                 => CLK,
                RST                 => MVM_RST,
                MVM_RESULT          => MVM_RESULT_ARRAY(i)
            );

MVM_RST生成逻辑

state_machine:  process(Clk) is
        begin
           if rising_edge(Clk) then
               IF RST='1' then
                    MVM_RST             <= '1';         
               Else   
                     MVM_RST             <= '0'; 

(注:上述进程代码不完整,推测遗漏了END IF;和END PROCESS;)

警告具体指向例化代码的RST=> MVM_RST行。


问题分析与解决思路

核心原因

  1. MVM_RST逻辑冗余
    你在state_machine进程中生成的MVM_RST本质是对顶层RST的同步采样,逻辑完全等价于MVM_RST <= RST(同步赋值)。Vivado综合器会自动识别这种无意义的寄存器级联,直接将顶层RST信号连接到MVM模块的RST端口,进而移除中间的MVM_RST_reg寄存器,触发该警告。

  2. 复位操作对输出无直接影响
    在MVM模块中,复位仅清零内部变量acc_value,但只有当EN='1'时,acc_value才会被赋值给MVM_RESULT。如果MVM_RST有效时EN处于无效状态,复位后的acc_value不会立即反映到输出上。综合器会判定该复位路径对最终输出没有实际贡献,因此优化掉相关的寄存器逻辑。

  3. EN信号可能未被有效使用
    如果EN信号在系统运行中始终为0,综合器会认为MVM模块的运算逻辑完全无用,连带复位逻辑一起被优化,也会触发该警告。

解决方法

  • 简化连接逻辑:如果MVM_RST的作用只是同步顶层RST,直接删除MVM_RST信号和对应的生成逻辑,将MVM模块的RST端口直接连接到顶层RST即可。
  • 让复位直接作用于输出:修改MVM模块的代码,在复位时直接更新MVM_RESULT,确保复位操作对输出有明确影响:
process(CLK)
variable acc_value : signed(DATA_WIDTH_IN-1 downto 0):= (OTHERS => '0');
begin
 IF rising_edge(CLK) then
    IF RST='1' THEN
      acc_value := (OTHERS => '0');
      MVM_RESULT <= (OTHERS => '0'); -- 复位时直接更新输出端口
    ELSIF EN='1' THEN 
      acc_value := resize((acc_value + WEIGHT* DIN), DATA_WIDTH_IN); 
      MVM_RESULT <= acc_value;
    END IF;
  END IF;
end process;
  • 验证EN信号的有效性:检查EN信号的逻辑,确保它会在合适的时机被置为1,让综合器识别到MVM模块的功能是被实际调用的。

内容的提问来源于stack exchange,提问作者hajo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:20:29