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