Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL位置和路径分析_Vhdl_Xilinx_Synthesis - Fatal编程技术网

VHDL位置和路径分析

VHDL位置和路径分析,vhdl,xilinx,synthesis,Vhdl,Xilinx,Synthesis,我的问题是,当我使用Xilinx ISE 14.7+XPS实现我的设计时,在静态时序分析中,我通常会获得非常不同数量的分析路径,在.vhd文件中也几乎没有差异。 特别是,我更改(或我认为要更改…)的唯一文件如下: entity my_entity is( ... data_in : in std_logic_vector(N*B-1 downto 0); ... ); end entity my_entity; architecture bhv of my_entity

我的问题是,当我使用Xilinx ISE 14.7+XPS实现我的设计时,在静态时序分析中,我通常会获得非常不同数量的分析路径,在.vhd文件中也几乎没有差异。 特别是,我更改(或我认为要更改…)的唯一文件如下:

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;
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;
实体我的实体是(
...
数据输入:标准逻辑向量(N*B-1向下至0);
...
);
结束实体我的实体;
my_实体的架构bhv为
信号数据:标准逻辑向量(B-1向下至0);
信号idx_向量:标准逻辑_向量(log2(N)-1向下至0);
信号idx:整数范围0到N-1;
...
开始
过程(clk)
开始
如果(上升沿(clk)),则

idx_vect该线路多路复用器的编码方式

data <= data_in((idx+1)*B-1 downto idx*B);
因此,没有检测到多路复用器,定时分析器必须分析大量路径。 逻辑利用率正常

优化实现 同样的多路复用可以通过以下方式实现:(编辑:错误修复和简化)

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

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

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;
检测到2对1多路复用器,因为描述了该方案的优先级mux模拟:

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)
如果s(127)=“1”,则

y该线路多路复用器的编码方式

data <= data_in((idx+1)*B-1 downto idx*B);
因此,没有检测到多路复用器,定时分析器必须分析大量路径。 逻辑利用率正常

优化实现 同样的多路复用可以通过以下方式实现:(编辑:错误修复和简化)

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

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

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;
检测到2对1多路复用器,因为描述了该方案的优先级mux模拟:

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)
如果s(127)=“1”,则

y您在代码中实际更改了什么?定时分析器报告每个定时约束的“分析路径数”。你指的是哪一个?只要XST没有发出(有害的)警告,代码就会按预期进行合成。更改是关于我对数组进行索引的方式,似乎当我不使用整数时(例如,使用for循环检查条件,因此没有“直接索引”),分析的路径数会增加。XST未发出任何警告。可能问题出在其他地方,但我只想确认语法正确,并且没有已知问题……请编辑您的问题,并为循环添加
。如果XST没有错误地接受该语法,则该语法是正确的。如果模拟显示了所需的输出,并且XST没有发出警告,则语义是正确的。你没有回答我的第二个问题。答案对我来说很重要,也许能解决你的问题。谢谢@MartinZabel。该约束是XPS生成的派生约束。我的周期约束是指差分时钟的P侧锁定到某个管脚并进入时钟生成器,该时钟生成器传播到一些新的衍生约束(在我看来,这些约束是正确的,除了其中一个的高度可变的分析路径数外,我几乎在我的所有设计中都使用的路径)。如果(由于编码错误,例如忽略将结果连接到输出)您的大多数硬件都可以优化,剩下的分析就不多了。查看合成报告以了解更多“精简逻辑”是值得的报告的LUT/FF使用量比以前有所减少,或可疑减少。您在这段代码中实际更改了什么?计时分析器报告每个计时约束的“分析路径数”。您在这里指的是哪一个?只要没有(有害),代码就会按预期合成警告是由XST发出的。更改是关于我对数组进行索引的方式,似乎是当我不使用整数时(例如,使用for循环检查条件,因此没有“直接索引”),分析路径的数量增加。XST没有发出警告。可能问题出在其他地方,但我只想确认语法正确,并且没有已知问题…请编辑您的问题并为循环添加
。如果XST没有错误地接受语法,则语法正确如果模拟显示了所需的输出,并且XST没有发出警告,则语义是正确的。您没有回答我的第二个问题。答案对我来说很重要,可能会解决您的问题。谢谢@MartinZabel。该约束是XPS生成的派生约束。我的周期约束指的是差分时钟锁的P侧连接到某个管脚并输入时钟生成器,传播到一些新的衍生约束(除了其中一个的高度可变的分析路径数,我几乎在所有设计中都使用该路径外,这些约束看起来是正确的)。如果(由于编码错误,例如忽略将结果连接到输出)您的大多数硬件都可以进行优化,没有多少可供分析的了。与以前相比,检查合成报告是否有更多“精简逻辑”报告,或者LUT/FF使用量是否有可疑的减少是值得的。难以置信!非常感谢您的解释!@Alessandro If
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
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)