Menu
CoddyTech

Testbench là gì

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 73 trên 90.

testbench là một module Verilog đặc biệt dùng để kiểm thử module khác. Nó cung cấp đầu vào cho thiết kế của bạn và kiểm tra xem đầu ra có chính xác không.

Tại sao chúng ta cần testbench?

Khi tạo một module, bạn cần đảm bảo module hoạt động chính xác. Testbench cho phép bạn:

  • Cung cấp các giá trị đầu vào khác nhau cho module
  • Quan sát các đầu ra
  • Kiểm tra xem đầu ra có khớp với điều bạn mong đợi không
  • Tự động thực hiện việc này mà không cần kiểm thử thủ công

Module thiết kế so với testbench

 Module thiết kếTestbench
Mục đíchTriển khai phần cứngKiểm thử module thiết kế
Có cổng không?Có (đầu vào và đầu ra)Không (tự chứa)
Có thể tổng hợp không?CóKhông (chỉ mô phỏng)

Ví dụ testbench đơn giản

module testbench;              // Không có cổng!

  // Đầu vào và đầu ra đến từ module đang được kiểm tra (DUT).
  reg a, b;                    // reg cho đầu vào
  wire c;                      // wire cho đầu ra
  

  // Đây là thao tác khởi tạo module: tạo một bản sao của module and_gate và đặt tên là dut
  and_gate dut (               // Khởi tạo DUT
    .a(a),
    .b(b),
    .c(c)
  );

  // Đây là khối lệnh initial dùng để gán các giá trị kiểm tra cho đầu vào của module đang được kiểm tra.
  initial begin                // Gán các giá trị kiểm tra
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    $finish;
  end
endmodule

Điểm chính

  • Testbench không có cổng
  • Dùng reg cho các tín hiệu thay đổi (đầu vào của DUT)
  • Dùng wire cho các tín hiệu từ DUT (đầu ra)
  • Module đang được kiểm thử có tên là DUT (Design Under Test)
  • $finish kết thúc mô phỏng

Trong các bài học tiếp theo, chúng ta sẽ tìm hiểu cách tạo tín hiệu kích thích, hiển thị kết quả và các tính năng khác của testbench.

challenge icon

Thử thách

Bạn được cung cấp một module cổng AND. Nhiệm vụ của bạn là thêm các phần còn thiếu vào testbench.

Cần làm gì:

Thêm các phần sau vào testbench:

  1. Khai báo reg cho các đầu vào a và b
  2. Khai báo wire cho đầu ra c
  3. Tạo một thể hiện của and_gate với tên dut và kết nối các cổng

Tự làm thử

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  
  // Nhiệm vụ 1: Khai báo reg cho các đầu vào a và b
  
  
  // Nhiệm vụ 2: Khai báo wire cho đầu ra c
  

  // Nhiệm vụ 3: Tạo instance của and_gate với tên dut
  // Kết nối .a(a), .b(b), .c(c)


  initial begin
    a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
    $finish;
  end
endmodule
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online