Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PicoBlaze
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Intekus
Использую 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.
Kuzmi4
Выхода два:
1) добавить начальную инициализацию сигналам
2) прописать в скрипте запуска так:
Код
...
    quietly set StdArithNoWarning        1
    quietly set NumericStdNoWarnings  1
...

(убираете вывод этих ошибок на экран, в принципе не желательно так делать, но если ядро отлажено и интересно просто посмотреть то можно laughing.gif )
Maksim
Цитата(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); такая запись не имеет начального состояния
SFx
если Dы подаете ресет на kcpsm, то все там инициализируется автоматически по фронту.
До появления первого фронта и при наличие активного ресета, на эти варнинги даже обращать внимания не стоит.

если очень хочется их убрать - просто замените все " : std_logic;" на " : std_logic:='0';" и аналогично с std_logic_vector (как рекомендовал Kuzmi4 в п.1)
Intekus
Цитата(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 модель проверил - входы переключаются правильно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.