Выбор случая VHDL не является локально статичным - PullRequest
2 голосов
/ 12 февраля 2020

Этот код работает с некоторыми инструментами

  • Alde c Riviera Pro

, но не с другими

  • GHDL (выбор ошибки должен быть локально установленным c выражение)
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY INSTRUCTION_PROCESSOR IS

    PORT (
        clk : IN std_logic;
        instruction : IN INTEGER
    );
END ENTITY INSTRUCTION_PROCESSOR;
ARCHITECTURE behavioural OF INSTRUCTION_PROCESSOR IS

    TYPE INSTRUCTION_t IS RECORD
        instr : INTEGER;
        cycles : INTEGER;
    END RECORD;

    CONSTANT CMD_A : INSTRUCTION_t := (instr => 0, cycles => 5);
    CONSTANT CMD_B : INSTRUCTION_t := (instr => 1, cycles => 3);

BEGIN
    PROCESSOR : PROCESS (clk)
        VARIABLE loop_cycles : INTEGER := 0;
    BEGIN
        IF clk'event AND clk = '1' THEN
            CASE instruction IS
                WHEN CMD_A.instr =>
                    loop_cycles := CMD_A.cycles;

                WHEN CMD_B.instr =>
                    loop_cycles := CMD_B.cycles;

                WHEN OTHERS =>
                    NULL;
            END CASE;
        END IF;
    END PROCESS;
END ARCHITECTURE;

https://www.edaplayground.com/x/jYD

, поскольку CMD_A и CMD_B объявлены как константа записей я бы ожидал, что это сработает ...

любые слова мудрости или это просто плохая идея?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2020

Я не уверен, что версия ghdl-0.35 на игровой площадке EDA доходит до обработки --std=08 (-2008) для этой проблемы, не пытаясь ее решить. Недавняя версия ghdl-0.37-dev показывает, что она работает:

ghdl -a --std=08 instruction_processor.vhdl
ghdl -e --std=08 tb
instruction_processor.vhdl:68:8:error: for default port binding of component instance "uut":
instruction_processor.vhdl:68:8:error: type of signal interface "instruction" declared at line 56:9
instruction_processor.vhdl:68:8:error: not compatible with type of port "instruction" declared at line 9:9
instruction_processor.vhdl:68:8:error: signal interface "cycles" has no association in entity "instruction_processor"
ghdl:error: compilation error

, даже если testbench и / или заголовок сущности требуют немного работы. И INSTRUCTION_PROCESSOR, и TB находятся в одном и том же файле проекта, который использовался выше.

Редакция IEEE Std 1076-2008 изменила некоторые определения в 9.4.2 Локально stati c primaries

9.4 .2 Локально stati c primaries

Выражение называется локально stati c тогда и только тогда, когда каждый оператор в выражении обозначает неявно определенный оператор или оператор, определенный в одном из пакетов STD_LOGIC_1164, NUMERIC_BIT, NUMERIC_STD, NUMERIC_BIT_UNSIGNED или NUMERIC_STD_UNSIGNED в библиотеке IEEE, и если каждый первичный элемент в выражении является локально stati c первичным, где локально stati c первичный элемент определяется как один из следующих:

...
m) Совокупность записей, в которой все выражения в ассоциациях элементов являются локально c выражениями.
...

До -2008 a агрегат не может быть локально установлен c. Агрегат - это выражение, которое представляет собой «формулу, которая определяет вычисление значения», ранее всегда глобально stati c для выражения выражения постоянного значения.

Позволяет определенным выражениям быть локально stati c из усилий VHDL-200x, дающих ревизию -2008 (Fast Track Proposal FT-22 ). Идея состоит в том, чтобы выражения с локально установленными c основными цветами, которые производят значения из базовых c или предопределенных операций, в том числе найденных в перечисленных выше пакетах библиотек IEEE, реализованы как чистые функции и не зависят от разработки. Чтобы избежать путаницы, вызов процедуры - это утверждение.

Анализ вашего кода с помощью Alde c Riviera Pro использовала флаг -2008 в соответствии с сессией игровой площадки EDA из вашего комментария :

https://www.edaplayground.com/x/jYD

Если из-за ограничений цепочки инструментов требуется более ранняя версия стандарта, оператор case может быть заменен оператором if или параллельным оператором условного присваивания что подразумевает и если утверждение эквивалентно. С другой стороны, выбранный оператор присвоения сигнала подразумевает оператор case и соответствует той же семантике.

0 голосов
/ 12 февраля 2020

Попробуйте ввести ограничение в целое число.

instruction : IN INTEGER RANGE 0 TO ...;
...