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