Синтаксис VHDL для массивов часов (принимается синтезом, но не активен-HDL simulator)

#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. Спасибо, теперь это имеет смысл! (И ругаю себя за то, что не увидел решения «генерировать вне процесса», поскольку я сам использовал его всего пару недель назад!)