
1.Giới thiệu:
Viết testbench để kiểm tra một thiết kế (thiết kế ở đây có thể là một lõi IP hay một hệ thống gồm nhiều lõi IP) cũng phức tạp như viết RTL code. Các thiết kế ASIC càng phức tạp thì công việc kiểm tra (Verification) và mô phỏng (simulation) càng trở nên đầy thách thức. Thông thường (trung bình) 60-70% thời gian để thực hiện một ASIC là dành cho việc kiểm tra, thử nghiệm và đánh giá, đôi khi thời gian này có thể lâu hơn nữa. Nếu người thiết kế làm ra những sáng tạo thì người kiểm tra đảm bảo tính đúng đắn cho các sáng tạo.
Để viết hay tạo ra các testbench thì bạn cần có phân tích chi tiết của “Design Under Test” (viết tắt là DUT), tạm dịch là “Thiết kế mức kiểm tra” và “Test plan”. Trong đó:
- Phân tích chi tiết của DUT: Sẽ mô tả cho người kiểm tra hiểu rõ về chức năng hoạt động của thiết kế sẽ được kiểm tra.
- Test plan (tạm dịch là sơ đồ/kế hoạch kiểm tra) sẽ cung cấp những thông tin về cấu trúc môi trường test, cấu trúc testbench và các kịch bản/trường hợp kiểm tra (test scenarios or test cases) cần phải thực hiện.
2.Các bước đơn giản và cơ bản để kiểm tra một thiết kế
Các bước đơn giản và cơ bản để thực hiện kiểm tra một thiết kế sẽ được trình bày thông qua một ví dụ đơn giản về bộ đếm lên 4 bit sau đây.
a.Mô tả về thiết kế sẽ được kiểm tra (DUT)
Thiết kế cần được kiểm tra là một bộ đếm lên 4 bit có các đặc điểm là:
- Tín hiệu rst_n tích cực mức 0 sẽ reset bất đồng bộ bộ đếm. Giá trị reset của bộ đếm là 0.
- Tín hiệu count_en tích cực mức 1 sẽ cho phép bộ đếm tăng lên 1 tại cạnh lên của xung clock clk.
- RTL code của thiết kế
// Design Name : inc_counter
// Function : 4 bit counter
// Coder : phithiendao
//-----------------------------------------------------
module inc_counter (clk, rst_n, enable, count);
input clk, rst_n, enable;
output reg [3:0] count;
always @ (posedge clk, negedge rst_n) begin
if (rst_n == 1'b0) count <= 4'd0;
else if (enable == 1'b1)
count <= count + 4'd1;
end
endmodule
b.Sơ đồ kiểm tra (Test plan)
Môi trường kiểm tra được thể hiện như trong hình sau
Trong đó, DUTđược khởi tạotrong testbench, vàtestbenchsẽ bao gồmbộ tạo clock, bộ tạo reset, bộ tạo tín hiệu cho phép COUNTER chạy vàmột bộ giám sát giá trị ngõ ra bộ đếm.
c.Các trường hợp kiểm tra (Test case)
Bước này, người kiểm tra cần liệt kê chi tiết các trường hợp cần kiểm tra để sau này viết testbench cho từng trường hợp.
Đối với thiết kế này, chúng ta có thể đưa ra các trường hợp cần phải test như sau:
Kiểm tra reset: thay đổi giá mức logic tín hiệu reset và kiểm tra giá trị bộ đếm có như mong muốn hay không
Kiểm tra enable: thay đổi mức logic tín hiệu enable sau khi đã reset bộ đếm để kiểm tra hoạt động bộ đếm
Kiểm tra ngẫu nhiên: Cho hai tín hiệu reset và enable thay đổi ngẫu nhiên để kiểm tra
Tất nhiên, bạn có thể nghĩ ra thêm các testcase khác.
d. Viết testbench
Sau khi đã có test plan và test case, người kiểm tra sẽ thực hiện viết các testbench để bắt đầu kiểm tra thiết kế.
Ở bước này mình không viết hết các testbench cho từng trường hợp đã liệt kê ở bước trên mà chỉ cố gắng chỉ cách viết một testbench đơn giản để mô phỏng một thiết kế. Sau đây là một test bench đơn giản để kiểm tra bộ đếm đã nói trong ví dụ trên đây (Bạn chú ý các comment trong code để biết rõ các dòng lệnh làm gì và cấu trúc của một testbench)
//-----------------------------------------------------
// Design Name : tb_inc_counter
// Function : testbench
// Coder : phithiendao
//-----------------------------------------------------
module tb_inc_counter;
//
//Goi thiet ke can kiem tra
//
//Khai bao ngo vao kieu reg
reg clk, rst_n, enable;
//Khai bao ngo ra kieu wire
wire [3:0] count;
//Goi thiet ke
inc_counter U0 (
.clk (clk),
.rst_n (rst_n),
.enable (enable),
.count (count)
);
//
//Lai cac tin hieu ngo vao cua thiet ke
//
//Tao clock
initial
begin
clk = 1'b0;
forever #10 clk = !clk;
end
//Lai tin hieu rst_n
initial
begin
rst_n = 1'b1;
#200
rst_n = 1'b0;
#200
rst_n = 1'b1;
end
//Tao tin hieu enable
initial
begin
enable = 1'b0;
#800
enable = 1'b1;
end
//Giam sat cac tin hieu cua thiet ke
initial begin
$display("\t time,\t clk,\t rst_n,\t enable,\t count");
$monitor("%d,\t%b,\t%b,\t%b,\t%d",$time, clk,rst_n,enable,count);
end
endmodule
Sau đây là kết quả mô phỏng
Kiểm tra reset và enable
Trong hình trên bạn chú ý cửa sổ Transcript có hiện các đoạn thời gian mô phỏng và giá trị tương ứng của từng tín hiệu. Điều này có được là do 2 dòng code sau trong testbench:
$display("\t time,\t clk,\t rst_n,\t enable,\t count");
$monitor("%d,\t%b,\t%b,\t%b,\t%d",$time, clk,rst_n,enable,count);
Kết quả mô phỏng hoạt động bộ đếm
Phần mềm mô phỏng sử dụng trên đây là ModelSim, các bạn có thể xem hướng dẫn sử dụng
Nguồn: icdesignvn
Mong Muốn Có Thêm Cơ Hội Trong Công Việc
Và Trở Thành Một Người Có Giá Trị Hơn
Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng
Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON
Hotline: 0972.800.931 - 0938.838.404 (Mr Long)