Я добавляю вектор ошибки в свой дизайн.Это набор битов ошибок со всего большого проекта.
Теперь я могу направить каждый бит ошибки от модуля, который его генерирует, до самого верха и подключить его к его месту в векторе ошибок в верхней части.Однако, когда я добавляю, удаляю или изменяю биты ошибок, это приведет ко многим местам, которые мне понадобятся для обновления объявлений портов, и будет неудобно поддерживать.
Я бы предпочел передать весь вектор ошибок по всему моему проекту, и в каждом месте, где возникла ошибка, просто обновите свое место в векторе ошибок.Есть ли способ сделать это в VHDL?
В этом нет ничего плохого с аппаратной точки зрения - каждый бит вектора приводится только в одном месте.
Чтобы проиллюстрировать проблему,Вот пример первого способа сделать это:
entity moduleB is
port (
moduleB_error : out std_logic
)
end moduleB;
architecture rtl of moduleB is
moduleB_error <= '1';
begin
end rtl;
entity moduleC is
port (
moduleC_error : out std_logic
)
end moduleC;
architecture rtl of moduleC is
moduleC_error <= '1';
begin
end rtl;
entity moduleA is
port (
moduleB_error : out std_logic
)
end moduleA;
architecture rtl of moduleA is
signal moduleB_error : std_logic;
begin
inst_moduleB : entity work.moduleB
port map(
moduleB_error => moduleB_error
);
end rtl;
entity top is
port (
error_vector : out std_logic_vector(255 downto 0)
);
end top;
architecture rtl of top is
signal moduleB_error : std_logic;
signal moduleC_error : std_logic;
error_vector(0) <= moduleB_error;
error_vector(1) <= moduleC_error;
begin
inst_moduleA : entity work.moduleA
port map(
moduleB_error => moduleB_error
);
inst_moduleC : entity work.moduleC
port map(
moduleC_error => moduleC_error
);
end rtl;
Я бы предпочел сделать что-то вроде этого:
entity moduleB is
port (
error_vector : out std_logic_vector(1 downto 0)
)
end moduleB;
architecture rtl of moduleB is
error_vector(0) <= '1';
begin
end rtl;
entity moduleC is
port (
error_vector : out std_logic_vector(1 downto 0)
)
end moduleC;
architecture rtl of moduleC is
error_vector(1) <= '1';
begin
end rtl;
entity moduleA is
port (
error_vector : out std_logic_vector(1 downto 0);
)
end moduleA;
architecture rtl of moduleA is
begin
inst_moduleB : entity work.moduleB
port map(
error_vector => error_vector
);
end rtl;
entity top is
port (
error_vector : out std_logic_vector(255 downto 0)
);
end top;
architecture rtl of top is
begin
inst_moduleA : entity work.moduleA
port map(
error_vector => error_vector -- PROBLEM - multiple drivers for error_vector
);
inst_moduleC : entity work.moduleC
port map(
error_vector => error_vector -- PROBLEM - multiple drivers for error_vector
);
end rtl;