Объявление SystemVerilog утверждений

Объявление SystemVerilog утверждений

SystemVerilog утверждения могут быть объявлены напрямую в модуле, program-блоке или интерфейсе. Многие разработчики не любят включать отладочный код в исходное RTL-описание. Для предотвращения такой ситуации, в SystemVerilog поддерживается привязка одного модуля (program-блока или интерфейса) к другому с помощью команды bind. Рассмотрим RTL-описание устройства 2, изображенного на рис. 1:

  1. module device2 (
  2. input wire clk,
  3. input wire rst,
  4. input wire [1:0] CMD,
  5. input wire [15:0] ADDR,
  6. ...
  7. output wire [31:0] RDATA
  8. );
  9.  
  10. //Описание модуля device2
  11.  
  12. endmodule

Последовательности, свойства и утверждения для модуля device2 описаны в отдельном модуле Checker:

  1. module Checker (
  2. input wire clk,
  3. input wire rst,
  4. input wire [1:0] CMD,
  5. input wire [15:0] ADDR,
  6. ...
  7. input wire [31:0] RDATA
  8. );
  9.  
  10. //Последовательности, свойства, утверждения для модуля device2
  11.  
  12. endmodule

В главном testbench’e tb_top, используя команду bind, к модулю device2 можно привязать модуль Checker, при этом исходный текст модуля device2 не модифицируется, а при загрузке программы симуляции вы увидите, что модуль Checker объявлен внутри модуля device2:

  1. module tb_top();
  2.  
  3. //---------------------------------------------------
  4. // Генерация тактового сигнала
  5. //---------------------------------------------------
  6. bit clock;
  7.  
  8. initial
  9. forever #10 clock = ~clock;
  10. //---------------------------------------------------
  11. // Интерфейсы
  12. //---------------------------------------------------
  13. input_interface input_intf(clock);
  14. output_interface output_intf(clock);
  15. //---------------------------------------------------
  16. // Объявление program-блока
  17. //---------------------------------------------------
  18. testcase TC (input_intf, output_intf);
  19. //---------------------------------------------------
  20. // Объявление модуля device2 (DUT)
  21. //---------------------------------------------------
  22. device2 slave (
  23. .clk(clock),
  24. .rst(input_intf.reset),
  25. .CMD(input_intf.command),
  26. .ADDR(input_intf.address),
  27. ...
  28. .RDATA(output_intf.read_data)
  29. );
  30. //--------------------------------------------------------------------
  31. // Привязка модуля Checker к модулю device2 с помощью команды bind
  32. //--------------------------------------------------------------------
  33. bind device2 Checker device2_checker_inst (
  34. .clk(clk),
  35. .rst(rst),
  36. .CMD(CMD),
  37. .ADDR(ADDR),
  38. ...
  39. .RDATA(RDATA)
  40. );
  41.  
  42. endmodule : tb_top

Обратите внимание, в модуле tb_top не объявлены сигналы clk, rst, CMD, ADDR и т.д., которые передаются в модуль Checker. Это все сигналы модуля device2. Таким образом, команда bind заменяет объявление одного модуля внутри другого:

  1. module device2 (
  2. input wire clk,
  3. input wire rst,
  4. input wire [1:0] CMD,
  5. input wire [15:0] ADDR,
  6. ...
  7. output wire [31:0] RDATA
  8. );
  9.  
  10. //Описание модуля device2
  11.  
  12. Checker device2_checker_inst (
  13. .clk(clk),
  14. .rst(rst),
  15. .CMD(CMD),
  16. .ADDR(ADDR),
  17. ...
  18. .RDATA(RDATA)
  19. );
  20.  
  21. endmodule

Более подробное описание использования команды bind вы можете найти в Clifford E. SystemVerilog Assertions. Design Tricks and SVA bind files. Sunburst Design, inc., 2009.

Share this post