Визуальная электроника

 Тесты

Хорошо, у нас есть код, написанный согласно проектному документу, что теперь?

Нам необходимо проверить, работает ли код согласно спецификациям. Большую часть времени мы проводим аналогичные действия в цифровых лабораторных работах в университетах: ввести входные параметры, сравнить выходные параметры с ожидаемыми значениями. Посмотрим на испытательный тест модуля "арбитр".

Verilog Code:
  1. module arbiter (
  2. clock,
  3. reset,
  4. req_0,
  5. req_1,
  6. gnt_0,
  7. gnt_1
  8. );
  9.  
  10. input clock, reset, req_0, req_1;
  11. output gnt_0, gnt_1;
  12.  
  13. reg gnt_0, gnt_1;
  14.  
  15. always @ (posedge clock or posedge reset)
  16. if (reset) begin
  17. gnt_0 <= 0;
  18. gnt_1 <= 0;
  19. end else if (req_0) begin
  20. gnt_0 <= 1;
  21. gnt_1 <= 0;
  22. end else if (req_1) begin
  23. gnt_0 <= 0;
  24. gnt_1 <= 1;
  25. end
  26.  
  27. endmodule
  28. // Здесь начинает работать код испытательного теста
  29. module arbiter_tb;
  30.  
  31. reg clock, reset, req0,req1;
  32. wire gnt0,gnt1;
  33.  
  34. initial begin
  35. $monitor ("req0=%b,req1=%b,gnt0=%b,gnt1=%b", req0,req1,gnt0,gnt1);
  36. clock = 0;
  37. reset = 0;
  38. req0 = 0;
  39. req1 = 0;
  40. #5 reset = 1;
  41. #15 reset = 0;
  42. #10 req0 = 1;
  43. #10 req0 = 0;
  44. #10 req1 = 1;
  45. #10 req1 = 0;
  46. #10 {req0,req1} = 2'b11;
  47. #10 {req0,req1} = 2'b00;
  48. #10 $finish;
  49. end
  50.  
  51. always begin
  52. #5 clock = ! clock;
  53. end
  54.  
  55. arbiter U0 (
  56. .clock (clock),
  57. .reset (reset),
  58. .req_0 (req0),
  59. .req_1 (req1),
  60. .gnt_0 (gnt0),
  61. .gnt_1 (gnt1)
  62. );
  63.  
  64. endmodule

Выглядит так, как будто мы записали все входные параметры для разрешения конфликтов как reg, а выходные параметры как wire; это так и есть. Мы делаем это, поскольку испытательный стенд нуждается в выводе входных параметров и слежении за выходными параметрами.

После того, как мы записали все требуемые переменные, мы инициируем перевод всех входных параметров в штатное состояние: мы делаем это в блоке “initial”. После инициализации мы утверждаем / снимаем утверждение со сброса, req0, req1 в той последовательности, в которой мы хотим протестировать решение конфликтов. Счетчик генерируется вместе блоком “always”.

После завершения испытания нам требуется остановить симулятор. Для этого мы используем $finish. $monitor используется для слежения за изменениями в списке сигналов и вывода их в удобном для нас формате.

req0=0,req1=0,gnt0=x,gnt1=x

req0=0,req1=0,gnt0=0,gnt1=0

req0=1,req1=0,gnt0=0,gnt1=0

req0=1,req1=0,gnt0=1,gnt1=0

req0=0,req1=0,gnt0=1,gnt1=0

req0=0,req1=1,gnt0=1,gnt1=0

req0=0,req1=1,gnt0=0,gnt1=1

req0=0,req1=0,gnt0=0,gnt1=1

req0=1,req1=1,gnt0=0,gnt1=1

req0=1,req1=1,gnt0=1,gnt1=0

req0=0,req1=0,gnt0=1,gnt1=0

Для генерации приведенных выше параметров я использовал симулятор Icarus Verilog.