2013-07-25 2 views
2

При тестировании простой реализации жизненного цикла в VHDL симуляция GHDL пустого тестового стенда висит со 100% -ным использованием ЦП после печати сообщения «Конец теста».GHDL висит на тестовом стенде

Вот код:

----- Package ------------------------------ 
library ieee; 
use ieee.std_logic_1164.all; 

package data_types is 
    type array2D is array (0 to 10, 0 to 10) of std_logic; 
end data_types; 


----- Main Code ---------------------------- 
library ieee; 
use ieee.std_logic_1164.all; 
use work.data_types.all; 

entity de0 is 
    port (matrix : inout array2D); 
end de0; 


architecture life of de0 is 

    -- Return the integer value of a cell, treating all out of bounds as 0 
    function cellValue (matrix : array2D; x, y : integer) return integer is 
    begin 
     if (y < 0 or y > matrix'high(1) or x < 0 or x > matrix'high(2) or matrix(y, x) = '0') then 
      return 0; 
     else 
      return 1; 
     end if; 
    end cellValue; 

begin 

    -- Iterate over all cells 
    row: for y in matrix'range(1) generate 
     column: for x in matrix'range(2) generate 

      process 

       variable neighbours : integer := cellValue(matrix, x - 1, y - 1) + 
               cellValue(matrix, x - 1, y) + 
               cellValue(matrix, x - 1, y + 1) + 
               cellValue(matrix, x, y - 1) + 
               cellValue(matrix, x, y + 1) + 
               cellValue(matrix, x + 1, y - 1) + 
               cellValue(matrix, x + 1, y) + 
               cellValue(matrix, x + 1, y + 1); 

      begin 

       -- Update the cell value according to the game of life rules 
       if (neighbours = 2 or neighbours = 3) then 
        matrix(y, x) <= '1'; 
       else 
        matrix(y, x) <= '0'; 
       end if; 

      end process; 

     end generate; 
    end generate; 

end life; 

И испытательный стенд:

library ieee; 
use ieee.std_logic_1164.all; 
use work.data_types.all; 

entity life_tb is 
end life_tb; 

architecture behaviour of life_tb is 
    component life 
     port (matrix : inout array2D); 
    end component; 

    for test: life use entity work.de0; 
    signal matrix : array2D; 

begin 

    test: life port map (matrix => matrix); 

    process 
    begin 
      assert false 
       report "End of test" severity note; 

      wait; 

    end process; 
end behaviour; 
+0

Отчет в утверждении утверждения будет происходить сразу один раз, а затем никогда больше. – user1155120

ответ

3

Процесс в жизни de0 не имеет ни список чувствительности, ни ожидание заявление, поэтому этот процесс будет работать вечно , просто выполняя инструкции в этом процессе в бесконечном цикле в одно и то же время моделирования, и поэтому симуляция не остановится.

Вы можете исправить это, добавив список чувствительности (matrix) или подождите с некоторым условием.

+0

Существует два условия, которые могут привести к тому, что ghdl завершит симуляцию. Во-первых, это отсутствие сигнальных транзакций, второе - использование опции времени выполнения, обеспечивающей стоп-время. Ни одно условие не встречается в модели. Без использования времени моделирования модель ограничивается отчетами для передачи информации о последовательном состоянии. Если модель должна была быть приурочена, можно было бы определить, почему это идеальный релаксационный генератор (и он, по-видимому, является функцией cellValue), сохраняя формы сигналов. Тогда потребуется секундомер. – user1155120

+0

Первоначально у меня были часы в списке чувствительности, так что он обновлялся на каждом тактовом сигнале, однако я не знаю, как имитировать часы в тестовом стенде (ручная переключение clk, похоже, не работает).Как я могу это сделать или использовать вместо этого wait? – alexdavey

+0

@DavidKoontz: Если моя модель правильная, я не вижу, где вообще будут какие-либо сигнальные переходы на этом стенде. Не могли бы вы объяснить, почему это не так? – alexdavey

4

Это дополняет прекрасный ответ МортенZdk. Это слишком просто, чтобы идти в комментариях и не меняет этот ответ. Он демонстрирует, как заставить вашу модель синхронизироваться, а также как остановить ее непрерывную работу.

Размещение матрицы является список чувствительности немаркированного процесса в de0 (жизнь)

  process (matrix) 

дает:

ghdl -a de0.vhdl 
ghdl -a life_tb.vhdl 
ghdl -e life_tb 
ghdl -r life_tb 
life_tb.vhdl:22:13:@0ms:(assertion note): End of test 

Испытание утверждения выполняется только один раз и сразу же, он этого не делает конец теста.

Обратите внимание, что модель завершена, но мы понятия не имеем, как это сделать. Идея времени моделирования заключается в том, чтобы позволить сохранять формы колебаний, а также относительное время для квантования.

Добавление часов для моделирования:

В декларативной области архитектуры мы объявляем тактовый сигнал:

signal clk: std_logic; 

Вы можете добавить новый процесс для создания часов в вашем тестбенче (life_tb.vhdl):

CLOCK: 
    process 
    begin 
     wait for 10 ns; 
     clk <= '0'; 
     wait for 10 ns; 
     clk <= '1'; 
    end process; 

У этого есть период 20 нс, а первый положительный фронт - 10 нс в моделирование.

Добавим часы в порт на жизнь:

component life 
     port (
      matrix : inout array2D; 
      clk:  in  std_logic 
    ); 
    end component; 

Мы обновляем de0 сущность использовать CLK:

entity de0 is 
port (
    matrix : inout array2D; 
    clk:  in std_logic 
); 

Мы обновляем процесс чувствителен к CLK и быть приурочено :

  process (clk) 

      variable neighbours : integer := cellValue(matrix, x - 1, y - 1) + 
              cellValue(matrix, x - 1, y) + 
              cellValue(matrix, x - 1, y + 1) + 
              cellValue(matrix, x, y - 1) + 
              cellValue(matrix, x, y + 1) + 
              cellValue(matrix, x + 1, y - 1) + 
              cellValue(matrix, x + 1, y) + 
              cellValue(matrix, x + 1, y + 1); 

     begin 
      if clk'event and clk = '1' then 
      -- Update the cell value according to the game of life rules 
       if (neighbours = 2 or neighbours = 3) then 
        matrix(y, x) <= '1'; 
       else 
        matrix(y, x) <= '0'; 
       end if; 
      end if; 

Теперь, потому что CLK является свободный ход генератора необходимо использовать стоп-время:

ghdl -a de0.vhdl 
ghdl -a life_tb.vhdl 
ghdl -e life_tb 
ghdl -r life_tb --stop-time=100ns --wave=life_tb.ghw 
life_tb.vhdl:35:13:@0ms:(assertion note): End of test 
ghdl:info: simulation stopped by --stop-time 

clocked life simulation

Если пролистать maxtrix элементов, которые мы находим, что четыре угла матрицы устанавливаются в «1» в первом случае часы. Все остальные элементы установлены в '0'.

Второе событие clk, показанное на курсоре, не присваивает новые значения никаким матричным элементам (четыре матричных угла кажутся тремя соседями, они стабильны).

Если матрица находилась в списке чувствительности к процессу, вместо этого симуляция остановится после второго раза (без синхронизации).

И точка времени моделирования заключается в том, что она позволяет вам заглянуть в симуляцию, исследуя формы волны, в данном случае с gtkwave. Альтернативой является утверждение и/или отчеты, но в несрочной симуляции они будут возникать на границах цикла, и нет гарантии порядка, если они не являются последовательными заявлениями в том же процессе.

И вы могли бы отметить, не изменяя свой исходный код, отличный от утверждения утверждения, оценивающего матрицу, на тестовом стенде, и вы могли бы заставить вашу модель перестать имитировать. Вы хотите изменить пороговое значение для остановки моделирования с опцией времени выполнения (например, --assert-level = warning, где утверждение о недостатке matrix -event является предупреждением. (И это утверждение означало бы фактический конец тест).

Крепеж CellValue является таким, как они говорят, упражнения читателю. (как и в том, как и почему матричные углы получить набор в первую очередь?)

интересная часть говорит, когда ваш модель работает в режиме покоя при синхронизации. Вы можете использовать matrix'event для переключения сигнала (использовать его как часы) и использовать часы для проверки двух последовательных вхождений одного и того же значения этого сигнала. И, конечно, сигнал может использоваться в утверждение утверждения с утвердительным уровнем для завершения моделирования при покоя.

Синтезируемое оборудование немного более активно.