Вы находитесь на странице: 1из 7

Міністерство освіти і науки України

Харківський національный університет радиоелектроніки

Кафедра Автоматизація проектування обчислювальної техніки


(повна назва)

Зві т
з лабораторної работи №6
дисципліна: «Технології проектування компьютерных систем»

Побудова середовища верифікації


(тема)

Виконав: Проверил:
Ст. гр. КІУКІ 16-4 Шевченко О.Ю.
Давиденко Б.Є

Харків 2019
6.1 Цель работы

Изучение методов построения среды верификации на основе библиотеки UVM для


SystemVerilog

6.2 Исходные условия для выполнения работы

Вариант №7

op 3 бита

pack_len 32 битов

src 32 битов

dst 32 битов

Управление генерацией. Создать два блока констант управления:


Переменная pack_len определяется в диапазоне 2-7. Возможные значения для
переменной src заданы множеством ( 1-10, 101-110). Возможные значения для
переменной dst заданы множеством ( 1-10, 64-74).

6.2 Ход выполнения работы

6.6.1 SystemVerilog-модель автомата согласно варианту задания


разработать модель автомата, используя стиль SV. Разработать для него
TestBench. 
// Code your testbench here
// or browse Examples
`include "uvm_macros.svh"
`include "my_testbench_pkg.svh"

// Это модуль верхнего уровня, который содержит модуль DUT и интерфейс


// Этот модуль запускает тестирование
module top;
import uvm_pkg::*;
import my_testbench_pkg::*;

// Копия интерфейса
dut_if dut_if1();

// Копия тестируемого устройства DUT и подключение его к интерфейс


dut dut1(.dif(dut_if1));

// Генератор синхросигнала
initial begin
dut_if1.clock = 0;
forever #5 dut_if1.clock = ~dut_if1.clock;
end

initial begin
// Поместить интерфейс в конфигурационную базу UVM
uvm_config_db#(virtual dut_if)::set(null, "*", "dut_vif", dut_if1);
// Запуск тестирования
run_test("my_test");
end

// База вейвформ
initial begin
$dumpfile("dump.vcd");
$dumpvars(0, top);
end

endmodule
Листинг 6.1 – TestBench.sv
package my_testbench_pkg;
import uvm_pkg::*;

// Подключение файлов с классами секвера, транзакций и дравера


`include "my_sequence.svh"
`include "my_driver.svh"

class my_agent extends uvm_agent;


`uvm_component_utils(my_agent)

my_driver driver;
uvm_sequencer#(my_transaction) sequencer;

function new(string name, uvm_component parent);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


driver = my_driver ::type_id::create("driver", this);
sequencer =
uvm_sequencer#(my_transaction)::type_id::create("sequencer", this);
endfunction

// Во время UVM фазы подключения, создается соединение между


секвенсером и драйвером
function void connect_phase(uvm_phase phase);
driver.seq_item_port.connect(sequencer.seq_item_export);
endfunction

task run_phase(uvm_phase phase);


// Придержать тест от выполнения
phase.raise_objection(this);
begin
my_sequence seq;
seq = my_sequence::type_id::create("seq");
seq.start(sequencer);
end
// Позволить выполенение тестов
phase.drop_objection(this);
endtask

endclass

class my_env extends uvm_env;


`uvm_component_utils(my_env)

my_agent agent;

function new(string name, uvm_component parent);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


agent = my_agent::type_id::create("agent", this);
endfunction

endclass

class my_test extends uvm_test;


`uvm_component_utils(my_test)

my_env env;

function new(string name, uvm_component parent);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


env = my_env::type_id::create("env", this);
endfunction

task run_phase(uvm_phase phase);


// Придержать тест от выполнения
phase.raise_objection(this);
#10;
`uvm_warning("", "Hello World!")
// Позволить выполенение тестов
phase.drop_objection(this);
endtask

endclass

endpackage
Листинг 6.2 – my_testbench_pkg.shv

class my_transaction extends uvm_sequence_item;

`uvm_object_utils(my_transaction)

rand bit [2:0] op;


rand bit [31:0] pac_len;
rand bit [31:0] src;
rand bit [31:0] dst;
constraint c_Pac_Len { pac_len inside {[2:7]}; }
constraint c_Type { src inside {[1:10],[101:110]}; dst inside {[1:10],
[64:74]}; }

function new (string name = "");


super.new(name);
endfunction

endclass: my_transaction

class my_sequence extends uvm_sequence#(my_transaction);

`uvm_object_utils(my_sequence)

function new (string name = "");


super.new(name);
endfunction

task body;
repeat(8) begin
req = my_transaction::type_id::create("req");
start_item(req);

if (!req.randomize()) begin
`uvm_error("MY_SEQUENCE", "Randomize failed.");
end

finish_item(req);
end
endtask: body

endclass: my_sequence
Листинг 6.3 – my_sequence.shv

class my_driver extends uvm_driver #(my_transaction);

`uvm_component_utils(my_driver)

virtual dut_if dut_vif;

function new(string name, uvm_component parent);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


// Получает ссылку на интерфейс из базы конфигурации
if(!uvm_config_db#(virtual dut_if)::get(this, "", "dut_vif", dut_vif)) begin
`uvm_error("", "uvm_config_db::get failed")
end
endfunction

task run_phase(uvm_phase phase);


// Формирование сигнала сброса reset
dut_vif.reset = 1;
@(posedge dut_vif.clock);
#1;
dut_vif.reset = 0;

// Формирование входных наборов из транзакции


forever begin
seq_item_port.get_next_item(req);

// Подключение сигналов к DUT


dut_vif.op = req.op;
dut_vif.pac_len = req.pac_len;
dut_vif.src = req.src;
dut_vif.dst = req.dst;

@(posedge dut_vif.clock);

seq_item_port.item_done();
end
endtask

endclass: my_driver
Листинг 6.4 – my_driver.svh

// Code your design here


// SystemVerilog интерфейс для подключения проекта к UVM testbench.
interface dut_if;
logic clock, reset;
logic [2:0] op;
logic [31:0] pac_len;
logic [31:0] src;
logic [31:0] dst;

endinterface

`include "uvm_macros.svh"

// Тестируемый модуль.
//
// Единственная функция, которую он реализует, - это вывод сообщения
// по переднему фронту clock
module dut(dut_if dif);
import uvm_pkg::*;
always @(posedge dif.clock)
if (dif.reset != 1) begin
`uvm_info("DUT", $sformatf("Received op=0x%b, pac_len=0x%b, src=0x%b,
dst=0x%b", dif.op, dif.pac_len, dif.src, dif.dst), UVM_MEDIUM)
end
endmodule
Листинг 6.5 – design.sv
Рисунок 6.1–Моделювання Verilog-моделі

Вывод : При выполнение лабораторной работы было изучени методи


построения среды верификации на основе библиотеки UVM для SystemVerilog