Vhdl 如何修复关于敏感度列表的Xilinx ISE警告?

Vhdl 如何修复关于敏感度列表的Xilinx ISE警告?,vhdl,xilinx,synthesis,Vhdl,Xilinx,Synthesis,我用Xilinx ISE 13.1综合了我的设计。目标设备是Virtex 5。然后我遇到了这个警告: WARNING:Xst:819 - "F:/FRONT-END/h264/inter/src/eei/eei_mvd.vhd" line 539: One or more signals are missing in the process sensitivity list. To enable synthesis of FPGA/CPLD hardware, XST will assum

我用Xilinx ISE 13.1综合了我的设计。目标设备是Virtex 5。然后我遇到了这个警告:

 WARNING:Xst:819 - "F:/FRONT-END/h264/inter/src/eei/eei_mvd.vhd" 
line 539: One or more signals are missing in the process sensitivity list. 
To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. 
Please note that the result of the synthesis may differ from the initial design specification. The missing signals are:    
<mvd_l0<3><3>>, <mvd_l0<3><2>>, <mvd_l0<3><1>>, <mvd_l0<3><0>>, <mvd_l0<2><3>>, <mvd_l0<2><2>>,
 <mvd_l0<2><1>>, <mvd_l0<2><0>>, <mvd_l0<1><3>>, <mvd_l0<1><2>>, <mvd_l0<1><1>>, <mvd_l0<1><0>>,
 <mvd_l0<0><3>>, <mvd_l0<0><2>>, <mvd_l0<0><1>>, <mvd_l0<0><0>>, <mvd_l1<3><3>>, <mvd_l1<3><2>>,
 <mvd_l1<3><1>>, <mvd_l1<3><0>>, <mvd_l1<2><3>>, <mvd_l1<2><2>>, <mvd_l1<2><1>>, <mvd_l1<2><0>>,
 <mvd_l1<1><3>>, <mvd_l1<1><2>>, <mvd_l1<1><1>>, <mvd_l1<1><0>>, <mvd_l1<0><3>>, <mvd_l1<0><2>>, 
<mvd_l1<0><1>>, <mvd_l1<0><0>>, <mvd<0>>, <mvd<1>>
警告:Xst:819-“F:/FRONT-END/h264/inter/src/eei/eei_mvd.vhd”
第539行:过程灵敏度列表中缺少一个或多个信号。
为了能够合成FPGA/CPLD硬件,XST将假设所有必要的信号都存在于灵敏度列表中。
请注意,合成结果可能与初始设计规范不同。缺失的信号是:
, , ,
, , ,
, , ,
, , ,
, , , 
, , 
以下是我的源代码:

proc_update_next: process(mvd_l0, mvd_l1, mvd, subMBPart_Idx, MBPart_Idx, eei_info )
  begin
    --// Init
    next_mvd_l0 <= mvd_l0;
    next_mvd_l1 <= mvd_l1;
    --// Change
    if eei_info.mb_type =  BLK_8x8 then
      for  i in 3 downto 0 loop
        for  j  in 3 downto 0  loop
          if i = to_integer(unsigned(MBPart_Idx))  and j = to_integer(unsigned(subMBPart_Idx)) then
            next_mvd_l0(i)(j)  <=  mvd(0);
            next_mvd_l1(i)(j)  <=  mvd(1);
          end  if;
        end  loop;
      end loop;
    else
      for  i in 3 downto 0 loop
        if i = to_integer(unsigned(MBPart_Idx)) then
          next_mvd_l0(i)(0)  <=  mvd(0);
          next_mvd_l1(i)(0)  <=  mvd(1);
        end  if;
      end loop;
    end if;
  end process;
proc\u update\u next:过程(mvd\u l0、mvd\u l1、mvd、子MBPart\u Idx、MBPart\u Idx、eei\u信息)
开始
--//初始化

next_mvd_l0对于一组条件,您应该只设置一次信号,如
next_mvd_l0
next_mvd_l1
。“init”部分仍然是一个问题。如果避免重置进程,则最好使用局部变量

最佳选项:将重置添加到灵敏度列表中,如果已启用,则将next_mvd_*设置为初始值

--// Init
if (reset = '1') then
    next_mvd_l0 <= mvd_l0;
    next_mvd_l1 <= mvd_l1;
end if;
-->初始化
如果(重置='1'),则

接下来_mvd_l0使用VHDL-2008构造
过程(全部)
告诉工具您希望灵敏度列表包括所有读取的信号


或者,让它成为一个时钟进程,只对时钟敏感,然后你也不必担心。

你使用VHDL记录结构(eei_info.mb_type)。您可以将每个记录元素添加到sens列表中,以使xst满意。我只是忽略了这个警告。

Xilinx XST对旧设备使用旧的VHDL解析器,对新设备使用新的VHDL解析器。这两种语言都不像用户喜欢的那样理解VHDL,因此它们允许您通过命令行选项“use_new_parser=yes”(也可能作为合成工具“Properties”对话框中的勾选框提供)选择最不坏的语言。这将允许您对旧的Virtex-5设备使用新的解析器。顺便说一下,我希望您已经验证了这段代码在模拟中完全符合您的要求。如果你没有,我想你会对合成代码的功能感到失望。@BrianDrummond:看起来好多了,谢谢。我的设计是在ASIC和FPGA原型中实现的。虽然设计编译器没有错误,但Xilinx仍然支持这种情况。ModelSim中的行为是正确的,我稍后将尝试使用sdf文件。对于ASIC原型:尝试使用Vivado(Xilinx(>=Series 7)的新工具)进行合成。只是为了匹配结果并平均警告:-)然后您有一个单独的计时进程,它基本上将next_mvd_*复制到mvd_*中。将两个进程合并成一个时钟进程通常是一种更好的方式,完全消除next_u和容易出错的敏感度列表。但是考虑到现有的工作代码库,我理解不愿意这样做…@vermaete:另一个工具不是好方法,因为我们现在已经有了Xilinx的Lincence。所以,我会在业余时间试试。不是真的。如果设计者清楚地了解到,在任何一个进程激活中,最后一次分配获胜,那么对这些信号进行多次分配并没有错。
proc_update_next: process(mvd_l0, mvd_l1, mvd, subMBPart_Idx, MBPart_Idx, eei_info )
    variable mvd_10_local : 2dArrayType;
    variable mvd_11_local : 2dArrayType;
begin
    --// Init
    mvd_10_local := mvd_l0;
    mvd_11_local := mvd_l1;
    --// Change
    if eei_info.mb_type =  BLK_8x8 then
        for  i in 3 downto 0 loop
            for  j  in 3 downto 0  loop
                if i = to_integer(unsigned(MBPart_Idx))  and j = to_integer(unsigned(subMBPart_Idx)) then
                    mvd_10_local(i)(j)  :=  mvd(0);
                    mvd_11_local(i)(j)  :=  mvd(1);
                end  if;
            end  loop;
        end loop;
    else
        for  i in 3 downto 0 loop
            if i = to_integer(unsigned(MBPart_Idx)) then
                    mvd_10_local(i)(j)  :=  mvd(0);
                    mvd_11_local(i)(j)  :=  mvd(1);
            end  if;
        end loop;
    end if;
    next_mvd_l0 <= mvd_10_local;
    next_mvd_l1 <= mvd_l1_local;
end process;