Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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_Fpga_Synthesis_Vivado - Fatal编程技术网

Vhdl 代码合成失败,没有严重警告或错误?

Vhdl 代码合成失败,没有严重警告或错误?,vhdl,fpga,synthesis,vivado,Vhdl,Fpga,Synthesis,Vivado,如果我注释掉第二个进程块,我下面的vhdl模块将进行合成,但是如果我尝试同时使用这两个模块,合成将失败,并且没有列出任何严重警告或错误。 有一些警告,但它们只是普通的东西(Zynq没有连接以太网,没有使用的东西,等等) 我看不出有任何理由会发生这种情况。最初,我在导致错误的process语句中有一个for循环,但是去掉它并不起作用。 然后我认为这可能是两个进程之间的多驱动网络,但事实也并非如此 library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IE

如果我注释掉第二个进程块,我下面的vhdl模块将进行合成,但是如果我尝试同时使用这两个模块,合成将失败,并且没有列出任何严重警告或错误。 有一些警告,但它们只是普通的东西(Zynq没有连接以太网,没有使用的东西,等等)

我看不出有任何理由会发生这种情况。最初,我在导致错误的process语句中有一个for循环,但是去掉它并不起作用。
然后我认为这可能是两个进程之间的多驱动网络,但事实也并非如此

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.NUMERIC_STD.all;
use ieee.std_logic_unsigned.all;


use work.DataTypes_pkg.all;

entity EvalFUOutputs is 
    Port ( 
        Clk_Launch : in  std_logic;
        RESET : in  std_logic;
        start : in  std_logic;
        current_phase : in  PhaseType;
        ready : out  std_logic;
        init_or_captured : in  std_logic;       --mode bit
        all_timings_done : out  std_logic;
        Capture_vals : in  std_logic_vector(FU_OUTPUT_WIDTH_NB-1 downto 0);
        Launch_MUXCtrl : in  std_logic;
        Capture_ClkEn : in  std_logic; 
        --2D array for results.
        row_timings : out RowResultsType;
        glitches : out  OutRowType
        );
end EvalFUOutputs;

architecture beh of EvalFUOutputs is

    type mode_enum is (init, eval);
    signal mode : mode_enum;

    type eval_enum is (idle, eval_begin, get_time, all_timed);
    signal eval_state : eval_enum;

    type init_enum is(begin_init, compare, done);
    signal init_state : init_enum;

    signal row_time : RowResultsType;

    type init_vals_declare is array (0 downto 1) of std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);
    signal init_vals : init_vals_declare;

    signal has_been_timed : std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0 );
    --
    --  if 0 => will not change
    --  if 1 => will change
    --
    signal will_change : std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);

    signal init_done :std_logic;

    signal fu_vals_changed : std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);

    --
    --  This modules clock signal
    --
    signal clk : std_logic;

    signal a : std_logic;

begin

    clk <= Clk_Launch;



    mode_of_FU :
    process(clk, mode, RESET) is

    begin
        if rising_edge(clk) then
            if RESET = '1' then
                --TODO:RESET LOGIC
                mode <= init;
            else 

                case mode is 
                    when init =>

                    --
                    --  Check if need to change to next
                    --      nested state mahcine
                    --
                        if (init_or_captured = '1') then
                            mode <= eval;
                        else
                            mode <= init;
                        end if;

                    when eval =>

                    --
                    --  End EVAL LOGIC nested state mahcine
                    --
                        if (init_or_captured = '0') then
                            mode <= eval;
                        else
                            mode <= init;
                        end if;
                end case;
            end if;
        end if;
    end process;




init_state_machine:
process (clk, RESET,mode,init_state) is

begin
    if (rising_edge(clk)) then
      if (mode = init) then 
        if RESET ='1' then
            --TODO reset logic
            init_state <= begin_init;
            init_done <= '0';

            else

                case init_state is
                    --TODO: init logic
                    --
                    --  1.A Init Machine Start
                    --
                    when begin_init =>
                        -- row timings set to zero to beign
                        row_time <= (others => (others => '0'));

                        init_vals(0)(FU_OUTPUT_WIDTH_NB -1 downto 0) <= Capture_vals;

                        if (start = '1') then
                            init_state <= compare;
                        else
                            init_state <= begin_init;
                        end if;

                    when compare =>
                        --wait one more clk cycle to get changed values
                        init_vals(1)(FU_OUTPUT_WIDTH_NB -1 downto 0) <= Capture_vals;

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

                        init_state <= done;

                    when done =>
                        init_done <= '1';

                end case;
            end if;
        end if;
      end if;
    end process;

--ready <= '1' ;
--all_timings_done <= '1';
--row_timings <= (others => (others => '1'));
--glitches <= (others => '1');
a <= '0';

end beh;
应该是

  type init_vals_declare is array (0 to 1) of std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);
Vivado不会告诉你另一种方法是错误的

应该是

  type init_vals_declare is array (0 to 1) of std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);

Vivado不会告诉你另一种方式是错误的。

“Vivado不会告诉你另一种方式是错误的”。这不是违法的,只是做不到你想要的。如果您有一个工具可以在分析时检查静态表达式的边界,您会发现第二个过程中数组类型
init\u vals
的两个位置有边界检查错误,空数组没有元素(IEEE Std 1076-2008 5.3.2.2索引约束和离散范围)。在某些模拟器中,边界检查错误可能会在运行时报告。Vivado应该在某个地方生成一条错误消息,如果没有提交bug的话。(为什么不能是
(1到0)
?您是否尝试过定义一个无约束的向量类型(
是数组(自然范围)
),然后声明一个范围
1到0的信号?@user1155120即使在技术上不是非法的,它也是错误的。如果没有错误,它会合成,对吗?它做了我想做的,如果我做了“下到”变成“到”"。除了Vivado没有告诉我部分代码是错误的之外,没有任何理由说明它不能
1到0
。尽管报告一个bug是徒劳的,因为我使用的是2014.4,Xilinx除了当前软件之外不关心任何东西。@Paebbels根据你的其他评论,Vivado 2014.4。至于这个,我以前试过,但是如果我这样做的话,我无法按我需要的方式分配信号。您的合成工具可能未能报告错误。名义上需要合成(IEEE Std 1076.6-2004,现已撤销)为了模拟使用非元值刺激来证明其输出和设计模型之间的等价性,他们可能不会对被门吃掉的元素这样做。错误将是由于空范围而丢弃某些内容,而不是标记错误(我会仔细搜索您的日志)。如果您不能依靠合成工具可靠地报告(运行时)语言错误,请先模拟。“Vivado不会告诉您另一种方法是错误的”。这不是非法的,只是不能满足您的需要。如果您有一个工具可以在分析时检查静态表达式的边界,您会发现第二个过程中数组类型
init\u vals
的两个位置都有边界检查错误,空数组没有元素(IEEE Std 1076-2008 5.3.2.2索引约束和离散范围)。在某些模拟器中,边界检查错误可能会在运行时报告。如果不提交错误,Vivado应该在某处生成错误消息。(为什么不能是
(1到0)
?您是否尝试定义无约束向量类型(
是数组(自然范围)
)然后声明了一个范围从
1到0的信号
?@user1155120即使它在技术上不是非法的,它也是错的。如果它没有错,它会合成,对吗?它做我想做的,如果我把“downto”变成“to”。除了Vivado没有告诉我部分代码是错误的之外,没有任何理由说明它不能
1到0
。尽管报告一个bug是徒劳的,因为我使用的是2014.4,Xilinx除了当前软件之外不关心任何东西。@Paebbels根据你的其他评论,Vivado 2014.4。至于这个,我以前试过,但是如果我这样做的话,我无法按我需要的方式分配信号。您的合成工具可能未能报告错误。名义上需要合成(IEEE Std 1076.6-2004,现已撤销)为了模拟使用非元值刺激来证明其输出和设计模型之间的等价性,他们可能不会对被门吃掉的元素这样做。错误将是由于空范围而丢弃某些内容,而不是标记错误(我会仔细搜索您的日志)。如果您不能依靠合成工具进行报告(运行时)语言错误可靠,首先模拟。Vivado版本号是多少?合成工具并不总是能最好地诊断此类问题。没关系,它们不必:它们可以假设您已经在模拟中测试了模块。是吗?Vivado 2014.4@BrianDrummond I没有。Vivado不支持VHDL计时模拟我现在没有时间学习verilog。你不应该需要计时模拟,普通的行为模拟人生(在synth之前)应该可以检测到问题,如果Vivado放弃了,我会很惊讶。你确实需要模拟来捕捉这一点,因为
0 downto 1
是一种表示数组的有效方法,没有成员,因此它应该合成为没有硬件的数组……显然它是这样的:所以,不是Vivado bug。如果你不能使用Xilinx模拟器中的任何一个,t你可以使用另一个sim卡,比如ghdl。Vivado的版本号是多少?合成工具并不总是能最好地诊断出这样的问题。没关系,他们不必这样做:他们可以假设你已经在模拟中测试了模块。是吗?Vivado 2014.4@BrianDrummond我没有。Vivado不再支持VHDL计时模拟,我也不支持现在没有时间学习verilog。你不应该需要计时模拟,普通的行为模拟人生(在synth之前)应该可以检测到问题,如果Vivado放弃了,我会感到惊讶。你确实需要模拟来捕捉这个问题
  type init_vals_declare is array (0 to 1) of std_logic_vector (FU_OUTPUT_WIDTH_NB -1 downto 0);