Тесты
Хорошо, у нас есть код, написанный согласно проектному документу, что теперь?
Нам необходимо проверить, работает ли код согласно спецификациям. Большую часть времени мы проводим аналогичные действия в цифровых лабораторных работах в университетах: ввести входные параметры, сравнить выходные параметры с ожидаемыми значениями. Посмотрим на испытательный тест модуля "арбитр".
Verilog Code:
module arbiter ( clock, reset, req_0, req_1, gnt_0, gnt_1 ); input clock, reset, req_0, req_1; output gnt_0, gnt_1; reg gnt_0, gnt_1; always @ (posedge clock or posedge reset) if (reset) begin gnt_0 <= 0; gnt_1 <= 0; end else if (req_0) begin gnt_0 <= 1; gnt_1 <= 0; end else if (req_1) begin gnt_0 <= 0; gnt_1 <= 1; end endmodule // Здесь начинает работать код испытательного теста module arbiter_tb; reg clock, reset, req0,req1; wire gnt0,gnt1; initial begin $monitor ("req0=%b,req1=%b,gnt0=%b,gnt1=%b", req0,req1,gnt0,gnt1); clock = 0; reset = 0; req0 = 0; req1 = 0; #5 reset = 1; #15 reset = 0; #10 req0 = 1; #10 req0 = 0; #10 req1 = 1; #10 req1 = 0; #10 {req0,req1} = 2'b11; #10 {req0,req1} = 2'b00; #10 $finish; end always begin #5 clock = ! clock; end arbiter U0 ( .clock (clock), .reset (reset), .req_0 (req0), .req_1 (req1), .gnt_0 (gnt0), .gnt_1 (gnt1) ); 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.