首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL位置和路径分析

VHDL位置和路径分析
EN

Stack Overflow用户
提问于 2015-11-30 20:54:32
回答 1查看 430关注 0票数 0

我的问题是,当我使用XilinxISE14.7+ XPS实现我的设计时,在静态时序分析中,我常常获得非常不同的分析路径数,而且在.vhd文件中也很少有差异。特别是,我更改的唯一文件(或我认为要更改的文件.)是这样的:

代码语言:javascript
复制
entity my_entity is(
    ...
    data_in : in std_logic_vector(N*B-1 downto 0);
    ...
);
end entity my_entity;

architecture bhv of my_entity is
    signal data : std_logic_vector(B-1 downto 0);
    signal idx_vect : std_logic_vector(log2(N)-1 downto 0);
    signal idx : integer range 0 to N-1;
    ...
begin
    process(clk)
    begin
        if(rising_edge(clk))then
            idx_vect <= idx_vect + 1;
        end if;
    end process;

    idx <= to_integer(unsigned(idx_vect));

    data <= data_in((idx+1)*B-1 downto idx*B);

end architecture bhv;

我不确定问题来自这里,但我没有找到任何其他可能的原因,以减少五倍的分析路径数目。为了获得正确的实现,必须避免一些语法吗?是否有可能使用整数索引数组(如示例codec中的那样)以某种方式分解路径,使其不受分析?

代码更改类似于:

代码语言:javascript
复制
process(shift_reg, data_in)
    for i in range 0 to N-1 loop
        if(shift_reg(i) = '1')then
            data <= data_in((i+1)*B-1 downto i*B);
        end if;
    end loop;
end process;

在这里,我没有增量idx_vect,而是一个N位的循环单热移位寄存器。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 22:19:35

这条线上复用器的编码方式

代码语言:javascript
复制
data <= data_in((idx+1)*B-1 downto idx*B);

会对逻辑合成产生很大影响。这就产生了非常不同的路径数来分析时间。

原复用器

我首先使用这个小例子检查了上面这一行的合成:

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mux1 is
    generic (
        B : positive := 32;
        M : positive := 7); -- M := ceil(log_2 N)
    port (
        d : in  STD_LOGIC_VECTOR ((2**M)*B-1 downto 0); -- input data
        s : in  STD_LOGIC_VECTOR (M-1 downto 0);        -- selector
        y : out  STD_LOGIC_VECTOR(B-1 downto 0));       -- result
end mux1;

architecture Behavioral of mux1 is
    constant N : positive := 2**M;
    signal idx : integer range 0 to N-1;
begin
    idx <= to_integer(unsigned(s));
    y <= d((idx+1)*B-1 downto idx*B);
end Behavioral;

如果将其合成为Spartan-6,XST将报告如下(摘录):

代码语言:javascript
复制
Macro Statistics
# Adders/Subtractors                                   : 2
 13-bit subtractor                                     : 1
 8-bit adder                                           : 1
...
 Number of Slice LUTs:                 1516  out of   5720    26%  
...
Timing constraint: Default path analysis
  Total number of paths / destination ports: 139264 / 32

因此,没有检测到多路复用器,时间分析器必须分析大量的路径。逻辑利用率是可以的。

优化实施

同样的复用可以通过:(、编辑、:bugfix和简化)实现。

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mux2 is
    generic (
        B : positive := 32;
        M : positive := 7); -- M := ceil(log_2 N)
    port (
        d : in  STD_LOGIC_VECTOR ((2**M)*B-1 downto 0);
        s : in  STD_LOGIC_VECTOR (M-1 downto 0);
        y : out  STD_LOGIC_VECTOR(B-1 downto 0));
end mux2;

-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- !! The entire architecture has been FIXED and simplified. !!
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
architecture Behavioral of mux2 is
    constant N : positive := 2**M;
    type matrix is array (N-1 downto 0) of std_logic_vector(B-1 downto 0);
    signal dd : matrix;
begin
    -- reinterpret 1D vector 'd' as 2D matrix, i.e.
    -- row 0 holds d(B-1 downto 0) which is selected in case s = 0
    row_loop: for row in 0 to N-1 generate
        dd(row) <= d((row+1)*B-1 downto row*B);
    end generate;

    -- select the requested row
    y <= dd(to_integer(unsigned(s)));
end Behavioral;

现在,XST报告看起来好多了:

代码语言:javascript
复制
Macro Statistics
# Multiplexers                                         : 1
 32-bit 128-to-1 multiplexer                           : 1
...
 Number of Slice LUTs:                 1344  out of   5720    23%  
...
Timing constraint: Default path analysis
  Total number of paths / destination ports: 6816 / 32

它检测每个输出位需要128到1复用器.这种宽复用器的优化合成是内置于合成工具的.LUTs的数量只略有减少。但是,时间分析器处理的路径数大大减少了的20倍!

使用一个热选择器实现

上述示例使用二进制编码的选择器信号。我还检查了一个热编码的变体:

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mux3 is
    generic (
        B : positive := 32;
        N : positive := 128);
    port ( d : in  STD_LOGIC_VECTOR (N*B-1 downto 0);
           s : in  STD_LOGIC_VECTOR (N-1 downto 0);
           y : out  STD_LOGIC_VECTOR(B-1 downto 0));
end mux3;

architecture Behavioral of mux3 is

begin
    process(d, s)
    begin
        y <= (others => '0'); -- avoid latch!
        for i in 0 to N-1 loop
            if s(i) = '1' then
                y <= d((i+1)*B-1 downto i*B);
            end if;
        end loop;
    end process;

end Behavioral;

现在,XST报告又不同了:

代码语言:javascript
复制
Macro Statistics
# Multiplexers                                         : 128
 32-bit 2-to-1 multiplexer                             : 128
...
Number of Slice LUTs:                 2070  out of   5720    36%  
...
Timing constraint: Default path analysis
  Total number of paths / destination ports: 13376 / 32

检测到2到1复用器,因为描述了该方案的优先级mux模拟:

代码语言:javascript
复制
if s(127) = '1' then
  y <= d(128*B-1 downto 127*B);
else
  if s(126) = '1' then
    y <= d(127*B-1 downto 126*B);
  else
    ...
                             if s(0) = '1' then
                               y <= d(B-1 downto 0);
                             else
                               y <= (others => '0');
                             end if;
  end if; -- s(126)
end if; -- s(127)

由于教学原因,我没有在这里使用elsif。每个if-else阶段是一个32位宽的2对1多路复用器.这里的问题是,合成不知道,s是一个单一热编码信号.因此,在我优化的实现中需要更多的逻辑。

要分析的用于计时的路径数再次发生显着变化。这个数字比原来的实现低10倍,但比我的优化实现高2倍。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34007821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档