реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> PicoBlaze, VHDL-предупреждения при симуляции
Intekus
сообщение Jun 9 2011, 14:53
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 4-03-08
Из: Москва
Пользователь №: 35 621



Использую PicoBlaze на VHDL; при симуляции в ModelSim на мультиплексировании входов ро номеру порта (port_id) выдаётся предупреждение:
Код
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).
#    Time: 0 ps  Iteration: 0  Instance: /pb_warings
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).
#    Time: 0 ps  Iteration: 2  Instance: /pb_warings

Закомментированный вариант выдаёт то же самое, плюс предупреждения от функции конвертации.
Можно ли как-то переписать код, чтоб избавиться от этих предупреждений? Слабо верится, чтоб такое популярное и отлаженное ядро никак нельзя было бы заставить работать "красиво".
Какой опцией vsim отключить их вообще - где-то на форуме находил, но не хочется лишаться этой проверки и во всём остальном проекте.
Проект для демонстрации прилагаю, симуляция - файл pb_warings.do, тестбенч не посчитал нужным делать, так как предупреждения выдаются независимо даже от подачи тактового. Для себя тест сделать пробовал - ситуация та же.
P. S. Если это ближе к SoC - перенесите, но, по-моему, вопрос скорее про "пряморукий" VHDL.
P. P. S. Пока писал - пришла мысль посмотреть код и симуляцию подобного в примерах, идущих у Xilinx в комплекте с самим ядром... Найду таким образом ответ - сюда напишу sm.gif.
Прикрепленные файлы
Прикрепленный файл  PB_warnings.zip ( 45.63 килобайт ) Кол-во скачиваний: 24
 


--------------------
...а Сила, Брат - она - в несиловых решениях.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 9 2011, 15:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Выхода два:
1) добавить начальную инициализацию сигналам
2) прописать в скрипте запуска так:
Код
...
    quietly set StdArithNoWarning        1
    quietly set NumericStdNoWarnings  1
...

(убираете вывод этих ошибок на экран, в принципе не желательно так делать, но если ядро отлажено и интересно просто посмотреть то можно laughing.gif )
Go to the top of the page
 
+Quote Post
Maksim
сообщение Jun 9 2011, 15:29
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 164
Регистрация: 27-06-04
Пользователь №: 194



Цитата(Intekus @ Jun 9 2011, 18:53) *
Использую PicoBlaze на VHDL; при симуляции в ModelSim на мультиплексировании входов ро номеру порта (port_id) выдаётся предупреждение:
Код
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).
#    Time: 0 ps  Iteration: 0  Instance: /pb_warings
# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, the result will be 'X'(es).
#    Time: 0 ps  Iteration: 2  Instance: /pb_warings

Закомментированный вариант выдаёт то же самое, плюс предупреждения от функции конвертации.
Можно ли как-то переписать код, чтоб избавиться от этих предупреждений? Слабо верится, чтоб такое популярное и отлаженное ядро никак нельзя было бы заставить работать "красиво".
Какой опцией vsim отключить их вообще - где-то на форуме находил, но не хочется лишаться этой проверки и во всём остальном проекте.
Проект для демонстрации прилагаю, симуляция - файл pb_warings.do, тестбенч не посчитал нужным делать, так как предупреждения выдаются независимо даже от подачи тактового. Для себя тест сделать пробовал - ситуация та же.
P. S. Если это ближе к SoC - перенесите, но, по-моему, вопрос скорее про "пряморукий" VHDL.
P. P. S. Пока писал - пришла мысль посмотреть код и симуляцию подобного в примерах, идущих у Xilinx в комплекте с самим ядром... Найду таким образом ответ - сюда напишу sm.gif.


Наверно, из-за std_logic_vector
у мультиплексора появляются не определённые состояния. Надо попробовать через case описать его
+ in_port <= in_port_nx when rising_edge(clk); такая запись не имеет начального состояния


--------------------
qwerty
Go to the top of the page
 
+Quote Post
SFx
сообщение Jun 9 2011, 17:27
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



если Dы подаете ресет на kcpsm, то все там инициализируется автоматически по фронту.
До появления первого фронта и при наличие активного ресета, на эти варнинги даже обращать внимания не стоит.

если очень хочется их убрать - просто замените все " : std_logic;" на " : std_logic:='0';" и аналогично с std_logic_vector (как рекомендовал Kuzmi4 в п.1)
Go to the top of the page
 
+Quote Post
Intekus
сообщение Jun 10 2011, 18:02
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 4-03-08
Из: Москва
Пользователь №: 35 621



Цитата(SFx @ Jun 9 2011, 21:27) *
если очень хочется их убрать - просто замените все " : std_logic;" на " : std_logic:='0';" и аналогично с std_logic_vector (как рекомендовал Kuzmi4 в п.1)

Это я попробовал первым делом, по аналогии с Verilog; не получилось, потому и задал вопрос.
Цитата(Kuzmi4 @ Jun 9 2011, 19:28) *
Код
...
    quietly set StdArithNoWarning        1
    quietly set NumericStdNoWarnings  1
...

(убираете вывод этих ошибок на экран, в принципе не желательно так делать, но если ядро отлажено и интересно просто посмотреть то можно laughing.gif )

Спасибо, опции запомню.
Я и написал в первом сообщении - что-то подобное видел, но не хочется терять эти проверки для остального проекта.
Цитата(Maksim @ Jun 9 2011, 19:29) *
Наверно, из-за std_logic_vector
у мультиплексора появляются не определённые состояния. Надо попробовать через case описать его
+ in_port <= in_port_nx when rising_edge(clk); такая запись не имеет начального состояния

Наверное (не пробовал), сработало бы с использованием процесса с wait until rising_edge(clk_flashpb) - первый выбор происходил бы только на фронте clk, когда port_id уже проинициализирован - но в основном проекте есть критичные по латентности входы, которые мультиплексируются прямо на in_port, без регистра и, соответственно, без ожидания фронта.
Через case - попробоавл потом, всё работает; кстати, именно так и сделано в проектах-примерах, которые я смотрел. Но делать хотелось записывать варианты через целые, а не B"??" для единообразия с номерами выходов - они целые, как индексы бит регистра декодированного port_id (для повышения тактовой, как рекомендовано в UG). А при этом сохранялись предупреждения от conv_integer.
В итоге, "победила Дружба - которая пила" sm.gif - остановился на самом прямолинейном варианте изменений исходного проекта: явно доопределять значение port_id при наличии в нём "X":
(логика изменена в сравнении с исходным проектом, со входа убрана регистровая стадия)
Код
--************** Эксперимент по предупреждениям от вспомогательной логики **************************
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
----------------------------------------------------------------------------------------------------
entity pb_warings is port (
  clk, reset :                  in    std_logic;
  e_in_i_one, e_in_i_two :      in    std_logic_vector(7 downto 0);  -- Отладочный 8-бит вход.
  out_port :                    out   std_logic_vector(7 downto 0)); end pb_warings;
architecture rtl of pb_warings is
  signal address :              std_logic_vector(9 downto 0);
  signal instruction :          std_logic_vector(17 downto 0);
  signal port_id_no_x :         std_logic_vector(7 downto 0) := X"00";
  signal port_id, in_port :     std_logic_vector(7 downto 0);
  signal write_strobe, read_strobe, interrupt_r, interrupt_ack : std_logic;
begin
  kcpsm3_is : entity work.kcpsm3 port map(address => address,   -- Ядро PicoBlaze.
      instruction => instruction, port_id => port_id, write_strobe => write_strobe,
      out_port => out_port, read_strobe => read_strobe, in_port => in_port,
      interrupt => interrupt_r, interrupt_ack => interrupt_ack, reset => reset,
      clk => clk);
  instr_rom_is : entity work.instr_rom          -- ПЗУ инструкций.
      port map (address => address, instruction => instruction, clk => clk);
  port_id_no_x <= X"00" when is_x(port_id) else port_id;
  with conv_integer(port_id_no_x) select        -- Чтоб синтезировалось в паралл. мультиплексор.
    in_port <= e_in_i_one when 16#03#,
               e_in_i_two when others;
end rtl; --================================================================================
=========

XST (ISE) синтезировал, post-translate модель проверил - входы переключаются правильно.


--------------------
...а Сила, Брат - она - в несиловых решениях.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016