Vivado 中的时序仿真出现错误

问题描述 投票:0回答:1

我正在尝试使用 LUT6 原语在 Xilinx Vivado 中实现和模拟环形振荡器。运行行为模拟时,它运行良好,由于增加了延迟,我可以看到信号每 5 ns 切换一次。为了进行功率仿真,我需要能够运行时序仿真。综合后和实现后时序仿真都会产生结果

X
,表明存在错误。

我也尝试了这个答案中的环形振荡器,并且我遇到了同样的问题,行为模拟有效,但时序模拟无效。约束文件应允许环形振荡器。 Vivado 中的目标语言是 Verilog,因为时序仿真仅适用于此。

RO_LUT_I0.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VComponents.all;

entity RO_LUT_I0 is
    Port (
        EndAND    : out STD_LOGIC
    );
end RO_LUT_I0;

architecture rtl of RO_LUT_I0 is
    --amount of ROs
    constant size : integer := 2;
    
    --input signal for specific LUT
    signal I0 : std_logic_vector(0 to size - 1) := (others => '0');
    --output signal
    signal O : std_logic_vector(0 to size - 1);
    
    
    --connect inputs to ground
    signal I1 : std_logic := '0';
    signal I2 : std_logic := '0';
    signal I3 : std_logic := '0';
    signal I4 : std_logic := '0';
    signal I5 : std_logic := '0';

begin
    --instantiation LUT
    gen_LUT6: for i in 0 to size - 1 generate
        LUT6_inst : LUT6
        generic map (
           INIT => X"0000000000000001") -- Only when every input is 0, produce 1. Otherwise produce 0.
        port map (
           O => O(i),  -- LUT general output
           I0 => I0(i),   -- LUT input
           I1 => I1,   -- LUT input
           I2 => I2,   -- LUT input
           I3 => I3,   -- LUT input
           I4 => I4,   -- LUT input
           I5 => I5    -- LUT input
        );
    end generate gen_LUT6;
-- End of LUT6_inst instantiation


    --Create RO and combine into END gate
    process(O)
        variable TempAND : std_logic;
    begin
        --set output as input to create RO
            I0 <= O after 1 ns;
        
        --combine all 
        TempAND := '1';
        for i in 0 to size - 1 loop
            TempAND := TempAND and O(i);
        end loop;
       
        EndAND <= TempAND;
    end process;

end rtl;

RO_LUT_I0_TB.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;


entity RO_LUT_I0_TB is
end RO_LUT_I0_TB;

architecture sim of RO_LUT_I0_TB is
    signal EndAND   : STD_LOGIC := 'U';
    
begin
    --DUT
    i_RO_LUT_I0 : entity work.RO_LUT_I0(rtl) port map(
    EndAND      => EndAND);


    process is
    begin
        wait;
    end process;

end architecture;

RO_LUT_constr.xdc

set_property IOSTANDARD LVCMOS33 [get_ports EndAND]
set_property PACKAGE_PIN A2 [get_ports EndAND]

#Don't touch LUTS
set_property DONT_TOUCH TRUE [get_cells *LUT6*]

# Allow combinatorial loops for all nets
set_property ALLOW_COMBINATORIAL_LOOPS true [get_nets]

set_property SEVERITY {Warning}  [get_drc_checks LUTLP-1]
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
vhdl simulation xilinx lookup-tables vivado
1个回答
0
投票

TL;DR:这不是环形振荡器,并且您无法在“1ns 之后”进行合成。您应该阅读您的日志文件。

对于一个简单的问题来说,这里的内容太多了。我认为(如果我错了,请纠正我)您正在实例化 2 个 LUT,每个 LUT 都是一个逆变器。每个输入在“1ns 之后”的延迟后由其自己的输出驱动。两个逆变器未相互连接。模块输出为两个逆变器输出的AND。正确吗?

转储“1ns 后”。延迟必须由
    gate
  1. 延迟提供;这就是它成为“环形振荡器”的原因。 将两个逆变器相互连接以形成“环”。提示:您的生成必须包含
  2. i+1
  3. i-1
    等,才能连接到下一个元素。您还必须处理结束条件以解决整个问题。
    您期望输入元素的初始化以某种方式“启动”环,以便它具有启动值。这适用于行为模拟,但它适用于综合吗?也许,也许不是。你需要检查一下。如果您得到 
  4. X
  5. ,您将需要以某种方式注入一个重置值。
    等等。不要为作为输出的信号分配初始值,等等。
© www.soinside.com 2019 - 2024. All rights reserved.