После особо долгого перерыва (чуть ли не полгода) вернулся к электронным экскрементам. Скачал новую версию ISE (11.2), которая нормально ставится на Вислу-64 и даже работает нормально и в 32-, и в 64-разрядном режимах. Правда, лицензии для полной версии нет, поэтому использую WebPack. Сходу разобрался в общих чертах, как использовать ISim для симуляции схем. Правда, сия программа то ли не работает в 64-разрядном WebPack, то ли вообще есть только в 32-разрядном варианте: для симуляции надо использовать именно 32-разрядный WebPack.
Пока сделал простейший тест для простейшего же одноразрядного компаратора (выдаёт 1 на выходе, если оба входа равны). Код компаратора на VHDL:
Код:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Comparator1 is
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
EQ : out STD_LOGIC);
end Comparator1;
architecture Behavioral of Comparator1 is
signal P0, P1 : STD_LOGIC;
begin
EQ <= P0 or P1;
P0 <= (not A) and (not B);
P1 <= A and B;
end Behavioral;
Код тестбенча:
Код:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
LIBRARY STD;
USE STD.TEXTIO.all;
ENTITY TB_Comparator1 IS
END TB_Comparator1;
ARCHITECTURE behavior OF TB_Comparator1 IS
-- Объявление объекта для теста
COMPONENT Comparator1
PORT(
A : IN std_logic;
B : IN std_logic;
EQ : OUT std_logic
);
END COMPONENT;
--Inputs
signal A : std_logic := '0';
signal B : std_logic := '0';
--Outputs
signal EQ : std_logic;
BEGIN
-- Подсоединение тестируемого объекта (UUT)
uut: Comparator1 PORT MAP (
A => A,
B => B,
EQ => EQ
);
-- Собственно процесс тестирования
stim_proc: process
variable Message : line;
begin
-- Ожидание для выполнения начального сброса схемы
wait for 100 ns;
-- Первый тест
A <= '0';
B <= '0';
wait for 5 ns;
if EQ = '1' then
Write(Message, "Test 1 PASS");
else
Write(Message, "Test 1 FAIL");
end if;
WriteLine(Output, Message);
wait for 95 ns;
-- Второй тест
A <= '0';
B <= '1';
wait for 5 ns;
if EQ = '0' then
Write(Message, "Test 2 PASS");
else
Write(Message, "Test 2 FAIL");
end if;
WriteLine(Output, Message);
wait for 95 ns;
-- Третий тест
A <= '1';
B <= '0';
wait for 5 ns;
if EQ = '0' then
Write(Message, "Test 3 PASS");
else
Write(Message, "Test 3 FAIL");
end if;
WriteLine(Output, Message);
wait for 95 ns;
-- Четвёртый тест
A <= '1';
B <= '1';
wait for 5 ns;
if EQ = '1' then
Write(Message, "Test 4 PASS");
else
Write(Message, "Test 4 FAIL");
end if;
WriteLine(Output, Message);
wait for 95 ns;
-- Тестирование закончено
assert false report "Simu1ation Comp1eted" severity failure;
end process;
END;