6. Объявление SystemVerilog утверждений
Объявление SystemVerilog утверждений
SystemVerilog утверждения могут быть объявлены напрямую в модуле, program-блоке или интерфейсе. Многие разработчики не любят включать отладочный код в исходное RTL-описание. Для предотвращения такой ситуации, в SystemVerilog поддерживается привязка одного модуля (program-блока или интерфейса) к другому с помощью команды bind. Рассмотрим RTL-описание устройства 2, изображенного на рис. 1:
module device2 (
input wire clk,
input wire rst,
input wire [1:0] CMD,
input wire [15:0] ADDR,
...
output wire [31:0] RDATA
);
//Описание модуля device2
endmodule
Последовательности, свойства и утверждения для модуля device2 описаны в отдельном модуле Checker:
module Checker (
input wire clk,
input wire rst,
input wire [1:0] CMD,
input wire [15:0] ADDR,
...
input wire [31:0] RDATA
);
//Последовательности, свойства, утверждения для модуля device2
endmodule
В главном testbench’e tb_top, используя команду bind, к модулю device2 можно привязать модуль Checker, при этом исходный текст модуля device2 не модифицируется, а при загрузке программы симуляции вы увидите, что модуль Checker объявлен внутри модуля device2:
module tb_top();
//---------------------------------------------------
// Генерация тактового сигнала
//---------------------------------------------------
bit clock;
initial
forever #10 clock = ~clock;
//---------------------------------------------------
// Интерфейсы
//---------------------------------------------------
input_interface input_intf(clock);
output_interface output_intf(clock);
//---------------------------------------------------
// Объявление program-блока
//---------------------------------------------------
testcase TC (input_intf, output_intf);
//---------------------------------------------------
// Объявление модуля device2 (DUT)
//---------------------------------------------------
device2 slave (
.clk(clock),
.rst(input_intf.reset),
.CMD(input_intf.command),
.ADDR(input_intf.address),
...
.RDATA(output_intf.read_data)
);
//--------------------------------------------------------------------
// Привязка модуля Checker к модулю device2 с помощью команды bind
//--------------------------------------------------------------------
bind device2 Checker device2_checker_inst (
.clk(clk),
.rst(rst),
.CMD(CMD),
.ADDR(ADDR),
...
.RDATA(RDATA)
);
endmodule : tb_top
Обратите внимание, в модуле tb_top не объявлены сигналы clk, rst, CMD, ADDR и т.д., которые передаются в модуль Checker. Это все сигналы модуля device2. Таким образом, команда bind заменяет объявление одного модуля внутри другого:
module device2 (
input wire clk,
input wire rst,
input wire [1:0] CMD,
input wire [15:0] ADDR,
...
output wire [31:0] RDATA
);
//Описание модуля device2
Checker device2_checker_inst (
.clk(clk),
.rst(rst),
.CMD(CMD),
.ADDR(ADDR),
...
.RDATA(RDATA)
);
endmodule
Более подробное описание использования команды bind вы можете найти в Clifford E. SystemVerilog Assertions. Design Tricks and SVA bind files. Sunburst Design, inc., 2009.

Комментарии (0)