#vhdl
#vhdl
Вопрос:
У меня проблема с некоторым синтаксисом VHDL в каком-то старом коде, который я хочу повторно использовать. Он принимается инструментом синтеза (Synplify), но симулятор (Aldec Active-HDL 8.3) выдает следующую ошибку. (Примечание: эта конструкция была принята предыдущей версией этого симулятора).
#Ошибка: COMP96_0228: buffered_data.vhdl : (19, 28): Фактическое значение должно быть обозначено статическим именем сигнала, если фактическое значение связано с параметром сигнала любого режима.
Я понимаю, что ошибке не нравится (i) в сигнале clk(i), но я не хочу разворачивать цикл до (0), (1) и т.д., Потому что он используется в нескольких разных конфигурациях для разных размеров портов, и я уверен, что должен быть способ описать это.
На данный момент мое решение состоит в том, чтобы инкапсулировать один экземпляр в его собственную иерархию сущностей / архетипов и использовать «generate» для создания экземпляра один раз для каждого порта, но мне это не нравится. Есть идеи получше?
Очень упрощенный пример, показывающий именно мою проблему. (Цель состоит в том, чтобы гарантировать, что данные сначала синхронизируются в FPGA с использованием ее собственных связанных тактовых импульсов, прежде чем что-либо еще)
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity input_buffer is
port(
clk : in std_logic_vector;
data_in : in std_logic_vector;
data_out : out std_logic_vector
);
end input_buffer;
architecture rtl of input_buffer is
constant c_NumOfPorts : integer := 3;
begin
p_process: process(clk)
begin
for i in 0 to c_NumOfPorts-1 loop
if rising_edge(clk(i)) then -- error here
data_out(i) <= data_in(i);
end if;
end loop;
end process;
end rtl;
Комментарии:
1. Просто из любопытства, какая языковая опция у вас включена в Active-HDL и какую версию synplify вы используете? Различия в языковой поддержке между этими двумя инструментами также часто вызывали у меня некоторую изжогу.
2. В настоящее время используется Synplify Pro D-2009.12A, но более ранние версии ведут себя в этом отношении так же. Обе следующие команды Active-HDL 8.3 показывают это: acom -O3 -work work -2002 $ dsn/src/buffered_data.vhdl acom -O3 -work work -2008 $ dsn/src/buffered_data.vhdl Я не нашел никакой другой комбинации, которая принимала бы этот синтаксис (который может быть недопустимым). 7.3 не поддерживал -2008, но тогда у него не было проблем с этим кодом.
Ответ №1:
Если вы измените цикл внутри процесса на инструкцию generate вне процесса, он отлично работает в ModelSim (у меня нет доступного Aldec), и IMHO кажется более чистым, чем один процесс с кучей часов. Я бы также обычно использовал generic для определения ширины портов, вместо того, чтобы вводить их как константу внутри архитектуры, но я полагаю, у вас есть какая-то причина для того, чтобы делать это таким образом:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity input_buffer is
port(
clk : in std_logic_vector;
data_in : in std_logic_vector;
data_out : out std_logic_vector
);
end input_buffer;
architecture rtl of input_buffer is
constant c_NumOfPorts : integer := 3;
begin
gen : for i in 0 to c_NumOfPorts-1 generate
begin
p_process: process(clk(i))
begin
if rising_edge(clk(i)) then -- error here
data_out(i) <= data_in(i);
end if;
end process;
end generate;
end rtl;
Комментарии:
1. Спасибо. Могу поклясться, что я уже пытался вложить процесс за часы в generate, как вы это сделали, но это определенно то, что я ищу.
Ответ №2:
Черт возьми, я получаю то же самое с Modelsim:
Model Technology ModelSim PE vcom 10.0a Compiler 2011.02 Feb 20 2011
-- Loading package STANDARD
-- Loading package TEXTIO
-- Loading package std_logic_1164
-- Compiling entity input_buffer
-- Compiling architecture rtl of input_buffer
** Error: clk.vhd(19): (vcom-1450) Actual (indexed name) for formal "s" is not a static signal name.
** Error: clk.vhd(25): VHDL Compiler exiting
В качестве отступления — есть ли причина для вашего использования constant
, а не просто для этого?
for i in clk'range loop
Но никакого реального ответа мне пока не пришло в голову, извините!
Комментарии:
1. Это упрощенный пример. В исходном коде константа поступает из пакета, и не каждый элемент clk может быть использован. Вопрос больше связан с тем, как лучше написать rising_edge(clk(i)) или изменить код таким образом, чтобы не требовалось объявлять отдельные сигналы для каждого элемента clk. На самом деле я рад, что это также ошибка с ModelSim, поскольку это означает, что Active-HDL, вероятно, правильный, а код, вероятно, неправильный. Но корректность в данном случае по-прежнему определяется как то, что принимает инструмент синтеза 🙂
2. Спасибо, теперь это имеет смысл! (И ругаю себя за то, что не увидел решения «генерировать вне процесса», поскольку я сам использовал его всего пару недель назад!)