Logic Verification

Cấu trúc cơ bản của một testbench

Cấu trúc cơ bản của một testbench

Cấu trúc cơ bản của một testbench

Để tiến hành bước verification cho thiết kế logic mà bạn hoặc team vừa tạo ra, chúng ta cần có 1 môi trường để kiểm tra ( Verification Environment ). Môi trường này bao gồm nhiều yếu tố, trong đó Testbench đóng vai trò quyết định đến chất lượng của cả quy trình verification. 

Ví dụ về cấu trúc của các thành phần trong Môi trường kiểm tra.

Sơ đồ khối bên trên là một ví dụ điển hình của một môi trường kiểm tra, được áp dụng và vận hành khá phổ biến. Trong sơ đồ này chúng ta thấy có 3 đối tượng chính: Testbench, Tool và các đoạn scripts để vận hành và liên kết giữa testbench và Tool.

 

<TOOL>

Các Tool thường dùng trong kiểm tra logic

Về Tool, đó là những phần mềm được dùng trong mô phỏng, kiểm tra logic như ModelSim của Altera, VCS của Synopsys, Quartus cũng của Altera.... Trong số đó, Synopsys là vendor có tính phí. Nói chung, đây chỉ là các phần mềm, việc sử dụng chúng và làm quen với chúng sẽ cần có thời gian. Về nguyên lý thì các tool này cũng có những điểm chung. Khác biệt lớn nhất là quy trình và giao diện cũng như các dạng dữ liệu tổng hợp sau khi thực hiện xong.

Thông thường, mỗi tool khác nhau sẽ cung cấp cách thiết lập, cú pháp lệnh khác nhau. Người dùng cần đọc hiểu các hướng dẫn sử dụng đầy đủ trước khi đi vào quá trình thực hiện. 

 

<SCRIPTS>

Như sơ đồ bên trên, scripts chính là nơi đưa các thiết lập cơ bản cho tool có thể hiểu được mục đích và cách thức mà bạn muốn Tool phải thực hiện. Ví dụ, bạn muốn chạy Verification mà cần phải tạo ra waveform, log file v.v.. hoặc chạy thêm các tính năng về code coverage, bỏ qua lỗi, hoặc hỗ trợ Verilog code theo format 2001, hoặc 1995, hỗ trợ song ngữ VHDL + Verilog ... 

Những setting này bạn hoàn toàn có thể sử dụng giao diện người dùng ( GUI ) thông qua các cửa sổ option của tool. Tuy nhiên, đối với các kỹ sư chuyên nghiệp, việc sử dụng 1 đoạn code thực thi ( scritpt ) là điều tiện dụng hơn, hạn chế được lỗi phát sinh trong quá trình cấu hình Tool bằng tay. Và có thể dễ dàng kiểm tra lại khi có sai sót. 

 

<TESTBENCH>

Sơ đồ khối tiêu biểu cho 1 testbench. 

Testbench là nơi mà các quá trình kiểm tra logic dành cho thiết kế của chúng ta. Về mặt kỹ thuật, testbench là 1 module Verilog, vì thế, nó có đầy đủ các thành phần của và tính chất của một verilog module. Sau đây là mẫu testbench ví dụ: 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// example of verilog testbench.

module testbench ();
// no input, output
    parameter TLCK = 100;

// wire
    wire        signal_1;
    wire [31:0] bus_1;
// reg
    reg         signal_a;
    reg  [31:0] bus_a;
    reg         clock;
    reg         a;
    reg         b;

// initialization

initial begin
    clock    = 1'b1;
    signal_a = 1'b0;
    bus_a    = 32'h00000000;
    a        = 1'b0;
    b        = 1'b1;
end

// clock generator
always begin
    #(TCLK/2) clock = ~clock;
end


// pattern supplier

initial begin
// reset the DUT
    #1000; 
    reset = 1'b0; 
    #1000; 
    reset = 1'b1;
    #(2*TCLK);

// call task to supply input with a and b
    a = 1'b1;
    b = 1'b1;

    #(1*TCLK);
    input_sup(a, b);

// waiting for a process to be completed

    @ (posedge flag_b);
    #(2*TCLK);

    $finish();
end

// monitor
initial begin
// wait here until the output to be valid
    @ (posedge flag_a );
    // call task get_output
    get_output();
end

task input_sup;
  input a;
  input b;
     begin 
        // execute some tasks here.
     end
endtask 

task get_output;
     begin 
        // execute some tasks here.
     end
endtask 

endmodule

// end of testbench

Cấu trúc của Testbench

Module testbench có thể không cần các tín hiệu input, output hoặc inout. Lý do là nó chỉ đóng vai trò làm nơi liên kết cho các thành phần khác trong testbench: test pattern supplier, clock generator, output monitor... 

Các thành phần bên trong testbench bao gồm: 

<Phần khai báo reg, wire>

Sau phần khai báo tên module testbench, thông thường, sẽ đến phần khai báo các tín hiệu được dùng ở module testbench.  Các tín hiệu ở cấp testbench gồm 2 loại chính. 

 

1. Tín hiệu được lái bởi test pattern supplier

a. Loại tín hiệu này được khai báo kiểu "reg". 

b. Được gán thẳng từ khối khởi tạo giá trị ban đầu và các phần test pattern supplier.

c. Trong testbench, các tín hiệu dạng "reg" này được gán bằng phép gán "=" ( Blocking assignment ) *

 

2. Tín hiệu dùng để nhận giá trị đầu ra từ DUT đến Monitor

a. Loại tín hiệu này được khai báo kiểu wire.

b. Được lái bởi tín hiệu đầu ra của DUT hoặc các khối tín toán khác.

c. Các tín hiệu này không có giá trị khởi tạo ban đầu. 

 

3. Các tín hiệu trung gian khác

a. Tín hiệu nối các khối trong phần Test pattern supplier. Những trường hợp phức tạp thì cần có nhiều tín hiệu phụ.

b. Các tín hiệu để làm flag, interrupt v.v

c. Các tín hiệu này có thể khai báo dạng reg hoặc wire tùy theo chức năng của chúng. Nếu là reg, chúng phải được gán giá trị ban đầu.

 

 <Phần gán các giá trị khởi tạo>

 Sau khi đã khai báo các tín hiệu, chúng ta tiến hành khởi tạo cho các tín hiệu dạng reg. Cú pháp phần khởi tạo này khá đơn giản, giống như phần code từ line 17 đến 25.

initial begin
    clock    = 1'b1;
    signal_a = 1'b0;
    bus_a    = 32'h00000000;
    a        = 1'b0;
    b        = 1'b1;
end

 Ví dụ về cách khởi tạo giá trị cho các biến loại "reg"

Việc khai báo phải đảm bảo 2 yếu tố, thứ nhất là tất cả các tín hiệu dạng reg phải được khai báo. Thứ hai, giá trị khởi tạo phải được quyết định trước, nếu khởi tạo không đúng với các thông tin của thiết kế, kết quả của verification sẽ không được như mong muốn.

  <Code tạo clock>

// clock generator
always begin
    #(TCLK/2) clock = ~clock;
end

Code tạo clock đơn giản.

Nếu bạn khởi tạo giá trị cho biến clock giá trị là 1'b0, thì hiệu clock tạo ra sẽ có giá trị 0 --> 1.  Nếu bạn khởi tạo giá trị cho biến clock giá trị là 1'b1, thì tin hiệu clock tạo ra sẽ có giá trị 1 --> 0. Chúng ta cần lưu ý điều này để có thể tạo được testbench và điều khiển các phần khác một cách hợp lý.

 

  <Tạo mẫu thử>

Mẫu thử là một trong nhiều trường hợp của các giá trị đầu vào, nhằm tạo ra một điều kiện nào đó để tác động vào DUT. Mẫu thử có thể đơn giản là việc ON OFF một tín hiệu nào đó, hoặc cũng có thể phức tạp, bao gồm một loạt các bước trung gian để có thể thực hiện được một quá trình tương ứng với một chức năng nào đó 

// pattern supplier
initial begin
// reset the DUT
    #1000; 
    reset = 1'b0; 
    #1000; 
    reset = 1'b1;
    #(2*TCLK);

// call task to supply input with a and b
    a = 1'b1;
    b = 1'b1;

    #(1*TCLK);
    input_sup(a, b);

// waiting for a process to be completed

    @ (posedge flag_b);
    #(2*TCLK);

    $finish();
end

Cách tạo một mẫu thử trong Verilog Testbench.

 

   <Lấy data ở output của DUT>

Sau khi được cấp xung clock và được áp các trình tự data ở đầu vào, một nhiệm vụ quan trọng khác của testbench đó là bắt lấy tín hiệu đầu ra. Các tín hiệu đầu ra này có thể là output của DUT hoặc cũng có thể là một tín hiệu nào đó bên trong của DUT. Tùy theo mục đích của mẫu thử mà người kiểm tra có thể lấy những tín hiệu đầu ra theo nhu cầu của họ. 

Sau khi lấy được giá trị đầu ra của quá trình kiểm tra, người dùng cần phải tạo phép so sánh với giá trị mong muốn. Điều này giúp cho người dùng biết được thiết kế của mình đã được thực hiện đúng với yêu cầu logic hay chưa. Như vậy, trước đó, người dùng đã phải tạo ra các giá trị mong muốn này. Việc tạo các giá trị mong muốn, bắt giá trị đầu ra và so sánh có thể được viết hoàn toàn bằng code verilog thông qua các "task".  Liên quan đến task, các bạn sẽ được tham khảo trong những bài viết khác.

// monitor
initial begin
// wait here until the output to be valid
    @ (posedge flag_a );
    // call task get_output
    get_output();
end

Ví dụ về việc gọi task get_output() để lấy các giá trị data.

Sau khi hoàn thành các mẫu thử, các bạn nên có một bước tổng kết lại các tình trạng hiện tại của công đoạn verification. Các bạn có thể tạo 1 checklist để tiện cho việc này.  Bảng sau đây có thể tạo dễ dàng bằng Excel.

Ví dụ về bảng Checklist dùng trong Verification.

 

Đây chỉ là một trong nhiều góc nhìn về verification environment. Hiên nay, nhiều kỹ thuật mới đã được áp dụng nhằm hạn chế sai sót, nâng cao năng suất kiểm tra và ứng dụng được với các DUT lớn.  Đến đây, chúng ta chắc hẳn đã có cái nhìn bao quát và cụ thể hơn về một môi trường kiểm tra logic thông dụng ( Verification Environment ). Nếu các bạn có thắc mắc với thiết kế mình đang thực hiện, hãy để lại comment bên dưới đây. Admin rất mong nhận được các ý kiến và câu hỏi của các bạn để có thể hoàn thiện và chia sẻ với chất lượng tốt nhất.

Cảm ơn các bạn đã theo dõi !