Перейти к содержанию
    

Vivado 2016.3 не моделирует элементарную операцию

Всем добрый день

 

Перешёл на Vivado 2016.3 и столкнулся с тем, что симулятор зависал на стадии "elaborate step".

Раскопки привели к тому, что зависание происходит при передаче в процедуру двух параметров:

---- Сигналы для взаимодействия с моделью процессора ----    
signal        adm_cmd        : bh_cmd;     -- команда
signal        adm_ret        : bh_ret;     -- ответ

...

test_m3_connect( adm_cmd, adm_ret );

 

Описания типов в файле cmd_sim_pkg.vhd :

type mem32 is array (natural range<>) of std_logic_vector( 31 downto 0 );         
type mem64 is array (natural range<>) of std_logic_vector( 63 downto 0 );         
constant mem_size:integer:=32; -- размер массива памяти

type bh_cmd is record     
    cmd:     integer;  
    adr:    mem32( mem_size-1 downto 0 );
    data:     mem64( mem_size-1 downto 0 );
    p0:        integer;
    p1:        integer;
end record;              

-- Формат команды
-- cmd:
--        1 - read
--        2 - write
--          20 - запись числа в память
--        21 - чтение числа из памяти
--    p0[31..16] - длина блока данных
--     p0[0] - 1 - цикл 64 бита
--          0 - цикл 32 бита
--  mem - данные для чтения или записи

type bh_ret is record
    ret:    integer;
    data:    mem64( mem_size-1 downto 0 );
end record;

 

Этот код у меня работает уже больше 12 лет, в том числе и на Vivado 2016.2; А вот в новой версии они что-то намудрили.

 

Кто-нибуть с сталкивался с подобным ?

 

Архив проекта - в приложении.

 

 

 

 

test_pkg.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, странная штука... Но в QuestaSim все запустилось без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно натыкался на подобные глюки Vivado. Видимо неспроста все советуют использовать сторонние инструменты симуляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мне, так какой-то не железячный стиль написания кода. Получаются сигналы с немерянной разрядностью. Заглючишь тут. Vivado, конечно, не права, но и тс есть что усовершенствовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мне, так какой-то не железячный стиль написания кода. Получаются сигналы с немерянной разрядностью. Заглючишь тут. Vivado, конечно, не права, но и тс есть что усовершенствовать.

так может только для симулиции. как и тип real например

на мой взгляд симуляция должна происходить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зависающий код теперь сведён к одному файлу.

 

Вот определение типа и двух процедур:

 

type mem32 is array (natural range<>) of std_logic_vector( 31 downto 0 );         
type mem64 is array (natural range<>) of std_logic_vector( 63 downto 0 );         
constant mem_size:integer:=32; -- размер массива памяти    

type bh_ret2 is record
    ret:    std_logic;
    ret4:    std_logic_vector( 63 downto 0 );
--    adr:    mem32( mem_size-1 downto 0 );    
    data:    mem64( 31 downto 0 );
--    data2:    mem64( 31 downto 0 );
    ret2:    std_logic;
end record;    
    
signal  rtt     : bh_ret2;
    
--! Проверка установки соединения 
procedure test_y 
        (
          signal  ret:    out  bh_ret2  --! ответ
        ) 
is

begin
    
        
end test_y;    
    
    
--! Проверка установки соединения 
procedure test_x 
        (
          signal  ret:    in bh_ret2  --! ответ
        ) 
is

begin
    
        
end test_x;

 

 

Вызов test_y проходит нормально.

 

Вызов test_x приводит к зависанию симулятора.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так может только для симулиции. как и тип real например

на мой взгляд симуляция должна происходить

Конечно должна, но в кривом симуляторе, заточенном на синтезируемый код, может глючить.

 

И примерчик этот, вызывающий глюк, стоит послать Xilinx, например, на их форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Зависающий код теперь сведён к одному файлу.

--! Проверка установки соединения

procedure test_y

(

signal ret: out bh_ret2 --! ответ

...

 

--! Проверка установки соединения

procedure test_x

(

signal ret: in bh_ret2 --! ответ

...

 

Вызов test_y проходит нормально.

Вызов test_x приводит к зависанию симулятора.

Разница в направлении (out/in) порта это так и должно ?

Для Verilog в Vivado есть документированный глюк/фича с неправильным направлением порта в модуле.

При этом во время компиляции error не генерируется а просто оптимизируется получающаяся неправильная логика.

Может и при симуляции VHDL такое тоже происходит?

 

Удачи! Rob.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разница в направлении (out/in) порта это так и должно ?

 

Да.

В оригинале мне нужно передавать и принимать сигнал сложной структуры.

Выяснилось, что порт "in" приводит симулятор в ступор.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...