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行。
问题分析与解决思路
核心原因
MVM_RST逻辑冗余
你在state_machine进程中生成的MVM_RST本质是对顶层RST的同步采样,逻辑完全等价于MVM_RST <= RST(同步赋值)。Vivado综合器会自动识别这种无意义的寄存器级联,直接将顶层RST信号连接到MVM模块的RST端口,进而移除中间的MVM_RST_reg寄存器,触发该警告。复位操作对输出无直接影响
在MVM模块中,复位仅清零内部变量acc_value,但只有当EN='1'时,acc_value才会被赋值给MVM_RESULT。如果MVM_RST有效时EN处于无效状态,复位后的acc_value不会立即反映到输出上。综合器会判定该复位路径对最终输出没有实际贡献,因此优化掉相关的寄存器逻辑。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
相关产品推荐
相关产品推荐

