МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТАКафедра БІТ
Звіт
до лабораторної роботи № 4
з дисципліни: «Комп’ютерні методи високорівневого проектування
пристроїв захисту»
на тему: «Проектування систем тестування програмних моделей обчислювальних пристроїв на мові VHDL»
Львів - 2016
Мета роботи – вивчення реалізації процедур і функцій на мові VHDL, набуття практичних навичок використання засобів файлового введення-виведення в програмах на мові VHDL, вивчення принципів побудови систем тестування програмних моделей комп’ютерних пристроїв та набуття практичних навичок їх створення на мові VHDL.
Теоретична частина
Архітектура системи тестування програмних моделей комп’ютерних пристроїв
Тестування програмних моделей комп’ютерних пристроїв виконується під час їх розроблення принаймні двічі – на етапі функціональної симуляції і на етапі часової симуляції. Більшість помилок, внесених під час їх проектування, виявляється на етапі функціональної симуляції. Відтестованою вважається та програмна модель, яка успішно пройшла функціональну і часову симуляцію.
Для проведення тестування використовують спеціально розроблені системи тестування програмних моделей комп’ютерних пристроїв. Структура системи тестування в цілому залежить від специфіки конкретного тестованого пристрою, оскільки вона повинна, з одного боку, якомога повніше відображати реальне середовище роботи пристрою, а з іншого – забезпечувати можливість перевірки коректності його роботи у всіх можливих режимах. Як правило, для програмних моделей спеціалізованих пристроїв, що реалізують певні стандартизовані алгоритми, використовують стандартизовані тестові набори. Тестування кожної окремої моделі потребує застосування спеціально розробленої системи тестування з використанням специфічних тестових наборів.
Структуру типової системи тестування програмних моделей комп’ютерних пристроїв представлено на Рис. 1.
/
Рис. 1. Структура типової системи тестування програмних моделей комп’ютерних пристроїв.
На вхід тестованого пристрою подають вхідні тестові набори, результати обробки яких порівнюють із відповідними їм зразковими значеннями – вихідними тестовими наборами. Вказані тестові набори записують у текстових файлах, читання і запис яких виконують з використанням вище розглянутих конструктцій.
Порівняння результатів обробки вхідних тестових наборів і зразкових значень виконує пристрій порівняння. Результат його роботи визначає коректність (чи некоректність) функціонування тестованого пристрою. Функції керування тестованим пристроєм та пристроєм порівняння виконує пристрій керування системою тестування. Сигнали синхронізації та початкового скиду системи зазвичай подають ззовні.
Практична частина
Програма на мові С, яка реалізує заданий у варіанті алгоритм шифрування
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace lab_4
{
class Program
{
static void Main(string[] args)
{
string str;
int k = System.IO.File.ReadAllLines("in.txt").Length;
int[] inp = new int[k];
int[] key = new int[5];
key[0] = 0;
key[1] = 0;
key[2] = 0;
key[3] = 0;
key[4] = 0;
int[] oup = new int[k];
System.IO.StreamReader infile = new System.IO.StreamReader("in.txt");
System.IO.StreamWriter outfile = new System.IO.StreamWriter("out.txt");
for (int i = 0; i < k; i++)
{
str = infile.ReadLine();
Console.WriteLine(str);
if (str == "111")
inp[i] = 7;
if (str == "110")
inp[i] = 6;
if (str == "101")
inp[i] = 5;
if (str == "100")
inp[i] = 4;
if (str == "011")
inp[i] = 3;
if (str == "010")
inp[i] = 2;
if (str == "001")
inp[i] = 1;
if (str == "000")
inp[i] = 0;
Console.WriteLine(inp[i]);
if (i < 5)
oup[i] = (inp[i] + key[i]) % 8;
else
oup[i] = (inp[i] + inp[i - 5]) % 8;
if (oup[i] == 7)
outfile.WriteLine("111");
if (oup[i] == 6)
outfile.WriteLine("110");
if (oup[i] == 5)
outfile.WriteLine("101");
if (oup[i] == 4)
outfile.WriteLine("100");
if (oup[i] == 3)
outfile.WriteLine("011");
if (oup[i] == 2)
outfile.WriteLine("010");
if (oup[i] == 1)
outfile.WriteLine("001");
if (oup[i] == 0)
outfile.WriteLine("000");
}
outfile.Close();
Console.ReadLine();
}
}
}
Тестові набори, що використовувались для перевірки правильності роботи цифрового пристрою
/ /
Код програми, що реалізує мовою VHDL систему тестування програмних моделей комп’ютерних пристроїв
Пристрій тестування
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE std.textio.ALL;
USE ieee.std_logic_textio.ALL;
ENTITY TestBench IS
GENERIC (
tclk : time := 60 ns; -- період сигналу синхронізації
input_file : string := "C:\in.txt"; -- файл із вхідними тестовими наборами
zrazkovuy_output_file : string := "C:\out.txt" -- файл із вихідними тестовими наборами
);
END TestBench;
ARCHITECTURE Test OF TestBench IS
Component vigener is
port(
data_in : IN STD_LOGIC_Vector (2 downto 0);
key : IN STD_LOGIC_Vector (2 downto 0);
switch : IN STD_LOGIC;
g_c : IN Std_logic;
g_r : IN Std_logic;
data_out : OUT STD_LOGIC_Vector (2 downto 0)
);
end component;
SIGNAL rst : std_logic; -- загальний скид
SIGNAL clk : std_logic; -- загальний сигнал синхронізації
SIGNAL in_data_valid : std_logic; -- прапорець підтвердження вхідних даних
SIGNAL in_data : std_logic_vector(2 DOWNTO 0); -- вхідні дані
SIGNAL in_key : std_logic_vector(2 DOWNTO 0); -- вхідний ключ
SIGNAL out_data : std_logic_vector(2 DOWNTO 0); -- вихідні дані
SIGNAL out_data_valid : std_logic; -- прапорець підтвердження вихідних даних
SIGNAL end_sim : boolean := false;
signal switch : std_logic := '1';
SIGNAL res_tmp : std_logic_vector(2 DOWNTO 0) := "000"; -- вихідні дані
BEGIN
TestBench : vigener
PORT MAP (
data_in => in_data,
key => in_key,
switch => switch,
g_r => rst,
g_c => clk,
data_out => out_data
);
rst_proc: PROCESS
BEGIN
rst <= '1'; -- активування сигналу скиду
WAIT FOR tclk/4; -- очікування виконання скиду в пристрої
rst <= '0'; -- деактивування сигналу скиду
WAIT; -- сон
END PROCESS rst_proc;
-- генерування сигналу синхронізації до кінця симуляції
clk_proc: PROCESS
BEGIN
IF end_sim = false THEN
clk <= '0';
WAIT FOR tclk/2;
ELSE
WAIT;
END IF;
IF end_sim = false THEN
clk <= '1';
WAIT FOR tclk/2;
ELSE
WAIT;
END IF;
END PROCESS clk_proc;
-- читання даних з файлу і пересилання до тестованого пристрою
data_read_proc: PROCESS
FILE in_file : text IS input_file; -- файл із вхідними тестовими наборами
VARIABLE iline : line; -- стрічка файлу
VARIABLE in_tmp : std_logic_vector(2 DOWNTO 0);
variable full_key : std_logic_vector(15 downto 1) := "000000000000000";
variable j : integer := 0;
variable line_content : string(1 to 3);
variable counter : integer := 1;
--variable char : character:='0';
BEGIN
IF rst = '1' THEN -- початкова ініціалізація вхідних сигналів
in_data <= (OTHERS => '0');
in_key <= (OTHERS => '0');
in_data_valid <= '0';
switch <= '1';
-- після скиду
ELSE -- зчитування всіх даних стрічка за стрічкою і передача до процесора
read_file: WHILE NOT(endfile(in_file)) LOOP
WAIT UNTIL clk = '0'; -- завантаження значення ключа при clk = 0
in_data_valid <= '0'; -- це не дані
readline(in_file, iline); -- це не дані
READ (iline,line_content);
for j in 1 to 3 loop
if(line_content(j) = '0') then
in_data(3-j) <= '0';
else
in_data(3-j) <= '1';
end if;
end loop;
if counter < 6 then
in_key <= full_key(counter*3 downto (1 + (counter - 1)*3));
counter := counter +1;
else
switch <= '0';
end if;
WAIT FOR tclk/8; -- деяка затримка
in_data_valid <= '1'; -- це дійсні дані
END LOOP read_file;
IF endfile(in_file) THEN
WAIT UNTIL clk = '0'; -- закінчення завантаження останнього
-- блоку даних
in_data_valid <= '0'; -- більше нема даних
WAIT FOR 4*tclk; -- очікуємо на завершення шифрування
-- і тестування
end_sim <= true; -- кінець симуляції
WAIT;
END IF;
END IF;
END PROCESS data_read_proc;
- порівняння вихідних даних процесора із зразковими даними з файлу
compare_proc: PROCESS (clk, out_data)
FILE res_file : text IS zrazkovuy_output_file; -- файл із зразковими даними
VARIABLE i_line : line; -- стрічка файлу
variable res_line_content : string(1 to 3);
--VARIABLE res_tmp : std_logic_vector(2 DOWNTO 0);
variable res_char : character:='0';
BEGIN
-- порівнюємо дані коли out_data_valid is 1 і clk=0
IF clk'EVENT AND clk = '0' THEN
-- IF out_data_valid = '1' THEN
IF NOT(endfile(res_file)) THEN
readline(res_file, i_line); -- читаємо зразок
READ (i_line,res_line_content);
for j in 1 to 3 loop
res_char := res_line_content(j);
if(res_char = '0') then
res_tmp(3-j) <= '0';
else
res_tmp(3-j) <= '1';
end if;
end loop;
IF res_tmp /= out_data THEN -- порівняння даних з файлу і з виходу процесора
ASSERT false REPORT "ERROR IN DATA COMPARING!!! #" SEVERITY warning;
ELSE
ASSERT false REPORT "DATA COMPARED SUCCESFULL!!! #" SEVERITY note;
END IF;
END IF;
END IF;
END PROCESS compare_proc;
END Test;
Пристрій шифрування
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY vigener IS
PORT(
data_in : IN STD_LOGIC_Vector (2 downto 0);
key : IN STD_LOGIC_Vector (2 downto 0);
switch : IN STD_LOGIC;
g_c : IN Std_logic;
g_r : IN Std_logic;
data_out : OUT STD_LOGIC_Vector (2 downto 0)
);
END vigener;
ARCHITECTURE vigen OF vigener IS
Component RIV is
port(
clk_riv : in STD_LOGIC;
reset_riv : in STD_LOGIC;
D_riv : in STD_LOGIC_VECTOR(2 downto 0);
Q_riv : out STD_LOGIC_VECTOR(2 downto 0)
);
end component;
Component RC is
port(
d : in STD_LOGIC;
clk : in STD_LOGIC;
reset : in STD_LOGIC;
q : out STD_LOGIC
);
end component;
Component MS is
port(
D0 : in STD_LOGIC_vector (2 downto 0);
D1 : in STD_LOGIC_vector (2 downto 0);
A : in STD_LOGIC;
Q : out STD_LOGIC_vector (2 downto 0)
);
end component;
Component SM IS
port(
x : IN STD_LOGIC_Vector (2 downto 0);
y : IN STD_LOGIC_Vector (2 downto 0);
p_in : IN STD_LOGIC;
sumVector : OUT STD_LOGIC_Vector (2 downto 0);
p_out : OUT STD_LOGIC
);
end component;
Component RS is
port(
clk : in STD_LOGIC;
reset : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(2 downto 0);
Q : out STD_LOGIC_VECTOR(2 downto 0)
);
end component;
signal rivToMs : std_logic_vector(2 downto 0);
signal rcToMs : std_logic;
signal msToSm : std_logic_vector(2 downto 0);
signal smToRs : std_logic_vector(2 downto 0);
signal bitPer : std_logic;
signal out_data: std_logic_vector (2 downto 0);
BEGIN
v_riv:RIV
port map (
clk_riv => g_c,
reset_riv => g_r,
D_riv => data_in,
Q_riv => rivToMs
);
v_rc:RC
port map (
d => switch,
clk => g_c,
reset => g_r,
q => rcToMs
);
v_ms:MS
port map (
D0 => rivToMs,
D1 => key,
A => rcToMs,
Q => msToSm
);
v_sm:SM
port map (
x => data_in,
y => msToSm,
p_in => '0',
sumVector => smToRs,
p_out => bitPer
);
v_rs:RS
port map (
clk => g_c,
reset => g_r,
D => smToRs,
Q => out_data
);
data_out <= out_data;
END vigen;
Часові діаграми роботи системи тестування
/
Рис.2. Часова діаграма роботи системи тестування
Висновки
Під час виконання даної лабораторної роботі я ознайомилися з принципами створення структурних описів мовою VHDL та розробила функціональну модель системи тестування програмних моделей комп’ютерних пристроїв, а саме пристрою шифрування.