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

Языки описания

аппаратуры
Факультатив № 2
Поток проектирования ASIC и FPGA

2
https://slideplayer.com/slide/5689027/18/images/16/Design+Flow+Comparison.jpg
Языки описания аппаратуры
• VHDL
• Verilog
• SystemVerilog

• SystemC

3
Языки описания аппаратуры и языки
программирования
В чём разница?
• ЯП - описание последовательности действий по обработке поступающих в
устройство данных
• последовательность
• ЯОА - описание связей в устройстве
• параллельность
• синтезируемость

M6
M4 M7
Что общего?
M3 M8
• иерархичность M5
• классы, проекты M1
• библиотеки
• объединение языков
M2
top
4
Синтезируемость

несинтезируемое
множество

синтезируемое
множество

5
Описания
• Структурное
• Поведенческое (Register transfer level, RTL)

6
VHDL
Структура описания компонента в
VHDL
library ieee;
use ieee.std_logic_1164.all;

entity full_adder is
port (
a : in std_logic; entity
b : in std_logic;
c : in std_logic;
s : out std_logic;
c_out : out std_logic
);
end entity;

architecture arch of full_adder is


begin
s <= a xor b xor c;
c_out <= (a and b) or (c and (a or b));
end architecture; arch
8
Структурное описание
library ieee; signal carryv : std_logic_vector(4 downto 0) ;
use ieee.std_logic_1164.all;
begin
entity full_adder4 is carryv(0) <= C;
port (
A : in std_logic_vector (3 downto 0); Adder : for k in 3 downto 0 generate
B : in std_logic_vector (3 downto 0); FA : full_adder port map(
C : in std_logic; a => A(k),
S : out std_logic_vector (3 downto 0); b => B(k),
C_out : out std_logic c => carryv(k),
); c_out => carryv(k + 1),
end entity; s => S(k)
);
architecture arch of full_adder4 is end generate;
component full_adder is
port ( C_out <= carryv(4);
a : in std_logic;
b : in std_logic; end arch ;
c : in std_logic;
s : out std_logic;
c_out : out std_logic
) ;
end component;
9
Поведенческое описание
library ieee;
use ieee.std_logic_1164.all;

entity full_adder4 is
port (
A : in std_logic_vector (3 downto 0);
B : in std_logic_vector (3 downto 0);
C : in std_logic;
S : out std_logic_vector (3 downto 0);
C_out : out std_logic
);
end entity;

architecture beh of full_adder4 is

signal result : std_logic_vector(4 downto 0);


begin
result <= ('0'&A) + ('0'&B) + ("0000"&C);
C_out <= result(4);
S <= result(3 downto 0);
end beh;

10
Процедурный блок process
library IEEE;
use ieee.std_logic_1164.all;
i_data 32 32 o_data
entity REGI32 is REGI32
port(
i_clk, i_reset : in std_logic;
i_data: in std_logic_vector(31 downto 0);
o_data : out std_logic_vector(31 downto 0));
end entity;
i_clk
architecture BEH of REGI32 is
begin i_reset
process(i_clk, i_reset)
begin
if (i_reset = ‘1’) then
o_data <= x“0”;
elsif rising_edge(i_clk) then
o_data <= i_data;
end if;
end process;
end architecture;
11
Последовательные операторы
• Оператор условия if... elsif... else
• Оператор выбора case

Должны быть внутри блока process

12
Мультиплексор
A
B
Y
С
architecture mux_if of mux_41 is architecture mux_case of mux_41 is В
begin begin
P1: process (SEL, A, B, C, D) PR_MUX: process (SEL, A, B, C, D)
begin begin
if (SEL = «00») then case SEL is 2
Y <= A; when «00» => Y <= A; SEL
elsif (SEL = «01») then when «01» => Y <= B;
Y <= B; when «10» => Y <= C;
elsif (SEL = «10») then when «11» => Y <= D;
Y <= C; when others => Y <= ’X’;
else end case;
Y <= D; end process PR_MUX;
end if; end mux_if
end process P1;
end mux_if

13
i_data 32 32 o_data

Параметризация
REGI32

library IEEE; i_clk


use ieee.std_logic_1164.all;

entity REGI is i_reset


generic(
WIDTH : integer := 32);
port(
i_clk, i_reset : in std_logic;
i_data: in std_logic_vector(WIDTH-1 downto 0);
o_data : out std_logic_vector(WIDTH-1 downto 0)); i_data 64 64 o_data
end entity; REGI32
architecture BEH of REGI is
begin
process(i_clk, i_reset)
begin
if (i_reset = ‘1’) then i_clk
o_data <= x“0”;
elsif rising_edge(i_clk) then
o_data <= i_data; i_reset
end if;
end process; 14
end architecture;
Сигнал и переменная
• signal - физическое воплощение проводника
signal A : std_logic;
A <= B xor D;

• variable - переменная (внутри процесса)


variable G : integer;
G := ‘5’;

15
Сигналы
Передаются и обрабатываются параллельно
BLOCK1 : process (x1, x2, x3) x1
begin x2 BLOCK1 z1
x3
--операторы процесса BLOCK1
end process BLOCK1; y
BLOCK3
BLOCK2 : process (x2, x4)
begin
--операторы процесса BLOCK2 BLOCK2
x4 z2
end process BLOCK2;

BLOCK3 : process (z1, z2)


begin
--операторы процесса BLOCK3
end process BLOCK3;
16
Декларация компонента
architecture arch of full_adder4 is
component full_adder is
port (
a : in std_logic;
b : in std_logic;
c : in std_logic;
s : out std_logic;
c_out : out std_logic
) ;
end component;
signal carryv : std_logic_vector(4 downto 0) ;

begin

component имя_компонента is
generic (список параметров);
port (список портов);
end component; 17
Использование
1 entity top_level is
2 port map (
3 clock : in std_logic;

компонента
4 reset : in std_logic;
5 count_8 : out std_logic_vector(7 downto 0);
6 count_12 : out std_logic_vector(11 downto 0)
7 );
8 end entity top_level;
9
10 architecture struct of top_level is
11
12 begin
13 count_8bit : entity work.counter_example(cnt)
14 port map(
15 clock => clock;
16 reset => reset;
17 count => count_8
18 );
19
20 count_12bit : entity work.counter_example(cnt)
21 generic map (
22 count_width => 12
23 )
24 port map(
25 clock => clock;
26 reset => reset;
27 count => count_12
28 );
29
30 end architecture struct; 18
Библиотеки
library IEEE;
use ieee.std_logic_1164.all;

library STD, WORK;


use std.standart.all; --ссылка на библиотеку std, содержащую пакет standart
use work.fxd.all; --ссылка на библиотеку work, содержащую пакет fxd

Рабочая библиотека WORK одна.


В библиотеках ресурсов размещаются блоки, на которые ссылаются анализируемые блоки.

19
Пакеты
Package - блок, включающий различные декларации:
• типов;
• подтипов;
• констант;
• компонент;
• процедур;
• функций.

20
https://www.nandland.com
Функции и процедуры
Небольшие участки кода, которые используются при
повторяющихся действиях. Для очистки описания.

• function – есть только входные данные, возвращается


одно значение как результат выполнения

• procedure – есть входные и выходные данные,


возвращается несколько значений

21
Функция

22
https://www.nandland.com
Процедура

23
https://www.nandland.com
Типы данных
• скалярные;

• композитные;

• указатели;

• файлы.

24
Скалярные типы данных
• bit — ‘0’ и ‘1’
• boolean — true / false (A > B)
• std_logic:
• ‘0’ — логический ноль
• ‘1’ — логическая единица
• ‘U’ — не инициализировано
• ‘X’ — неизвестное значение
• ‘Z’ — третье состояние
• ‘W’ — «слабое» неизвестное значение (с повышенным сопротивлением)
• ‘L’ — «слабый» логический ноль (с повышенным сопротивлением)
• ‘H’ — «слабая» логическая единица (с повышенным сопротивлением)
• ‘—’ — произвольное значение (не важно, какое)

25
Скалярные типы данных
• integer --целое число знаковое
• signal a : integer range 0 to 7;

• real --вещественное число с плавающей точкой


(несинтезируемо)
• signalx : real := 123.45;

26
Перечисляемые типы данных
type MY_TYPE is (RUN, STOP, PAUSE);
signal STATE : MY_TYPE;
...

STATE <= RUN;

27
Композитные типы данных
• bit_vector(3 downto 0)
signal a : bit_vector(3 downto 0);
a <= «0011»; --bit: ‘ ‘
• std_logic_vector(0 to 3)
signal b : std_logic_vector(0 to 3);
b <= «001Z»; --std_logic: ‘ ‘
• type tmem is array (0 to 255) of std_logic_vector (7 downto 0);
• signal mem : tmem;
0 7 6 5 4 3 2 1 0
1 7 6 5 4 3 2 1 0

...

255 7 6 5 4 3 2 1 0 28
Композитные типы данных
• record — группы сигналов различного типа

type TCoord is record


X, Y : integer range 0 to 1023;
Visible : std_logic;
end record;

signal Point1, Point2 : TCoord;

Point1.X <= 123;


Point2.Visible <= ‘1’;
Point2 <= Point1;

29
Преобразование типов
В VHDL нельзя, например, сравнить «0011» < «1000» –
отдельные двоичные сигналы, сгрупированные в
композитный тип
use ieee.std_logic_arith.all; use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all; use ieee.std_logic_unsigned.all;

signalx_slv : std_logic_vector (7 downto 0); signalx_slv : std_logic_vector (7 downto 0);


signalx_int : integer range 0 to 255; signalx_int : integer range 0 to 255;

x_int <= conv_integer(x_slv); x_int <= to_integer(unsigned(x_slv));


x_slv <= conv_std_logic_vector(x_int, 8);

30
Конкатенация
signal a16 : std_logic_vector(15 downto 0);
signal a8 : std_logic_vector(7 downto 0);

a8 <= a16(7 downto 0);

a16(7 downto 0) <= a8;


a16(15 downto 8) <= a8;

a16 <= “00000000” & a8; --конкатенация 8 нулей слева и 8-разрядное a8

a16 <= ext(a8, 16); --расширить до 16 бит


a16 <= sxt(a8, 16); --расширить до 16 бит с учётом знака

31
Verilog
Факультатив № 3
Структура описания компонента в
Verilog
module full_adder (a, b, c, s, c_out); module full_adder (a, b, c, s, c_out);
input a; input a, b, c;
input b; output s, c_out;
input c;
output s; assign s = a ^ b ^ c;
output c_out; assign c_out = (a & b) | (c & (a ^ b));

assign s = a ^ b ^ c; endmodule
assign c_out = (a & b) | (c & (a ^ b)); module

endmodule

33
Cтруктурное описание
`include «full_adder.v»

module full_adder4 (A, B, C, PI, S, PO);

input PI;
input [3:0] A, B;
output [3:0] S;
output PO;

wire [4:0] w;

assign w[0] = PI;

SM Add3( .A( A[3] ), .B( B[3] ), .Cin( w[3] ), .S( S[3] ), .Cout( w[4] ) );
SM Add2( .A( A[2] ), .B( B[2] ), .Cin( w[2] ), .S( S[2] ), .Cout( w[3] ) );
SM Add1( .A( A[1] ), .B( B[1] ), .Cin( w[1] ), .S( S[1] ), .Cout( w[2] ) );
SM Add0( .A( A[0] ), .B( B[0] ), .Cin( w[0] ), .S( S[0] ), .Cout( w[1] ) );

assign PO = w[4];

endmodule

34
Cтруктурное описание
`include «SM.v»

module full_adder4 (A, B, C, PI, S, PO);

input PI;
input [3:0] A, B;
output [3:0] S;
output PO;

wire [4:0] w;

assign w[0] = PI;

genvar i; //переменная, по которой будет происходить генерация


generate //блок генерации
for ( i = 0 ; i < 4 ; i = i + 1 ) //цикл генерации
begin : add_stage //генерируемое имя в виде add_stage[i].Add_bit
SM Add_bit( .A( A[i] ), .B( B[i] ), .Cin( w[i] ), .S( S[i] ), .Cout( w[i+1] ) );
end
endgenerate

assign PO = w[4];

endmodule 35
Поведенческое описание

module full_adder4 (A, B, C, PI, S, PO);

input PI;
input [3:0] A, B;
output [3:0] S;
output PO;

assign {PO, S} = A + B + PI;

endmodule

36
Процедурный блок always@
module REGI32( i_data, i_clk, i_reset, o_data );

i_data 32 32 o_data
input wire [31:0] i_data;
input wire i_clk; REGI32
input wire i_reset;
output reg [31:0] o_data;

always @( posedge i_clk or posedge i_reset )


begin
if ( i_reset ) begin i_clk
o_data <= 0;
end else begin i_reset
o_data <= i_data;
end
end

endmodule

37
Типы сигналов
• wire - проводник, используемый для соединения
элементов
• reg - сигнал, который сохраняет своё значение до
следующего изменения (без assign)
• не всегда имеет отношение к регистру
• является выходным в блоке always@

38
Операторы назначений
• непрерывное назначение assign выполняется параллельно (тип wire)
• в простой комбинационной логике
• assign s = a ^ b ^ c; //явное назначение
• wire c_out = (a & b) | (c & (a | b)); //неявное назначение

• процедурные назначения (в блоках always или initial, тип reg)


• блокирующее назначение = операции выполняются последовательно
• a = 1; b = 20; c = 3; d = 4;
• b = a; //b = a = 1
• c = b; //c = a = 1
• d = c; //d = a = 1
• в сложной комбинационной логике
• неблокирующее назначение <= операции выполняются параллельно
• a = 1; b = 20; c = 3; d = 4;
• b <= a; //b = a = 1
• c <= b; //c = b = 20
• d <= c; //d = c = 3
• в последовательностной логике
39
Форматы данных
[разрядность]’<базис_представления><значение_в_базисе>
• 1’b1;
• 4’b0010 == 4’d10 == 4’o02 == 4’h2
• 8’b11010111 == 8’d215 ==
== 8’b11_010_111 == 8’o327 ==
== 8’b1101_0111 == 8’hB7
• ‘h6 == 32’b0000_0000_..._0000_0110
• 8’b1 != 8’b11111111 -> {8{1’b1}}
• 8’b1 == 8’b00000001
• 8’b01010101 == {4{2’b01}}

40
Последовательные операторы
• Оператор условия if... else if... else
• Оператор выбора case

Должны быть внутри блока always@

41
Мультиплексор a
4
y

module mux41_if (a, sel, y); module mux41_case (a, sel, y);

input [3:0] a; input [3:0] a;


input [1:0] sel; input [1:0] sel;
output reg y; output reg y; 2
sel
always@ ( a or sel ) always@* //process( all ) в VHDL
if ( sel == 2’d0 ) case ( sel )
y = a[0]; 2’b00 : y = a[0];
else if ( sel == 2’d1 ) 2’b01 : y = a[1];
y = a[1]; 2’b10 : y = a[2];
else if ( sel == 2’d2 ) 2’b11 : y = a[3]; module mux41_assign (a, sel, y);
y = a[2]; default : y = 1’bx;
else endcase input [3:0] a;
y = a[3]; input [1:0] sel;
endmodule output y;
endmodule
assign y = a[sel];

endmodule

42
Параметризация i_data 32
REGI32
32 o_data

module REGI32 #(parameter WIDTH = 32)


(i_data, i_clk, i_reset, o_data);

input i_clk, i_reset;


input [WIDTH-1:0] i_data;
output reg [WIDTH-1:0] o_data; i_clk

always @ ( posedge i_clk or negedge i_reset) i_reset


if ( !i_reset )
o_data <= 0;
else
o_data <= i_data;

endmodule
i_data 64 64 o_data
REGI32
REGI32 REG1 ( .i_data ( datain32 ),
.i_clk ( clk ),
.i_reset( rstn ),
.o_data ( dataout32 ) );

REGI32 #( .WIDTH ( 64 ) ) REG2 ( .i_data ( datain64 ), i_clk


.i_clk ( clk ),
.i_reset( rstn ), i_reset
.o_data ( dataout64 )
);
43
Локальные параметры a
4
y

module mux #(parameter WIDTH = 4)


(a, sel, y);

localparam ADDR_SIZE = $clog2(WIDTH);


2
sel
input [WIDTH-1:0] a;
input [ADDR_SIZE-1:0] sel;
output reg y;

always @( a, sel ) 5
a
if ( sel <= WIDTH ) y
y = a[sel];
else
y = 1’bx;

endmodule
3
sel
mux #(.WIDTH(5)) mux5 (.a(a), .sel(sel), .y(y)); 44
Операторы
• Конкатенация {a, b}, репликация {M{a}}
• Назначения y = a, s <= g;
• Арифметические +, -, *
• Логические &&, ||, !; //для однобитных данных в конструкциях if...else
• a = 1’b1; b = 1’b0; y = a && b = 0 (false)
• a = 1’b1; b = 1’b0; y = a || b = 1 (true)
• a = 1’b1; y = !a = 0 (false)
• Сокращения &, ~&, |, ~|, ^, ~^ //превращение вектора в скаляр
• a = 4’b1101; y = &a = 1’b0; g = |a = 1’b1; h = ^a = 1’b1; nh = ~^a = 1’b0;
• Побитовые &, ~&, |, ~|, ^, ~^, ~ //над векторами
• a = 4’b1101; b = 4’b1001; y = a & b = 4’b1001; g = a | b = 4’b1101; h = a^b = 4’b0100;
yn = ~a = 4’b0010
• Сдвига <<, >>, <<<, >>>; //логический и арифметический
• Влево a = 4’b1011; y = a << 1 = 4’b0110; g = a <<< 1 = 4’b1110
• Вправо a = 4’b1011; y = a >> 1 = 4’b0101; g = a >>> 1 = 4’b1001

45
Тернарный оператор
module mux21_if (a, sel, y); module mux21_t (a, sel, y);

input [1:0] a; input [1:0] a;


input sel; input sel;
output reg y; output y;

always@ ( a or sel ) assign y = (sel) ? (a[1]) : (a[0]);


if ( sel == 1’b0 )
y = a[0]; endmodule
else
y = a[1]; module comb (a, b, y);

endmodule input [3:0] a, b;


input sel;
output [3:0] y;

assign y = (sel) ? (a + b) : (a - b);

endmodule
46
Задачи и функции
Небольшие участки кода, которые используются при
повторяющихся действиях. Для очистки описания.

• task – подобны подпрограммам

• function – подобны функциям


• статические — выделение памяти однократно (сложность при
параллельном вызове одной и той же задачи или функции)
• автоматические — выделение памяти при каждом вызове
(позволяет параллельный вызов одной и той же задачи или функции)

47
Задачи

48
Задачи

49
Функции

50
Встроенные функции
• $readmemb, $readmemh
• $display, $monitor, $strobe
• $finish, $stop
• $fopen, $fclose
• ...

51
Директивы препроцессора
• `include <«имя_файла»>
• `include «full_adder.v»
• `include «constant.vh»
• `timescale <единица_времени> / <временное_разрешение>
• `timescale 1ns / 1ps
• `define WIDTH 8 //параметр для глобальных констант
• `define AND_OR //для использования в условной компиляции
• `ifdef ... `elsif ... `endif

52
`ifdef ... `elsif ... `endif
i_data 32 32 o_data
REGI32

i_clk

i_reset

Разные модули?

i_data 32 32 o_data
REGI32

i_clk

53
https://www.chipverify.com/verilog/verilog-ifdef-conditional-compilation
casex и casez
module mask_encoder (DATA, DOUT, EN); module data_encoder (DATA, DOUT, EN);

input [7:0] DATA; input [7:0] DATA;

input EN; input EN;

output reg [7:0] DOUT; output reg [7:0] DOUT;

always @* always @*

if ( EN == 1 ) if ( EN == 1 )

casex ( DATA ) casez ( DATA )

8’b1100_xx00 : DATA = 8’b0000_0001; 8’b1???_???? : DATA = 8’b0000_0001;

8’b0110_0xx0 : DATA = 8’b0000_0010; 8’b01??_???? : DATA = 8’b0000_0010;

8’b0011_00xx : DATA = 8’b0000_0100; 8’b001?_???? : DATA = 8’b0000_0100;

8’b1001_x00x : DATA = 8’b0000_1000; 8’b0001_???? : DATA = 8’b0000_1000;

8’b1010_x0x0 : DATA = 8’b0001_0000; 8’b1000_1??? : DATA = 8’b0001_0000;

8’b0101_0x0x : DATA = 8’b0010_0000; 8’b0000_01?? : DATA = 8’b0010_0000;

8’b1111_xxxx : DATA = 8’b0100_0000; 8’b0000_001? : DATA = 8’b0100_0000;

8’b0000_0000 : DATA = 8’b1000_0000; 8’b0000_0001 : DATA = 8’b1000_0000;

default : DATA = 8’b0000_0000; default : DATA = 8’b0000_0000;

endcase endcase

else else

DOUT = 8’b0000_0000; DOUT = 8’b0000_0000;


54
endmodule endmodule
SystemVerilog
Факультатив № 4

55
Verilog и SystemVerilog
• IEEE 1364-1995 (Verilog-95)
• IEEE 1364-2001 (Verilog-2001)
• IEEE 1364-2005 (Verilog-2005)
• SystemVerilog — надстройка над Verilog-2005

56
bit, byte, logic, tri
• bit — «0» и «1»
• byte — bit[7:0]
• logic — «0», «1», «X», «Z»
• tri — для третьего состояния
tri t_data;
assign t_data = ( drive ) ? y : 1’bz;

57
Типы данных
Verilog SystemVerilog
wire w_data; logic w_data;
assign w_data = y; assign w_data = y;

reg r_data; logic r_data;


always @* always_comb
r_data = y; r_data = y;

58
always@
Verilog SystemVerilog
always @ (*) always_comb
always_latch
always @ (posedge clk) always_ff @ ( posedge clk )

59
always_comb и always_latch
always_comb always_latch
if ( a > b ) if ( a > b )
c = a - b; c = a - b;
else
c = b - a;

60
Структуры struct
Массив — объединение одного типа данных
int array [10]; // 10 элементов массива array типа int (32-битные)
bit [7:0] mem [256]; // 256 8-битных элемента массива mem

Структура — объединение нескольких типов данных в один

struct { // structure definition typedef struct { // structure definition


logic [31:0] a, b; logic [31:0] a, b;
logic [ 7:0] opcode; logic [ 7:0] opcode;
logic [23:0] address; logic [23:0] address;
} Instruction_Word; } instruction_word_t;

instruction_word_t IW; // structure


allocation

61
https://habr.com/ru/post/221265/
Распакованные и упакованные
массивы
unpacked packed
может быть непрерывным вектором, а может и не можно выделять вектор на подвектора
быть им

62
Упакованная структура
struct packed {
logic valid;
logic [ 7:0] tag;
logic [31:0] data;
} data_word;

data_word.tag = 8’hf0;
data_word[39:32] = 8’hf0; // делаем тоже самое

63
Объединения union
Объединения — это значение памяти, которое может хранить разные типы данных, но
одновременно только одно.
Интерес представляют упакованные объединения.
typedef struct packed { initial begin
logic [15:0] source_address; logic [15:0] src, dst;
logic [15:0] destination_address; for (i = 0; i <= N; i = i + 1) begin
logic [23:0] data; dreg.bytes[i] <= byte_in; //store
logic [ 7:0] opcode; as bytes
} data_packet_t; end
src = dreg.source_address;
union packed {
dst = dreg.destination_address;
data_packet_t packet; // packed
end
structure
logic [7:0][7:0] bytes; // packed
array
} dreg;
64
Перечисления enum

Verilog SystemVerilog
localparam IDLE = 2’b00, enum {IDLE = 2’b00, START, COUNT, FINISH}
state, nextstate;
START = 2’b01,
COUNT = 2’b10,
FINISH = 2’b11; typedef enum {IDLE = 2’b00,
START = 2’b01,
reg [1:0] state, nextstate; COUNT = 2’b10,
FINISH = 2’b11
} state_t;
state_t state, nextstate;

65
О классовости

66
Объектно-ориентированное
программирование (ООП)
Объект = класс
Объект = свойства + методы

67
Класс человек

Мужчина Женщина

Свойства: пол, имя, возраст, вес, рост, цвет кожи, национальность и прочее
Методы: родиться, ползти, идти, бежать (двигаться со скоростью), работать, кушать и прочее

68
Класс существо

Человек Дракон

Свойства: имя, живое, возраст, вес...


Методы: родиться, двигаться, говорить, слушать...

69
Класс объект

Человек Книга

Свойства: местоположение (координаты), вес...


Методы: коснуться, получить имя, дать информацию о себе...

70
Дерево классов

71
Принципы ООП
• Наследование — наследование свойств и методов
классами для их расширения
• Полиморфизм — различная реализация методов
• Инкапсуляция — для организации иерархической
управляемости

72
Классы class
Объединение сигналов (свойства) и функций и процедур
(методы)
class <class_name>;
// class properties
<data members>

// class methods
function <function_name>;
. . .
endfunction

task <task_name>;
. . .
endtask
endclass

73
Пример класса

74
https://vlsiverify.com/system-verilog/systemverilog-classes
Тестирование модулей
Факультатив № 6

75
Задача тестирования
Верификация разрабатываемого устройства
• Behavioral — поведенческое описание
always begin

if (!clk_en && clk == 1'b1) begin

wait (clk_en);

end

#5 clk = ~clk;

end

• RTL — register transfer level, уровень регистровых передач


always@ ( a or sel )

if ( sel == 1’b0 )

y = a[0];

else
y = a[1];

• GTL — gate transfer level, уровень вентильных передач

76
Модуль тестирования

77
Входные и выходные сигналы

78
Структура тестового стенда
module top();
//описание модуля
endmodule: top

`include «top.v»
module tb_top();
//входные и выходные сигналы
logic Ai, Bi, Ci, Y1o, Y2o, Y3o;
//подключение top-модуля
top UUT(.A(Ai), .B(Bi), .C(Ci), .Y1(Y1o), .Y2(Y2o), .Y3(Y3o));
//описание testbench

endmodule: tb_top

79
Тактирующий импульс
logic clk; `define PERIOD 20
`timescale 1ns/1ns
initial begin
clk = 0; logic clk;
forever #10 clk = ~clk;
end initial begin
clk = 0;
logic clk = 0; forever #(`PERIOD/2) clk = ~clk;
end
always
#(`PERIOD/2) clk = ~clk;

80
Задание сигналов во времени

initial begin
rst = 0;
enable = 1;
#10 rst = 1;
#20 rst = 0;
#10 rst = 1;
repeat (5) #5 rst = ~rst;
repeat (5) @(posedge clk);
enable = 0;
end

81
Функции слежения (выводы
сообщений)
• $display(<текст>, [сигналы])
• выполняется один раз в заданный момент времени
• $display(«Now A = %b», A);
• $strobe(<текст>, <сигналы>)
• выполняется один раз в конце текущей единицы времени
• $strobe(«At time %t A = %b», $time, A);
• $monitor(<текст>, <сигналы>)
• если изменился хоть один параметр
• $monitor(«At time %t A = %b», $time, A);
• Форматы данных
• %d (десятичный)
• %h (шестнадцатиричный)
• %b (двоичный)
• %c (символ)
• %s (строка)
• %t (время)
• %m (иерархический уровень)

82
Выводы сообщений в файл
integer outfile;
outfile = $fopen(<«путь к файлу и имя файла»>, <«режим доступа»>);
• «w» – записать ASCII; «wb» – записать бинарный
• «r» – считать ASCII; «rb» – считать бинарный
• «a» – добавить ASCII; «ab» – добавить бинарный
• «r +» – файл ASCII для чтения и записи
$fdisplay(outfile, «текст», [сигналы]);
$fwrite(outfile, «текст», [сигналы]);
$fmonitor(outfile, «текст», <сигналы>);
$fstrobe(outfile, «текст», <сигналы>);

83
Данные о времени
• $time — в 64-битном формате
• $stime — в 32-битном формате
• $realtime — в real формате

84
Случайные числа
• $random — знаковое случайное число
• a = $random;
b = $random;
• integer seed = 3;
$random(seed) — смена псевдослучайной последовательности
• $random_range(<max>,[min]) — в диапазоне от max до min
(или 0)
• integer b = $random(seed)%20; — в диапазоне от 20 до 0
• $urandom — беззнаковое случайное число

85
Подключение модулей
*.v в *.sv *.vhd в *.sv
`include «top.v» entity Foo is
module tb_top;
port( clk : in std_logic;
top #(...) uut (<порты>);
DI : in std_logic;
//testbench
endmodule
DO : out std_logic);
end Foo;
program tb(<порты>);
//testbench
bit simClk;
endprogram
bit simDI;
module tb_top; bit simDO;
//logic сигналы
top #(...) uut (<порты>);
Foo UUT(.clk(simClk), .DI(simDI), .DO(simDO));
tb tb_uut(<порты>);
endmodule
86
Если есть record в VHDL
VHDL package VHDL entity SV testbench

87
https://www.chipverify.com/systemverilog/systemverilog-interface-intro
Без interface
in std_logic in record out record out std_logic
VHDL entity
entity

entity_wrapper
entity Test_Top_wrap is
port ( i_Clk : in std_logic;
i_Data1 : in std_logic_vector (15 downto 0);
i_DV1 : in std_logic;
...
o_DV2 : out std_logic);
end entity Test_Top_wrap;

architecture wrap of Test_Top_wrap is


component Test_Top is
port( i_Clk : in std_logic;
i_Data : in t_Test;
o_Data : out t_Test);
end component;
begin
U1 : Test_Top port map(
i_Clk => i_Clk;
i_Data.DATA1 => i_Data1;
...
o_Data.DV2 => o_DV2);
end architecture wrap; 88

Вам также может понравиться