Отчет об ошибке несоответствия типов при разработке

#vhdl

#vhdl

Вопрос:

Я пытаюсь отладить некоторые ошибки, которые вызывают некоторые проблемы с несоответствием переменной ширины (этап добавления ниже).

Для этого я хочу использовать report операторы для вывода некоторых переменных, используемых при вычислениях этих переменных ширины.

Однако по какой-то причине даже самый простой оператор отчета:

 report "this is a message";
  

Выдает эту ошибку:

синтаксическая ошибка рядом с отчетом

тип ошибки void не соответствует строковому литералу

Есть идеи, что может быть причиной этого?


Я использую VHDL2008 в Xilinx Vivado.

Весь исходный файл для справки:

 library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.All;
use IEEE.math_real.all;
use work.functions.all;


entity averager is
    generic
    (
        buffer_len: positive := 32; -- MUST BE A POWER OF 2
        input_max: positive := integer'high / buffer_len -- Maximum value of one data input
    );
    port 
    (
        clk : in STD_LOGIC;
        tri : in STD_LOGIC; 
        reset: in std_logic;       
        data_in : in unsigned (get_min_counter_width(input_max) - 1 downto 0);
        avg_out : out unsigned (get_min_counter_width(input_max) - 1 downto 0)
     );
end averager;

architecture behavioral of averager is
    
    -- TODO - Add assert that buffer_len is power of 2


    constant input_width: positive := get_min_counter_width(input_max);
    constant accum_width: positive := get_min_counter_width(input_width * buffer_len); -- Done at synthesis time, perfomance non-critical
    constant avg_bitshift: positive := integer(ceil(log2(real(buffer_len)))); -- How much bitshift is needed for fast divide
    
    signal last_tri: std_logic := '0';
    
    subtype in_val is unsigned(input_width - 1 downto 0);
    type acc_buffer is array(buffer_len - 1 downto 0) of in_val;
    
    constant in_zero: in_val := to_unsigned(0,input_width);
    signal in_buffer: acc_buffer; -- Initialised in reset

    type state is (rst, idle, adding, writing);
    signal current_state: state := rst;
    signal next_state: state := rst;
    
    constant accum_zero: unsigned(accum_width - 1 downto 0) := to_unsigned(0,accum_width);
    signal accumulator: unsigned(accum_width - 1 downto 0) := accum_zero;
    

begin


    sync_proc: process(clk)
    begin
       if (rising_edge(clk)) then
           if (reset = '1') then
               last_tri <= '0';
                current_state <= rst;
            else
                last_tri <= tri;
                current_state <= next_state;
                if (last_tri = '0' and tri = '1') then
                    in_buffer <= in_buffer(in_buffer'high downto in_buffer'low   1) amp; in_val(data_in);
                end if;
            end if;
        end if;
    end process;
    
    next_state_decode: process(current_state, tri)
    begin
       next_state <= current_state;
       case(current_state) is
           when rst =>
               next_state <= idle;
           when idle => 
               if (last_tri = '0' and tri = '1') then
                   next_state <= adding;
               end if;
           when adding =>
                   next_state <= writing;
           when writing =>
                   next_state <= idle;     
       end case;
    end process;
    
    output_decode: process(current_state)
    begin
       next_state <= current_state;
       case(current_state) is
           when rst =>
               next_state <= idle;
               for i in in_buffer'high downto 0 loop
                    in_buffer(i) <= in_zero;
               end loop;
           when idle => 

           when adding =>
               for i in in_buffer'high downto 0 loop
                    accumulator <= unsigned(accumulator)   resize(unsigned(in_buffer(i)),accum_width);
               end loop;
           when writing =>
                   avg_out <= accumulator(accumulator'high downto accumulator'low   avg_bitshift);     
       end case;
    end process;
    
    
    report "this is a message";
    


end behavioral;
  

Комментарии:

1. Оператор отчета — это последовательный оператор. У вас есть это в части инструкции по архитектуре, которая содержит только параллельные инструкции.

2. хотя отчет сам по себе является последовательным, как указано @user1155120, он также следует за оператором assert, который можно использовать как параллельный оператор. Я предлагаю использовать assert false report "this is a message";

3. И здесь Tricky предлагает использовать оператор параллельного утверждения, который разрешен в части описания архитектуры и обеспечивает ту же функциональность в предложении отчета, когда условие утверждения гарантированно оценивается как логическое значение FALSE.

Ответ №1:

report Оператор является последовательным оператором и может использоваться только в последовательных блоках.

Вы не можете использовать report оператор в коде архитектуры, который предназначен только для параллельных операторов.

report Оператор сам по себе является последовательным оператором.

assert Оператор может использоваться в параллельных блоках. Сообщение в report предложении утверждения будет напечатано, если утверждение ложно.

VHDL имеет константу, false , логического типа, которая имеет значение False. Поэтому, если assert false используется an , сообщение в report предложении будет печататься всегда.

Таким образом, an assert false report "your message"; также можно использовать, если вы хотите напечатать сообщение в параллельном блоке.

Комментарии:

1. Вы неверно истолковали этот связанный ответ. Изъятый синтез RTL стандарта IEEE Std 1076.6-2004 сообщает нам, что инструкции отчета игнорируются.

2. Ближе. Последовательные инструкции также могут появляться в подпрограммах (функциях и процедурах). Я бы рекомендовал использовать какие-либо полномочия, отличные от культа личности (например, посмотреть его в стандарте).

3. Оператор report также следует за оператором assert, который может использоваться как параллельный оператор (VHDL 2008 LRM 11.5 ). Следующее выведет сообщение в начале моделирования внутри архитектуры (и выдаст его как информационное сообщение в большинстве инструментов синтеза) assert false report "This is a message";

4. Отчет сам по себе не ограничивается процессом или процедурами, его также можно использовать в функции.

5. У VHDL нет типа false . Это значение логического типа. Assert напечатает отчет, если условие примет значение false. Следовательно, при использовании assert false всегда будет выводиться оператор отчета. Отчеты не игнорируются средствами синтеза, в зависимости от того, где они используются. по опыту, синтез как в Quartus, так и в Vivado может быть остановлен при сбое параллельного утверждения или в функции инициализации, а также будет выводить сообщение отчета. Раньше у Vivado была ошибка, из-за которой последовательные утверждения / отчеты останавливали синтезатор, если у них была серьезная ошибка или сбой.