Изучение различных методов тестирования формы сигнала половинного сумматора в Verilog

В этой статье блога мы углубимся в мир тестирования цифровых схем и сосредоточимся конкретно на испытательном стенде полусумматора с использованием Verilog. Мы рассмотрим несколько методов и предоставим примеры кода для каждого. Итак, начнём!

Метод 1: базовый испытательный стенд

module half_adder_tb;
  reg a, b;
  wire sum, carry;

  // Instantiate the module under test
  half_adder uut(a, b, sum, carry);

  initial begin
    // Test case 1
    #10 a = 0; b = 0;
    #10 $display("Test Case 1: a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);

    // Test case 2
    #10 a = 0; b = 1;
    #10 $display("Test Case 2: a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);

    // Test case 3
    #10 a = 1; b = 0;
    #10 $display("Test Case 3: a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);

    // Test case 4
    #10 a = 1; b = 1;
    #10 $display("Test Case 4: a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);

    // End simulation
    #10 $finish;
  end
endmodule

В этом методе используется базовый испытательный стенд, который создает экземпляр модуля полусумматора и применяет различные входные комбинации. Выходные значения отображаются с помощью операторов $display.

Метод 2: параметризованный испытательный стенд

module half_adder_tb;
  reg a, b;
  wire sum, carry;

  // Instantiate the module under test
  half_adder uut(a, b, sum, carry);

  initial begin
    integer i;

    // Generate test cases using loops
    for (i = 0; i < 4; i = i + 1) begin
      a = i[1];
      b = i[0];
      #10 $display("Test Case %0d: a = %b, b = %b, sum = %b, carry = %b", i, a, b, sum, carry);
    end

    // End simulation
    #10 $finish;
  end
endmodule

В этом подходе используется параметризованный тестовый стенд, который динамически генерирует тестовые примеры с помощью циклов. Это обеспечивает гибкость в увеличении количества тестовых примеров без дублирования кода.

Метод 3. Тестовый стенд с файловым вводом-выводом

module half_adder_tb;
  reg a, b;
  wire sum, carry;

  // Instantiate the module under test
  half_adder uut(a, b, sum, carry);

  initial begin
    integer i;
    reg [1:0] test_cases [0:3];
    reg [3:0] file_data;
    file file_input;

    // Open test input file
    file_input = $fopen("test_cases.txt", "r");

    // Read test cases from file
    for (i = 0; i < 4; i = i + 1) begin
      $fscanf(file_input, "%b", file_data);
      test_cases[i] = file_data;
    end

    // Close file
    $fclose(file_input);

    // Apply test cases
    for (i = 0; i < 4; i = i + 1) begin
      a = test_cases[i][1];
      b = test_cases[i][0];
      #10 $display("Test Case %0d: a = %b, b = %b, sum = %b, carry = %b", i, a, b, sum, carry);
    end

    // End simulation
    #10 $finish;
  end
endmodule

Этот метод демонстрирует тестовый стенд, который считывает тестовые примеры из файла (test_cases.txt) с помощью операций ввода-вывода файла Verilog. Этот подход полезен при работе с большим количеством тестовых примеров или когда тестовые примеры необходимо создавать или изменять извне.