wind330

For...Loop可综合性分析

0
阅读(1994)

VHDL的循环语句有三种:for循环、while循环和无限循环loop  end loop,实际上,1oop…end  loop可以看作是循环条件永远为真的while循环。在行为综合中,循环语句的处理是极其复杂的。

在寄存器级进行综合,要求for循环的上下界必须是静态已知,否则是不可综合的。VHDL定义了next和exit语句来中断循环的正常执行,现在的综合工具都可以处理这两种语言结构。

注意:FOR ...GENERATE 和FOR...LOOP的语句不同,在FOR ...GENERATE语句中所列举的是并行处理语句。因此,内部语句不是按书写顺序执行的,而是并行执行的,这样的语句中就不能使用EXIT语句和NEXT语句。

通过综合下面这段代码来了解FOR...LOOP的可综合性:

entity loop_syn is

  port (

    sel   : in  std_logic_vector(1 downto 0);

    din   : in  std_logic_vector(15 downto 0);

    dout  : out std_logic_vector(3 downto 0);

    din1  : in  std_logic_vector(15 downto 0);

    dout1 : out std_logic_vector(3 downto 0));

end loop_syn;

 

architecture synlogic of loop_syn is

 

begin  -- synlogic

 

  loop1 : process (din, sel)

  begin  -- process loop1

    for i in 0 to 3 loop

      dout <= din((i+1)*4 - 1 downto i*4);

      exit when sel = i;

    end loop;  -- i

  end process loop1;

 

  case1 : process (din1, sel)

  begin  -- process case1

    case (sel) is

      when "00" =>

        dout1 <= din1(3 downto 0);

      when "01" =>

        dout1 <= din1(7 downto 4);

      when "10" =>

        dout1 <= din1(11 downto 8);

      when "11" =>

        dout1 <= din1(15 downto 12);

      when others =>

        dout1 <= (others => '0');

    end case;

  end process case1;

end synlogic;

case1和loop1用两种不同的风格描述了两种相同功能,首先我们可以观察一下RTL Viewer,如下图:

case1进程就是4个“四选一”的复选器,分别对应输出“dout1(0)”,“dout1(1)”,“dout1(2)”,“dout1(3)”;

loop1进程由于使用了for...loop,所以对应RTL Viewer就比较复杂,但是我们可以基本猜出QuartusII综合器的综合流程:

1、有4个“等于”比较器,分别对应Sel输入和常量值;

2、dout(*)输出由4个“二选一”的复选器,选择信号是4个“等于”比较器的输出;

有一个有趣的现象(RTL Viewer):sel = 0时,对应的din[0..3]输出至dout的逻辑延迟最长,sel = 1次之,依次类推...。到次为止,可能很多人会觉得loop1进程所需要的逻辑门比case1的逻辑门多很多,最开始我也这么认为,但是不着急,我们接着看一下Technology Viewer,如下图:


我们可以看到“sel din dout”和“sel din1 dout1”都是各用了8个LUT,逻辑延迟均为2个LUT。由此我们知道:RTL Viewer从某种程度上告诉我们综合器的从RTL代码到基本算法及逻辑单元的算法行为,而Technology Viewer告诉我们综合器的逻辑行为到LC单元的映射。所以,从RTL Viewer判断一个VHDL的描述代码的好坏是有误的。造成上述现象的原因,从我个人的观点,一个4输入LUT,可以描述任何4输入的逻辑表达式,如果用与或门描述各种4输入表达式,相对应的门数和逻辑延迟都不尽相同,但是当最小单元是LUT,则相对应的门数和逻辑延迟都可以认为是一致的,这也许就是ASIC和FPGA的最根本的区别。

最终我的观点是:

1、利用for...loop对设计FPGA IP的参数化配置是有很大帮助的,但是如果在ASIC设计中,设计需求已经确定,for...loop的描述由于其综合过程的复杂性,应该尽量避免;

2、当一个组合逻辑的输入数确定,不论用何种描述方式,其所用的LUT数也就基本确定,这应该是由“聪明”的综合器决定的;

3、RTL Viewer可以帮助你理解你设计的算法,Technology Viewer查看LUT的工作方式。

希望大家一起讨论,及时指证文章中的错误及不易理解的地方,谢谢!