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.