Объявление 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.