Ну для начала нужно определиться что нужно подавать на входы блока АЛУ для того, чтобы проверить полностью функциональность модуля и какой ожидаем результат на выходе. Я бы выписал по пунктам операции, которые нужно проверить и для каждой подумать какие возможны случаи исхода этой операции. Например, первым делом хотим протестировать операцию сложения 2 чисел со знаком, нужно проверить случаи когда оба операнда положительные, когда тот или другой отрицательны и когда оба операнда отрицательны + нужно смоделировать ситуацию с переполнением и убедиться что флаг переполнения устанавливается, и так для каждой операции. Собственно эти шаги и реализовываете на verilog, подаете на вход известные воздействия и сравниваете выходной отклик с ожидаемым. Необходимо создать так называемый тестбенч - модуль для тестирования того или иного функционального блока, там делаете инстанс модуля АЛУ и задаете на него воздействия. Как-то так:
Код
`timescale 1ns/100ps // Задаем величину временного шага и его точность
module tb_alu;
reg [7:0] in1; // Объявляем необходимые сигналы
reg [7:0] in2;
reg [1:0] op;
wire [7:0] out;
wire ovl;
reg clk;
initial begin // Блок initial исполняется единожды
// sum
clk = 0;
in1 = 8'h0A; // Задаем операнды на входе
in2 = 8'hF9;
op = 2'b00; // Задаем код операции
#10 // Ждемс необходимое время, когда на выходе должны появиться данные (пусть будет 10 нс)
if ((out == 8'h03) && (ovl == 1'b1)) begin // Сравниваем выходные сигналы с ожидаемыми значениями
$display("Test ok"); // И выводим на экран результат выполнения тестов
end
else begin
$display("Test fail");
end
... // Тестируем дальше что нужно
$finish;
end
always
#0.5 clk = ~clk; // Генерируем тактовый сигнал с периодом 1 нс
alu i0(.clk(clk), .in1(in1), .in2(in2), .op(op), .ovl(ovl), .out(out));
endmodule
Ну и стандарт верилога в помощь + море книг в инете по верилогу, удачи )
Сообщение отредактировал pav2051 - Oct 1 2015, 18:01