• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Thứ Bảy, 14 tháng 7, 2018

[STA] Tính toán độ trễ (delay) trong STA

Bài viết này trình bày về việc tính toán độ trễ (delay) và khái niệm về độ trễ ngõ vào, độ trễ ngõ ra trong phân tích timing. Đồng thời minh họa một báo cáo timing (timing report) cơ bản.
Trước khi tham khảo bài này, các bạn nên đọc qua một số bài viết sau đây:

1) Độ trễ ngõ vào (Input delay)
Trong phân tich timing, việc tính toán giá trị slack dựa trên thông số của phần tử tuần tự, độ trễ giữa startpoint và endpoint, khoảng cách giữa cạnh launch và cạnh capture.
slack = required time - arrival time
Hình 1: Cách xác định slack
Đối với một thiết kế, slack của đường dữ liệu từ một linh kiện tuần tự này, ví dụ như FF, đến một linh kiện tuần tự khác có thể xác định dễ dàng vì các thông số cần thiết có đầy đủ.
Hình 2: Các loại đường dữ liệu (data path)
Nhưng đối với loại đường dữ liệu từ ngõ vào (input) của thiết kế đến một linh kiện tuần tự hoặc đến ngõ ra thiết kế, thời gian đến (arrival time) của dữ liệu không thể xác định được từ netlist của thiết kế vì điểm launch nằm ngoài thiết kế. Khi điểm launch nằm ngoài thiết kế, độ trễ bên ngoài, từ một linh kiện tuần tự bên ngoài đến chân ngõ vào thiết kế không thể xác định được nên thời gian dữ liệu xuất hiện tại ngõ vào thiết kế cũng không xác định được. Để phân tích đường timing từ ngõ vào một thiết kế, chúng ta cần mô tả điều kiện timing của logic bên ngoài kết nối với ngõ vào. Điều kiện timing này gọi là độ trễ ngõ vào (input delay).
Hình 3: Độ trễ ngõ vào (input delay)
Trong minh họa hình 3, thiết kế cần phân tích timing có ngõ vào được lái từ FF0, dùng chung clock với FF1, qua mạch tổ hợp rồi đến FF1.D. Độ trễ ngõ vào được tính như sau:
Độ trễ ngõ vào = độ trễ clock-to-Q của FF0 + độ trễ mạch tổ hợp C0
2) Độ trễ ngõ ra (output delay)
Tương tự, đối với đường dữ liệu có endpoint là ngõ ra thì thời điểm capture nằm ngoài thiết kế nên độ trễ từ chân ngõ ra đến linh kiện tuần tự dùng để bắt dữ liệu ngõ ra này là không thể xác định. Vì vậy, để phân tích timing đường này, chúng ta cần đặc tả điều kiện timing của đường kết nối đến ngõ ra thiết kế. Thông số này gọi là độ trễ ngõ ra (output delay).
Hình 4: Độ trễ ngõ ra (output delay)
Trong ví dụ hình 4, độ trễ ngõ ra được tính như sau:
Độ trễ ngõ ra = Độ trễ mạch tổ hợp C0 + thời gian setup của FF0
3) Tính toán độ trễ trong STA
Trước khi tìm hiểu việc tính toán độ trễ trong phân tích timing tĩnh, chúng ta hãy phân tích và hiểu một báo cáo timing (timing report).
Hình 5: Báo cáo timing
Hình 5 là một báo cáo timing điển hình của các phần mềm phân tích timing (PrimeTime) và tổng hợp (Design Compiler). Báo cáo này thể hiện nhưng giá trị phân tích cho một đường timing từ điểm startpoint modem/qr_tmp với cạnh launch là cạnh lên clock Sysclk|altpll|clk[2] đến điểm endpoint modem/qr với cạnh capture là cạnh lên clock Sysclk|altpll|clk[2]. Loại phân tích timing là loại setup ứng với ký hiệu "max" (ký hiệu "min" là loại kiểm tra timing hold). Báo cáo timing có 3 cột là Point, Incr và Path.
Cột "Point" liệt kê tất cả các điểm mà đường timing đi qua từ startpoint đến endpoint và các độ trễ cộng thêm. Mỗi điểm là chân của một cell, trong ví dụ này, từ startpoint đến endpoint sẽ đi qua các điểm sau:
  • Chân clock của cell FF tên modem/qr_tmp
  • Chân Q của cell FF tên modem/qr_tmp
  • Ngõ ra cell buffer tên modem/qr_tmp_ASTfhInst7779
  • Ngõ ra cell buffer tên lcell_comb6052
  • Chân D của cell FF tên modem/qr
Trong đó có một độ trễ cộng thêm là độ trễ trên đường clock "clock network delay".
Cột "Incr" là giá trị được thêm vào (dương) hoặc trừ đi (âm) trong việc tính tổng độ trễ trên đường timing.
Cột "Path" là giá trị cộng dồn tại mỗi điểm. Giá trị cộng dồn tại một điểm lấy từ giá trị ngay trên nó cộng với giá trị cột "Incr" ở vị trí tương ứng. Ví dụ, độ trễ cộng dồn tại điểm lcell_comb6052/OUT (BUF_D6) là:
0.589 = 0.423 (giá trị điểm trước) + 0.166 (giá trị tăng thêm)
Báo cáo timing này có hai phần, nữa phần đầu tính toán thời gian trễ trên đường timing và cho biết thời gian đến trên đường dữ liệu (data arrival time) là 0.614. Phần sau cho biết thời gian yêu cầu phải có dữ liệu được tính từ lúc cạnh lên capture xuất hiện tại điểm định nghĩa clock cộng độ trễ trên đường clock có trừ đi setup time của FF bắt dữ liệu. Thời gian yêu cầu (data riquired time) là 6.334.
Phân cuối báo cáo timing, giá trị slack được tính trên thời gian yêu cầu dữ liệu và thời gian đến:
slack = thời gian yêu cầu - thời gian đến = 6.334 - 0.614 = 5.720 
Hình 6: Minh họa đường timing trong ví dụ 5
Quá báo cáo timing trên, chúng ta có thể hình dung được các thông số cần thiết để tính toán các giá trị timing.
Giá trị slack được tính thông qua các thông số sau:
  • Thời gian đến của cạnh clock launch tính từ nguồn clock đến chân ngõ vào của lauch FF, tương ứng với điểm qr_tmp.CLK trong hình minh họa 6
  • Thời gian đến của cạnh clock capture tình từ nguồn clock đến chân ngõ vào của capture FF, tương ứng với điểm qr.CLK trong hình minh họa 6
  • Độ trễ từ startpoint đến endpoint trên đường timing. Trong minh họa hình 6 là độ trễ tổng cộng từ qr_tmp.CLK đến qr.D
  • Độ lệch (uncertainty) xấu nhất giữa hai tín hiệu clock
Độ trễ tích lũy (cumulative delay) dọc theo đường timing được tính dựa trên:
  • Độ trễ của các cell, thông số này lấy từ thư viện công nghệ dùng để tổng hợp. Trong ví dụ hình 5, các độ trễ của cell gồm độ trễ clock-to-Q của FF qr_tmp, độ trên của các buffer, setup time của FF qr.
  • Độ trễ của đường dây kết nối (interconnect delay). Độ trễ này được tính dựa trên các thông số sau:
    • Thông số cell lái đường dây
    • Thông số tải của cell bị lái bởi đường dây
    • Thông số về điện trở và tụ điện của đường dây. Thông số này phụ thuộc đặc tính vật lý, độ dài của đường dây nên chỉ được xác định chính xác sau khi thiết kế đã được layout hoàn chỉnh.
Xem hình 6, xét đoạn dây từ buffer qr_tmp_ASTfhInst7779 đến buffer lcell_comb6052 thì qr_tmp_ASTfhInst7779 là cell lái, lcell_comb6052 là cell bị lái.
Trước khi "place and route" (quá trình sắp đặt các khối thiết kế, các cell và đi dây để kết nối các thành phần) độ trễ đường dây chỉ là một giá trị ước lượng của phần mềm phân tích timing. Sau khi "place and route", các thông số RC của đường dây sẽ được lấy chính xác từ độ dài đường dây và vật liệu đường dây.

Tham khảo:
Altera CorporationAN 554: How to Read HardCopy PrimeTime Timing Reports, Mar.2010


Thứ Hai, 9 tháng 7, 2018

[STA] Các loại đường ngoại lệ trong phân tích timing

Mặc định, phần mềm phân tích timing sẽ thực hiện phân tích tất cả các đường từ startpoint đến endpoint bằng cách giả sử sau khi một sự kiện lấy dữ liệu (launch) xuất hiện tại startpoint thì dữ liệu này sẽ được bắt (capture) ở endpoint trong cạnh clock kế tiếp. Nghĩa là timing được kiểm tra trong một chu kỳ xung clock. Bất kỳ trường hợp ngoại lệ nào nằm ngoài quy tắc này đều phải được khai báo như một đường timing ngoại lệ (timing exception). Bài này mô tả một số loại đường timing ngoại lệ.

1) False path
False path là một đường có tồn tại thực sự trong thiết kế nhưng trong quá trình hoạt động, đường này không bao giờ được sử dụng để truyền dữ liệu từ startpoint đến endpoint do được cấu hình, do chuỗi dữ liệu được mong muốn hoặc do chế độ hoạt động. False path là đường sẽ không cần phải thỏa mãn các điều kiện ràng buộc timing trong quá trình phân tích timing và là đường sẽ không cần phải tối ưu timing trong quá trình tổng hợp, thiết kế vật lý.
1.1) Đường có giá trị tại startpoint là cố định
Các thiết kế thường có một số bit thanh ghi được sử dụng để cấu hình hoạt động của thiết kế. Các bit này chỉ được cấu hình một lần trước khi hoạt động và giữ nguyên giá trị trong suốt quá trình hoạt động. Trong trường hợp này, việc phân tích timing hay tối ưu timing cho đường này có thể không cần thiết hoặc không qua trọng bằng các đường có trạng thái thay đổi liên tục. Đường đi từ bit này đến các thanh ghi khác có thể được xem như là false path.
Hình 1: flase path - ví dụ về đường có giá trị tại startpoint là không đổi trong khi thiết kế hoạt động
1.2) Đường không xảy ra sự lan truyền dữ liệu từ startpoint đến endpoint
Trong trường hợp này, dữ liệu của startpoint không ảnh hưởng đến giá trị tại endpoint trong bất cứ trường hợp nào. Trong ví dụ hình 2, FF0 không bao giờ lan truyền dữ liệu của nó đến FF1 do cấu trúc mạch được điều khiển bởi sel. Trong trường hợp này, đường từ FF0 đến FF1 có thể được xem xét như false path.
Hình 2: flase path - FF0 không bao giờ lan truyền dữ liệu đến FF1
Một ví dụ khác trong hình 3, giữa FF0 và FF3 có đường timing tuy nhiên giá trị của FF0 không bao giờ ảnh hưởng đến giá trị FF3. Giá trị FF3 chỉ phụ thuộc vào giá trị của FF1. Đường timing từ FF0 đến FF3 có thể được xem như là false path.
Hình 3: False path - giá trị của FF0 không ảnh hưởng đến FF3 trong mọi trường hợp
1.3) Đường reset bất đồng bộ
Trong quá trình khởi động (start-up), quá trình xảy ra sau khi bật nguồn và trước khi chip bắt đầu hoạt động, các FF cần được reset để xác lập giá trị ban đầu. Một số module sẽ không cần phải hoạt động và không được cấp clock thông qua các cell clock-gate trong suốt quá trình khởi động. Để reset được các FF không có clock, reset bất đồng bộ sẽ được sử dụng. Đối với các module không được cấp clock, timing của tín hiệu reset bất đồng bộ không ảnh hưởng đến các FF. Tín hiệu reset có thể tích cực và thôi tích cực bất cứ thời điểm nào trong quá trình khởi động mà không gây ra trạng thái bất ổn định (metastability) cho các FF không được cấp clock. Vì vậy, đường reset bất đồng bộ đẽn các FF này có thể xem như là false path.
Hình 4: False path - FF0 không được cấp clock trong suốt quá trình khởi động (start-up) với reset bất đồng bộ
Ví dụ hình 4 minh họa quá trình startup sử reset bất đồng bộ startup_rst để reset các FF. FF0 là FF không được cấp clock trong quá trình này nên đường reset bất đồng bộ đên nó có thể xem như là false path.
1.4) Đường giao tiếp giữa hai miền clock bất đồng bộ
Một tín hiệu được phát bởi một clock này và được nhận bởi một clock khác nhưng hai clock này bất đồng bộ với nhau thì đường này có thể xem như là false path vì chúng ta không thể tìm thấy mối ràng buộc timing nào giữa hai clock bất đồng bộ. Trong ví dụ hình 5, đường timing từ FF0 đến FF1 là false path.
Hình 5: False path - đường giao tiếp giữa hai miền clock bất đồng bộ
1.5) Ý nghĩa của việc xác định flase path
Việc xác định các đường flase path nếu được thực hiện ngay từ đầu bởi người thiết kế để mô tả rõ cho phần mềm kiểm tra timing và thiết kế vật lý sẽ giúp cho quá trình phân tích timing và tối ưu thiết kế nhanh hơn và hiệu quả hơn.
Nhanh hơn thể hiện ở hai điểm:
  • Quá trình phân tích timing và tối ưu thiết kế không phải lặp đi lặp lại quá nhiều lần. Trên thực tế, trong các thiết kế lớn, nhiều đường được phát hiện và thiết lập là flase path là nhờ các phần mềm phân tích timing. Nếu các đường flase path không được thiết lập ngay từ đầu, việc phân tích timing có thể phải thực hiện nhiều lần.
  • Xác định đúng và đủ các đường flase path sẽ giúp phần mềm phân tích timing giảm bởi thời gian kiểm tra các đường timing không cần thiết.
Hiệu quả hơn thể hiện ở việc các phần mềm tổng hợp sẽ tập trung tối ưu cho các đường timing cần thiết và tránh những tối ưu không cần thiết cho các false path. Việc tối ưu cho các đường đáng lẽ là flase path không chỉ làm tăng thời gian chạy của phần mềm mà còn có thể làm tăng diện tích hoặc công suất tiêu thụ của linh kiện.
2) Multicycle path
Mặc định, phần mềm phân tích timing thực hiện các kiểm tra trong một chu kỳ xung clock khi dữ liệu lan truyền từ startpoint đến endpoint. Tuy nhiên trong thiết kế, một số đường có thể được thiết kế để dữ liệu lan truyền từ startpoint đến endpoint trong khoảng thời gian nhiều chu kỳ xung clock.
Hình 6: Multicycle path
Trong ví dụ hình 6 đường timing từ FF3 đến FF4 được thiết kế để FF4 bắt dữ liệu truyền từ FF3 trong 2 chu kỳ xung clock. Nghĩa là, sau khi FF3 lấy dữ liệu mới ở cạnh clock thứ nhất thì đến cạnh clock thứ 3 FF4 mới cập nhật dữ liệu mới từ FF3.
Khi thiết lập một đường là multicycle path, vị trí kiểm tra setup và hold cũng sẽ thay đổi theo tương ứng như trong minh họa hình 7.
Hình 7: Kiểm tra timing cho multicycle path
Riêng đối với kiểm tra hold, phần mềm kiểm tra timing như Prime Time cho phép thiết lập vị trí kiểm tra hold tại cạnh đầu tiên (như mặc định) hoặc cạnh thứ 2 (đi theo vị trí kiểm tra setup mới).
Hình 8. Vị trí kiểm tra hold có thể được lựa chọn trong cấu hình multicycle path
3) Minimum-delay và maximum-delay path
Đường này phải có độ trễ lớn hơn hoặc bằng giá trị tối thiểu (minimum) hoặc nhỏ hơn hoặc bằng giá trị tối đa (maximum) đã thiết lập. Mặc định, phần mềm phân tích timing sẽ dựa trên cạnh launch và cạnh capture của clock để xác định giá trị độ trễ tối thiểu và tối đa cho phép nhưng phần mềm phân tích timing cho phép ghi đè giá trị này thông qua việc thiết lập độ trễ tối thiểu và độ trễ tối đa cho đường timing. Đối với phần mềm Prime Time, giá trị tối thiểu và tối đa được tính như sau:
Độ trễ tối đa = giá trị thiết lập - thời gian setup tại cạnh capture
Độ trễ tối thiểu = giá trị thiết lập - thời gian hold
Đường được thiết lập giá trị độ trễ tối thiểu và độ trễ tối đa sẽ bị bỏ qua các ràng buộc liên quan đến clock. Timing của đường này sẽ được kiểm tra dựa trên kết quả so sánh với độ trễ tối thiểu hoặc tối đa đã thiết lập.


Tham khảo:
1) Nitin Singh, Neha Agarwal, Arjun Pal Chowdhury; Basics of multi-cycle & false paths; August 07, 2014; https://www.edn.com
2) http://vlsiuniverse.blogspot.com



Thứ Bảy, 7 tháng 7, 2018

[STA] Các thông số của clock trong phân tích timing

Để các phần mềm phân tích như Prime Time của Synopsys có thể hiểu và phân tích chính xác timing thì những mô tả về các thông số cấu hình cơ bản hoặc các ràng buộc (constraint) timing cần được cung cấp. Bài này mô tả một số khái niệm về các thông số cơ bản như độ trễ, thời gian chuyển đổi, độ lệch của đường clock cần phải khai báo khi thực hiện kiểm tra timing.

Việc phân tích timing gắn liền với các ràng buộc liên quan đến clock. Một thiết kế có thể hoạt động với chỉ duy nhất 1 hoặc nhiều clock khác nhau. Tất cả các clock có trong thiết kế đều phải được đặc tả timing rõ ràng. Nếu thiết kế có nhiều clock, sự ràng buộc timing giữa các clock này phải được mô tả để phần mềm phân tích có thể kiểm tra đường timing từ lan truyền từ clock này đến clock khác.Các thông số của clock gồm có:
  • Chu kỳ clock (period)
  • Độ trễ clock (latency)
  • Thời gian chuyển đổi tại các cạnh clock (transition time)
  • Độ lệch clock (uncertainty hoặc skew)
Quá trình phân tích timing sẽ sử dụng tất cả các thông số của clock để xác định các điều kiện xấu nhất cho mỗi loại kiểm tra timing.
Hình 1: Các thông số của clock
1) Độ trễ clock (latency)
Độ trễ clock có hai loại là độ trễ nguồn (source latency) và độ trễ mạng clock (network latency). Trong đó:
  • Độ trễ nguồn, source latency hoặc source delay, là thời gian tín hiệu clock lan truyền từ điểm nguồn đến điểm định nghĩa clock trong thiết kế. Điểm nguồn có thể là tại PLL (Phase Lock Loop) hoặc tại bộ tạo clock nội. Điểm định nghĩa clock có thể là port clock của một khối, một module hoặc một nhóm module được kiểm tra timing.
  • Độ trễ mạng clock, network latency hoặc network delay, là thời gian tín hiệu clock lan truyền từ điểm định nghĩa lock đến chân clock của phần tử tuần tự, ví dụ như chân clock của một FF.
Lý do sinh ra độ trễ clock là do các buffer được chèn trên đường clock khi thực hiện thiết kế cây clock cho một chip và độ trễ đường dây khi layout. Độ trễ sinh ra do chèn thêm các buffer gọi là insertion delay.
  • Source insertion delay là độ trễ chèn thêm tính từ điểm nguồn clock đến điểm định nghĩa clock.
  • Network insertion delay là độ trễ chèn thêm tính từ điểm định nghĩa clock đến chân clock của một phần tử tuần tự.
Độ trễ clock (latency) = độ trễ chèn thêm (insertion delay) + độ trễ đường dây
Độ trễ chèn thêm (insertion delay) = độ trễ chèn thêm từ nguồn (source insertion delay) + độ trễ chèn thêm của mạng clock (network insertion delay)

Hình 2: Đỗ trễ của tín hiệu clock
2) Thời gian chuyển đổi tại các cạnh clock
Thời gian chuyển đổi tại cạnh clock là khoảng thời gian mà clock chuyển từ trạng thái này sang trạng thái khác. Trên thực tế, khi chuyển trạng thái, tín hiệu cần một khaongr thời gian để xác lập giá trị mới chứ
Thời gian chuyển đổi có hai loại là thời gian chuyển đổi cạnh lên (rising transition time) và thời gian chuyển đổi cạnh xuống (falling transition time).
Việc chuyển đổi trạng thái trên tín hiệu clock cần một khoảng thời gian do kết nối giữa cổng lái tín hiệu clock đến chân clock của FF. Kết nối này có thể được mô hình tương đương gần đúng bằng điện trở ngõ ra cổng lái (RoutB), điện trở đường dây (Rwire), tụ kí sinh trên đường dây (Cwire) và tụ đầu vào chân clock (CinFF) như hình 3.
Hình 3: Mô hình tương đương của kết nối từ Buffer đến chân clock của FF
Điện áp tại chân clock của một FF được lan truyền từ ngõ ra một buffer sẽ được tính theo mô hình tường đương trên như sau:

Vout = VDD (1- e^(-t/RC))

Trong đó, R = RoutB + RwireC = Cwire + CinFF.
Thời gian cạnh lên (cạnh xuống) của clock được tính từ khi điện áp tại chân clock chuyển đạt từ 10% đến 90% (từ 90% đến 10%) điện áp nguồn. Như vậy thời gian cạnh lên sẽ được tính như sau:
Thời gian cạnh lên = Thời gian đạt 90% - Thời gian đạt 10%
Thời gian đạt 90% sẽ được tính theo buổi thức điện áp Vout như sau:
0.9*VDD =VDD(1- e^(-t/RC)
e^(-t/RC) = 1 - 0.9
t = -(RC*ln(0.1))
t ~= 2.3*RC
Thời gian đạt 10% được tính như sau:
0.1*VDD =VDD(1- e^(-t/RC)
e^(-t/RC) = 1 - 0.1
t = -(RC*ln(0.9))
t ~= 0.1*RC
Như vậy, thời gian cạnh lên trise = 2.2*RC
Hình 4: Thời gian chuyển đổi trạng thái của cạnh clock
Thời gian cạnh xuống của clock xấp xỉ bằng thời gian cạnh lên do thời gian nạp và xả của tụ là như nhau.
3) Độ lệch clock (uncertainty hoặc skew)
Độ lệch clock được định nghĩa là sự khác biệt tối đa về thời gian đến của tín hiệu clock tại các thanh ghi trong cùng một miền clock hoặc giữa các miền clock khác nhau.
Sau khi tổng hợp và trước khi tổng hợp cây clock (clock tree synthesis) thì uncertainty sinh ra do hiện tượng clock jitter. Clock jitter là hiện tượng cạnh clock bị cung cấp lệch so với vị trí lý tưởng. Hiện tượng này xảy ra khi nguồn cung cấp clock (clock source) bị nhiễu, năng lượng không ổn định hoặc bị ảnh hưởng từ các mạch khác,...
Hình 5: Clock jitter
Sau khi tổng hợp cây clock và layout, độ lệch clock còn bị tác động do độ trễ trên đường clock đến các FF khác nhau là khác nhau. Do độ trễ khác nhau nên cạnh xung clock xuất hiện tại chân clock của các FF là không cùng một lúc.
Hình 6: Độ lệch clock
Độ lệch clock có hai loại là:
  • Simple uncertainty là độ lệch clock giữa các cạnh liên tiếp của cùng một clock so với một thời điểm lý tưởng.
  • Interclock  uncertainty là độ lệch clock giữa hai cạnh hai cạnh của hai clock khác nhau.
Hình 7: Simple and interclock uncertainty

Thứ Sáu, 6 tháng 7, 2018

[STA] Tổng quan về phân tích timing tĩnh

Timing (định thời) là những quy định về mặt thời gian mà các mạch số cần phải tuân thủ và đáp ứng khi được tổng hợp và layout. Timing là một trong các yếu tố quan trọng luôn phải được xem xét, đánh giá khi tổng hợp, layout mạch số. Các phần mềm tổng hợp như Design Compiler sẽ thực hiện việc phân tích timing tĩnh (Static timing) để lựa chọn các cổng logic phù hợp tạo ra các netlist. Các phần mềm layout như IC compiler sẽ căn cứ trên kết quả phân tích timing tĩnh để sắp đặt (place) các cell và đi dây (route) kết nối các cell tạo ra bản layout. Phần mềm chuyên phân tích timing như Prime Time sẽ kiểm tra timing toàn bộ thiết kế theo tốc độ clock mong muốn. Bài viết này sẽ mô tả tổng quan về một số khái niệm trong phân tích timing tĩnh (Static Timing Analysis).
1) Phân tích timing tĩnh là gì?
Phân tích timing tĩnh là một phương pháp xác định sự hợp lệ (MET) về mặt timing của thiết kế bằng cách kiểm tra tất cả các đường đi trong thiết kế có vi phạm timing hay không trong điều kiện xấu nhất. Phân tích timing chỉ quan tâm đến độ trễ xấu nhất có thể xảy ra trong mạch số chứ không quan tâm đến chức năng của mạch số.
So với việc mô phỏng (simulation) mạch số thì phần tích timing được thực hiện nhanh hơn và toàn diện hơn.
  • Nhanh hơn là bởi vì phân tích timing không cần sử dụng đến nhiều các test vector khác nhau như khi mô phỏng chức năng. Test vector là các giá trị đầu vào của thiết kế mà người mô phỏng sẽ xây dựng để kiểm tra chức năng thiết kế.
  • Toàn diện hơn là vì nó kiểm tra trường hợp timing xấu nhất cho tất cả các điều kiện logic có thể chứ không chỉ hạn chế bởi một tập các test vector cố định nào. Tuy nhiên phân tích timing tĩnh chỉ kiểm tra thuộc tính timing của thiết kế chứ không kiểm tra tính đúng đắn về chức năng thiết kế.
Các ràng buộc (constraint) về timing, diện tích và năng lượng tiêu thụ là ba yếu tố ảnh hưởng đến quá trình tổng hợp và thiết kế vật lý (quá trình layout) của mạch số. Các phần mềm tổng hợp và layout luôn hướng đến mục tiêu làm cho vi mạch được tạo ra có tốc độ hoạt động nhanh nhất, diện tích nhỏ nhất, công suất tiêu thụ ít nhất phù hợp với yêu cầu thiết kế. Các phần mềm này sẽ tìm cách cân bằng các yếu tố tốc độ, diện tích, năng lượng của thiết kế và thời gian chạy của phần mềm dựa trên các ràng buộc (các thiết lập) của người thiết kế. Tuy nhiên một chip phải thỏa mãn các ràng buộc về timing để có thể xử lý đúng ở một tốc độ clock mong muốn. Timing chính là ràng buộc quan trọng nhất của thiết kế. Diện tích lớn hay công suất cao thì chức năng của chip vẫn đảm bảo nhưng timing không đúng thì chip sẽ hoạt động sai chức năng.
Phân tích timing tĩnh là trả lời câu hỏi "Khi cạch tích cực (cạnh lên hoặc cạnh xuống) của clock xuất hiện, một dữ liệu đúng có luôn xuất hiện ở ngõ vào của một cell đồng bộ, ví dụ như Flip-Flop (FF), trong mọi điều kiện hoạt động hay không?". Trong câu hỏi này, chúng ta thấy việc phân tích timing gắn liền với một định nghĩa clock. Giá trị đầu vào của một cell đồng bộ có thể thay đổi trong quá trình hoạt động của chip, kiểm tra timing là để đảm bảo một cell đồng bộ luôn bắt được dữ liệu đúng của đầu vào.
Lấy một ví dụ đơn giản như sau để các bạn có thể hình dung về timing, một hãng xe khách có lịch trình xuất phát hằng ngày từ TP. HCM đến TP. Bảo Lộc là 1 tiếng có 1 chuyến, hành khách phải có mặt trước hoặc đúng các thời điểm 6 giờ, 7 giờ, 8 giờ, ... thì mới có xe chạy. Bên cạnh đó, nhà xe khuyến cáo hành khách đến trước chuyến đi 15 phút, đây giống như ràng buộc timing, nếu hành khách đến trước 15 phút thì luôn lên được chuyến xe mong muốn. Một hành khách muốn đi xe lúc 8 giờ, nếu hành khách này đến trước hoặc đúng 7 giờ 45 phút thì lên được đúng chuyến xe mong muốn, điều này tương ứng với việc timing được thỏa mãn, gọi là MET timing. Nếu hành khách này đến sau 7 giờ 45 phút, hành khách có thể bị trễ chuyến xe, điều này tương ứng với việc timing bị vi phạm, gọi là VIOLATED timing. Ở đây, lịch trình 1 tiếng có 1 chuyến giống như xung clock. Ví dụ này chỉ dùng mới mục đích giúp các bạn dễ hình dung về khái niệm timing chứ trên thực tế việc phân tích timing trong thiết kế vi mạch không đơn giản chỉ như vậy.
Hình 1: Minh họa khái niệm timing
2) Các loại kiểm tra timing 
Trong quá trình phần tích timing có nhiều loại kiểm tra timing cho nhiều loại đường timing khác nhau. Mục này trình bày một số loại kiểm tra timing gồm:
  • Kiểm tra setup
  • Kiểm tra hold
  • Kiểm tra data-to-data
  • Kiểm tra recovery
  • Kiểm tra removal
2.1) Kiểm tra setup
Xét ví dụ về sự truyền dữ liệu giữa 2 FF sau đây:
Hình 2: Ví dụ về đường timing (timing path)
Hình 1 minh họa một đường timing (khái niệm này sẽ được đề cập sau ở bài này) là đường đứt nét màu đỏ. Khi xuất hiện cạnh lên clock clk, giá trị FFA.D được cập nhật đến FFA.Q, lan truyền qua mạch tổ hợp đến FFB.D. Để FFB bắt được giá trị mới tại FFB.D được truyền từ FFA.Q thì giá trị này phải xuất hiện ổn định tại FFB.D trước khi cạnh lên clock clk xuất hiện tại FFB. Sau đây chúng ta sẽ phân tích đường timing này.
Hình 3: Minh họa timing của đường timing ở hình 1
Hình 2 minh họa timing của đường timing trong ví dụ ở hình 1. Ở đây, chúng ta xem cạnh lên clock clk xuất hiện tại FFA và FFB là cùng một thời điểm, nghĩa là độ trễ trên đường clock clk giữa FFB và FFA là không đáng kể. Khi FFA.D thay đổi trạng thái, FFA sẽ bắt giá trị của FFA.D và chuyển đến FFA.Q tại cạnh lên clock clk. Sự kiện bắt giá trị trên FFA.D gọi là sự kiện khởi tạo (launch event) của đường timing. Cạnh lên lock tại FFA gọi là cạnh khởi tạo (launch edge). Giá trị của FFA.D sẽ xuất hiện tại FFA.Q sau một khoảng thời gian trễ, gọi là độ trễ chân clock đến Q của FFA (clk-to-Q). Khi giá trị FFA.Q đi qua mạch tổ hợp thì sau một khoảng thời gian, gọi là độ trễ mạch tổ hợp (combinational logic delay), giá trị xuất hiện tại FFB.D. Thời điểm giá trị mới xuất hiện tại FFB.D gọi là thời điểm đến (arrival time) của đường timing. Thời điểm đến này phải xuất hiện trước cạnh lên clock clk tại FFB (cạnh lên clock tiếp theo) một khoảng thời gian tối thiểu bằng setup time của FFB. Setup time là khoảng thời gian trước khi xuất hiện cạnh tích cực (trong ví dụ này là cạnh lên) tại FF mà dữ liệu trên chân D của FF phải ổn định thì mới đảm bảo FF bắt đúng được giá trị của D.
Thời điểm chậm nhất của thời gian đến gọi là thời điểm yêu cầu (required time) cho đường timing. Việc bắt dự liệu tại cạnh lên clock clk tại FFB gọi là sự kiện bắt (capture) của đường timing. Cạnh lên clock này gọi là cạnh bắt (capture edge). Chú ý, cạnh khởi tạo xuất hiện tại sự kiện khởi tạo ở FFA còn cạnh bắt là cạnh clock tiếp theo xuất hiện tại sự kiện bắt ở FFB.
Khoảng thời gian mà trong đó ràng buộc timing phải được thỏa mãn gọi là slack.
slack = required time - arrival time

Nếu arrival time sớm hơn required time thì slack là giá trị dương. Nếu arrival time trùng với required time thì slack bằng 0 và ràng buộc timing là vừa đủ thỏa mãn (barely MET). Nếu arrival time trễ hơn required time thì slack âm. Loại kiểm tra timing trong ví dụ này là một trong những loại kiểm tra cơ bản gọi là kiểm tra setup. Kiểm tra setup sẽ kiểm tra xem sự thay đổi dữ liệu có đến đủ sớm trước mỗi cạnh tích cực của clock ở một cell đồng bộ hay không.
Theo công thức tính slack. Nếu kiểm tra setup bị vi phạm, slack âm, thì người thiết kế có thể tác động đến hai yếu tố:
  • Required time là yếu tố phụ thuộc vào thông số thư viện công nghệ như thời gian setup của FF nên người thiết kế không thay đổi nhiều mà chỉ thiết lập ràng buộc timing đúng.
  • Arrival time là yếu tố phụ thuộc lớn vào thiết kế vì độ trễ chính của đường timing là độ trễ trên mạch tổ hợp. Người thiết kế có thể thay đổi để thỏa mãn yêu cầu timing.
Người thiết kế có thể áp dụng một số giải pháp sau đây để tránh vi phạm timing sau theo thứ tự ưu tiên:
  1. Tối ưu lại mạch tổ hợp giữa hai phần tử tuần tự để giảm độ trễ trên mạch tổ hợp. Thồng thường để tối ưu đáng kể thì người thiết kế phải chuyển hoàn toàn từ một phương pháp hay ý tưởng thiết kế này sang một giải pháp thiết kế khác.
  2. Sử dụng phần tử tuần tự để cắt đường timing dài thành nhiều đường timing ngắn hơn. Lúc này, đường timing đi trực tiếp từ FFA đến FFB sẽ không còn, thay vào đó là đường timing đi từ FFA đến FFM và đường timing đi từ FFM đến FFB với độ trễ mạch tổ hợp giữa FFA và FFM; FFM và FFBA nhỏ hơn nhiều so với từ FFA đến FFB trước đó.
  3. Đổi thư viện công nghệ bằng cách chuyển từ thư viện công nghệ có các cell độ trễ lớn, tốc độ thấp đến các cell có độ trễ nhỏ hơn , tốc độ cao. Tuy nhiên, trên thực tế, với một dự án cụ thể, thư viện công nghệ đã được chọn cố định từ đầu và các thiết kế trong một chip phải tìm mọi cách đáp ứng theo thư viện công nghệ này.
2.2) Kiểm tra hold
Ngoài kiểm tra setup, một loại kiểm tra cơ bản khác là kiểm tra hold. Loại này sẽ kiểm tra xem dữ liệu có được giữ trong một khoảng thời gian vừa đủ sau khi xuất hiện cạnh capture hay không. Một dữ liệu không chỉ phải xuất hiện trước cạnh capture một khoảng thời gian đủ để không vi phạm setup mà còn phải duy trì ổn định giá trị của nó sau khi cạnh capture xuất hiện một khoảng thời gian đủ để không vi phạm hold.
Kiểm tra hold bị vi phạm nếu độ trễ ngắn nhất của mạch tổ hợp từ cạnh launch đến cạnh capture quá ngắn còn độ trễ dài nhất từ cạnh launch đến cạnh capture lại quá dài. Xét ví dụ hình 4, trên dường timing có một cổng NOR với độ trễ rất nhỏ. Trong khi đó, đường clock có 7 buffer có độ trễ lớn làm cho clock tại FFB.CLK trễ đáng kể so với clock tại FFA.CLK.
Hình 4: Ví dụ về kiểm tra hold time
Trong trường hợp, độ trễ mạch tổ hợp quá nhỏ trong khi độ trễ đường clock lại lớn đáng kể, vi phạm hold time có thể xảy ra .
Hình 5: Kiểm tra hold
Trong ví dụ này, yêu cầu về thời gian setup có thể dễ dàng thỏa mãn nhưng thời gian hold không được thỏa mãn vì dữ liệu tại FFB.D không được giữ đủ lâu sau cạnh clock giả định. Dữ liệu thay đổi trước khi cạnh clock thực tế xuất hiện tại FFB.CLK làm cho FFB không bắt được dữ liệu mong muốn. Vi phạm hold có thể được giải quyết bằng một trong hai hoặc cả hai cách sau:
  • Tăng độ trễ trên đường timing
  • Giảm độ trễ của đường clock
Các loại kiểm tra timing khác nhau sẽ kiểm tra các điều kiện xấu nhất khác nhau. Ví dụ, kiểm tra setup sẽ quan tâm đến đường đi dài nhất (chậm nhất) đi qua mạch tổ hợp của đường timing và vị trí xuất hiện cạnh clock capture sớm nhất so với cạnh clock launch. Ngược lại, kiểm tra hold lại quan tâm đến đường đi ngắn nhất (nhanh nhất) qua mạch tổ hợp và vị trí xuất hiện cạnh clock capture trễ nhất so với cạnh clock launch.
Hình 6: Có nhiều đường đi khác nhau qua một mạch tổ hợp
2.3) Kiểm tra data-to-data
Khác với kiểm tra setup và kiểm tra hold là kiểm tra mối liên hệ giữa đường clock và đường data, kiểm tra data-to-data là kiểm tra timing giữa hai đường data. Ví dụ một cell có hai đường đường dữ liệu đầu vào là D1 và D2 như hình 7.
Hình 7: Ví dụ về kiểm tra data-to-data
Trong ví dụ này, đường canh lên đường D2 được sử dụng để bắt dữ liệu trên đường D1 nhưng đường D2 không được định nghĩa như một tín hiệu clock mà được xem như một tín hiệu data thông thường. Trong trường hợp này, tín hiệu tại chân D1 phải được ràng buộc để giữ ổn định trước cạnh lên D2 một khoảng thời gian gọi là setup time và phải giữ ổn định sau cạnh lên D2 một khoảng thời gian gọi là hold time.
2.4) Kiểm tra recovery
Recovery time là khoảng thời gian tối thiểu tính từ lúc một tín hiệu điều khiển bất đồng bộ thôi tích cực đến cạnh tích cực của clock. Nghĩa là một tín hiệu điều khiển bất đồng bộ, ví dụ như set/reset bất đồng bộ, khi chuyển từ trạng thái tích cực sang trạng thái không tích cực thì khoảng thời gian "không tích cực" phải thỏa mãn thời gian recovery.
Hình 8: Recovery time cho tín hiệu bất đồng bộ tích cực mức cao
Kiểm tra recovery là để đảm bảo khoảng thời gian recovery của các tín hiệu điều khiển bất đồng bộ phải đủ.
2.5) Kiểm tra removal
Removal time là khoảng thời gian tối hiểu mà một tín hiệu bất đồng bộ phải giữ mức tích cực của nó sau một cạch tích cực của clock. Nghĩa là, khi một tín hiệu bất đồng bộ đang tích cực, nếu muốn thôi tích cực thì thời gian từ vị trí nó thôi tích cực đến cạnh clock tích cực gần nhất trước nó phải thỏa mãn removal time.
Hình 9: Removal time của một tín hiệu điều khiển bất đồng bộ tích cực mức cao
Kiểm tra removal là để đảm bảo khoảng thời gian removal của các tín hiệu điều khiển bất đồng bộ phải đủ.
3) Các loại đường timing (timing path) trong mạch số
Phần mềm tổng hợp, tối ưu và phân tích timing có thể thực hiện kiểm tra timing cho các loại đường sau đây:
  • Đường clock là đường từ chân ngõ vào clock hoặc chân một cell đi qua một hoặc nhiều buffer hay cổng đảo đến chân clock của một phần tử tuần tự.
  • Đường clock-gating là đường từ một chân ngõ vào đến một phần tử clock_gating.
  • Đường bất đồng bộ là đường từ chân ngõ vào đến chân set/reset bất đồng bộ của phần tử tuần tự.
  • Đường data là đường từ chân ngõ vào hoặc chân clock đến chân ngõ ra hoặc chân ngõ vào của phần tử tuần tự. 
Hình 10. Các loại đường timing
4) Các loại đường dữ liệu (data path)
Các phần mềm phân tích timing sẽ tìm và phân tích tất cả các loại đường timing trong thiết kế. Đường dữ liệu là một loại đường cơ bản mặc địch sẽ được kiểm tra. Mỗi đường sẽ có một điểm bắt đầu (startpoint) và một điểm kết thúc (endpoint). Điểm bắt đầu là vị trí mà tại đó dữ liệu sẽ được bắt bởi cạnh tích cực của clock. Dữ liệu được bắt này sẽ lan truyền qua mạch tổ hợp và đường dây đến điểm kết thúc mà tại đây nó sẽ được bắt bởi một cạnh clock khác.
Điểm bắt đầu có hai loại:
  • Chân clock của một phần tử tuần tự
  • Chân ngõ vào của thiết kế
Điểm kết thúc có hai loại:
  • Chân dữ liệu của một phần tử tuần tự
  • Chân ngõ ra của thiết kế
Hai điểm bắt đầu và 2 điểm kết thúc sẽ tạo ra 4 loại đường dữ liệu:
  • Từ ngõ vào thiết kế đến chân dữ liệu của phần tử tuần tự
  • Từ chân clock của phần tử tuần tự đến chân dữ liệu của phần tử tuần tự
  • Từ ngõ vào thiết kế đến ngõ ra thiết kế
  • Từ chân clock của phần tử tuần tự đến ngõ ra thiết kế
Hình 11: Các loại đường dữ liệu
Mỗi loại đường timing trong thiết kế sẽ có slack khác nhau. Như đã trình bày ở phần trên slack là một giá trị thời gian có thể dương, âm hoặc bằng 0. Đường có giá trị slack xấu nhất gọi là critical path. Đây là đường có giá trị slack âm lớn nhất trong trường hợp có vi phạm timing. Trong trường hợp không vi phạm timing thì critical path là đường có giá trị slack nhỏ nhất trong thiết kế. Trong một thiết kế có thể có nhiều đường critical path nếu các đường này có giá trị slack xấu nhất bằng nhau.

Chủ Nhật, 3 tháng 6, 2018

[System Verilog] Kiểm tra formal - phần 3: Tổng quan về SVA

Bài viết này trình bày tổng quan về SVA (System Verilog Assertion), phân loại SVA và sự khác nhau giữa các loại SVA.
1) Các loại phát biểu assertion
Một assertion mô tả một hành vi hệ thống. Mục đích chính của assertion là xác thực tính hợp lệ của hành vi của một thiết kế, nghĩa là trả lời câu hỏi “thiết kế có làm việc chính xác hay không?”. Assertion còn được dùng để cung cấp thông tin về coverage chức năng, nghĩa là trả lời câu hỏi “các test có tốt hay không?”.
Assertion có thể được kiểm tra động (dynamic) bằng mô phỏng hoặc kiểm tra tĩnh (static) bằng phần mềm kiểm tra thuộc tính, ví dụ như phần mềm kiểm tra forrmal xác minh thiết kế có đáp ứng theo đúng spec hay không. Các phần mềm này yêu cầu các mô tả về thuộc tính, hành vi thiết kế để làm cơ sở so sánh với thiết kế thực.
Để mô tả một assertion chúng ta có thể sử dụng một trong các phát biểu assertion sau đây:
  • assert dùng đểđặc tả thuộc tính bắt buộc của thiết kế sẽ được kiểm tra để xác minh thuộc tính đó có được giữ hay không.
  • assume dùng để đặc tả thuộc tính giả định của môi trường. Trình mô phỏng sẽ kiểm tra thuộc tính này được giữ hay không còn phần mềm formal sẽ sử dụng thông tin này để tạo các kích thích đầu vào.
  • cover dùng để giám sát sự ước lượng thuộc tính cho việc coverage.
  • restrict dùng để đặc tả thuộc tính ràng buộc sự tính toán kiểm tra forrmal. Trình mô phỏng không kiểm tra thuộc tính này.
Như vậy, các phát biểu sử dụng một trong bốn từ khóa trên gọi là một assertion.

Ví dụ 1:
module event_sim;
//
//Design example
//
reg in_a, in_b;
reg in_c;
wire f;
assign f = in_a & in_b | in_c;
//
//Create input stimulus
//
initial begin  in_a = 0;
  in_b = 0;
  in_c = 0;
  #2
  in_a = 1;
  #2
  in_b = 1;
end
reg clk = 0;
always #1 clk = !clk;
//
//Assertions
//
always @ (posedge clk) begin  assert_f: assert (f)
      $info("assert: PASSED");
    else $error("assert: FAIL");
  assume_inputs: assume (in_a || in_b)
      $info("assumption holds");
    else $error("assumption does not hold");
  cover_a_and_b: cover (in_a && in_b)
    $info("in_a=1 and in_b=1 are covered");
end
endmodule
Ví dụ 1 mô tả 3 assertion được kiểm tra tại mỗi cạnh lên của clock clk. Khi thực hiện mô phỏng động bằng trình mô phỏng (simulator):
  • assert_f sẽ được kiểm tra điều kiện f=1, nếu đúng sẽ báo “assert: PASSED”, nếu sai sẽ báo lỗi “assert: FAIL”. $info và $error là các task hệ thống được hỗ trợ bởi System Verilog để in thông tin cảnh báo theo cấp độ.
  • assume_inputs được kiểm tra điều kiện “in_a || in_b” và cảnh báo “assumption holds” nếu in_a hoặc in_b luôn bằng 1. Nguộc lại, nếu in_a=in_b=0 thì trình mô phỏng sẽ báo lỗi “assumption does not hold”
  • cover_a_and_b được sử dụng để giám sát trường hợp in_a=in_b=1 có xảy ra hay không. Nếu có xảy ra, ta nói trường hợp này được bao phủ (đã cover) và thông tin “in_a=1 and in_b=1 are covered” được trình mô phỏng in ra. Nếu không thì sẽ không có thông báo nào được in ra.
Khi thực hiện mô phỏng tĩnh bằng phần mềm kiểm tra formal, ví dụ như Incisive Formal Verifier (IFV) của Cadence, assert_f sẽ được kiểm tra điều kiện f=1 với ràng buộc giả định được mô tả trong assume_inputs, in_a và in_b không bao giờ cùng bằng 0. Phần mềm kiểm tra formal sử dụng giả định assume_inputs để tạo ra tất cả các tổ hợp giá trị cho in_a và in_b để kiểm tra assert_f nhưng sẽ không tạo ra tổ hợp in_a=in_b=0. cover_a_and_b dùng để phát hiện đã có trường hợp in_a=in_b=1 hay chưa. Khi sử dụng phần mềm kiểm tra formal, chúng ta không cần đoạn code initial để tạo các kích thích đầu vào cho in_a, in_b và in_c vì chúng sẽ được tạo tự động bởi phần mềm kiểm tra formal.
2) Kết quả chạy mô phỏng động với QuestaSim 
Sau khi biên dịch và chạy mô phỏng với QuestaSim trong 6ns, chúng ta có thể quan sát được các kết quả như sau: 
  • Waveform 
  • Report trên Transcript (command line của QuestaSim) 
  • Assertion report
  • Coverage assertion report
Hình 1: Waveform của ví dụ 1 trong 6ns
Vì các assertion được kiểm tra và giám sát tại các cạnh lên xung clock clk nên chúng ta sẽ chỉ phân tích kết quả tại các thời gian 1ns, 3ns và 5ns. 
  • Tại 1ns, in_a=in_b=0, assert_f và assume_inputs đều fail 
  • Tại 3ns, ina=1 và in_b=0, assert_f bị fail nhưng assume_inputs là pass 
  • Tại 5ns, in_a=in_b=1, assert_f và assume_inputs đều pass và trường hợp được giám sát bởi cover_a_and_b được bao phủ.
Các kết quả trên sẽ thể hiện trên command line hoặc terminal khi chạy mô phỏng.
Hình 2: Báo cáo (report) của các assertion
Chúng ta cũng có thể xem các báo cáo về assertion và coverage của assertion trên trình mô phỏng. Đối với Questa Sim, chúng ta có thể xem ở View/Coverage/Assertions và View/Coverage/Cover Directives.

Hình 3: Xem các báo cáo về assertion trên Questa Sim
So sánh với các cảnh báo trên cửa sổ transcript, chúng ta thấy số lần fail của assert_f là 2, của assume_inputs là 1 và trường hợp được giám sát bởi cover_a_and_b đã bao phủ 100%. Bên cạnh đó, chúng ta cũng có thể xuất ra file báo cáo các kết quả của assertion và assertion coverage bằng cách bấm chuột phải vào cửa sổ Assertions hoặc “Cover Directives” chọn report.
Hình 4: Xuất file báo cáo về assertion

2) Phân loại assertion 

Assertion được chia làm 2 loại chính là assertion trực tiếp (immediate assertion) và assertion đồng thời (concurrent assertion). 
Assertion trực tiếp đi theo ngữ cảnh của sự kiện mô phỏng. Assertion trực tiếp là các phát biểu thủ tục được sử dụng cho mô phỏng. Phát biểu restrict không được sử dụng cho assertion trực tiếp. Trong đó assertion trực tiếp được chia thành các loại sau: 
  • Assertion trực tiếp đơn giản (simple immediate assertion) chỉ dùng các từ khóa assert, assume cover để mô tả một assertion. Assertion này báo cáo trực tiếp khi có bất cứ thay đổi nào của biểu thức mà nó mô tả. 
  • Assertion trực tiếp bị trì hoãn (deferred immediate assertion) cũng được mô tả bằng các từ khóa assert, assume cover nhưng thêm mô tả về sự “trì hoãn” là #0 hoặc final với mục đích ngăn chặn các báo cáo sai của assertion trực tiếp khi xuất hiện các glitch. 
    • Assertion trực tiếp bị trì hoãn dùng để giám sát (deferred immediate assertion  assertion) là loại sử dụng #0, nó sẽ báo cáo kết quả “trễ” hơn chứ không báo cáo trực tiếp, trễ hơn ở đây không có nghĩa là là một khoảng thời gian trễ đo đếm cụ thể mà được hiểu là báo cáo khi giá trị ước lượng đã ổn định, tránh báo cáo sai khi xuất hiện glitch. Điều này có được vì việc thực thi báo cáo của assertion được thực thi trong vùng Reactive. 
    • Assertion trực tiếp bị trì hoãn final (final deferred immediate assertion) là loại chỉ báo cáo một lần tại vùng Postponed nên cũng giúp tránh được việc báo cáo sai do glitch xuấy hiện.
Assertion đồng thời dựa trên ngữ cảnh của clock và dùng các giá trị được lấy mẫu từ các biểu thức mà nó mô tả. Assertion đồng thời mô tả hành vi kéo dài theo thời gian. Không như assertion trực tiếp, mô hình ước lượng của assertion đồng thời dựa trên một clock. Nghĩa là assertion đồng thời chỉ được đánh giá khi xảy ra một clock tick. clock tick ở đây có thể hiểu là cạnh lên hoặc cạnh xuống của sự kiện clock được định nghĩa bởi người sử dụng. Assertion đồng thời sử dụng bốn phát biểu assert, assume, cover restrict kết hợp với hai từ khóa property sequence để mô tả.
Hình 5: Phân loại assertion trong SVA

Chủ Nhật, 27 tháng 5, 2018

[System Verilog] Kiểm tra formal - phần 2: Tổng quan về mô tả thuộc tính

Bài này trình bày tại sao cần phải có ngôn ngữ đặc tả formal, một số khái niệm, thuật ngữ liên quan đến ngôn ngữ mô tả formal SVA và một số ví dụ cơ bản để hiểu tổng quan về mô tả thuộc tính với SVA.
1) Tại sao cần có ngôn ngữ đặc tả formal
Ngôn ngữ đặc tả formal được sử dụng để mô tả thuộc tính thiết kế một cách chính xác và rõ ràng. Thông thường, các thuộc tính được mô tả trong một phần của spec thiết kế trong các văn bản như một file word, excel,... nhưng việc mô tả thuộc tính bằng ngôn ngữ tự nhiên là không rõ ràng vì không có quy định chung, không thống nhất và có thể hiểu theo nhiều cách khác nhau bởi nhiều người khác nhau. Bên cạnh đó, khi các kỹ sư thuộc các quốc gia khác nhau cùng làm việc với nhau, việc mô tả thuộc tính bằng ngôn ngữ tự nhiên, ví dụ như tiếng Anh, không đảm bảo tất cả các kỹ sư đều hiểu đúng một ý tưởng.
Ví dụ, giao thức request-grant thường được sử dụng như một cặp giao tiếp bắt tay. Khi một yêu cầu được phát ra trên tín hiệu request nó sẽ đợi được chấp nhận bởi tín hiệu grant.
Hình 1: Minh họa một giao thức bắt tay request-grant
Chúng ta xét một câu mô tả thuộc tính tiêu biểu như sau "mỗi request phải được chấp nhận trong 4 chu kỳ xung clock" (nguyên văn câu tiếng Anh "Each request should be granted in four clock cycles"). Mô tả này là không rõ ràng vì:
  • Bốn chu kỳ này bắt đầu được tính từ lúc nào? ngay từ khi request được phát hay từ chu kỳ kế tiếp sau khi request đã phát?
Hình 2: Thời điểm xác định grant là lúc nào?
  • Việc chấp nhận một request sẽ được phát trong suốt 4 chu kỳ hay trong chu kỳ thứ 4?
Hình 2: grant sẽ kéo dài suốt 4 chu kỳ hay chỉ trong chu kỳ thứ 4?
  • Nếu hai yêu cầu cùng xuất hiện, chúng sẽ được chấp nhận bởi cùng 1 grant hay hai grant khác nhau?
Hình 3: một grant sẽ xác nhận cho bao nhiêu request?
Nếu thuộc tính trên được mô tả bằng một ngôn ngữ mô tả formal, ví dụ như SVA, thì chỉ có một cách hiểu duy nhất và rõ ràng.
Ví dụ 1:
assert property( @( posedge clk ) request |-> ##4 grant ); 
Đây là một assertion đồng thời (concurrent assertion) được định nghĩa theo clock clk và thuộc tính sẽ được kiểm tra theo các sự kiện cạnh lên của clk. Nếu request=1 thì tại chu kỳ thứ 4 grant phải bằng "1". Sau đó, grant kéo dài bao nhiêu chu kỳ nữa thì không nằm trong phạm vi mô tả của thuộc tính này. Xem hình minh họa dưới đây.
Hình 4: Minh họa thuộc tính mong muốn của mô tả assertion
Bên cạnh đó, ngôn ngữ mô tả thuộc tính như SVA không chỉ được dịch và hiểu bởi các phần mềm kiểm tra, mô phỏng mà còn giúp các kỹ sư khác nhau cùng hiểu đúng một thuộc tính vì nó đã được chuẩn hóa.
2) Các cấp độ của mô tả formal
Như đã trình bày ở bài 1, kiểm tra formal định hướng theo đầu ra, mỗi mô tả formal sẽ định nghĩa "cái gì sẽ xảy ra?" và "xảy ra lúc nào?" chứ không định nghĩa hành vi đó "xảy ra như thế nào?", đây gọi là mô tả mức trừu tượng (abstract description). Xét lại ví dụ 1, assertion này không định nghĩ làm thế nào request=1 và làm thế nào grant=1 mà chỉ định nghĩa "tại cạnh lên clock clk, khi request=1 thì grant phải bằng 1 tại chu kỳ thứ 4 tính từ lúc bắt đầu phát hiện request=1".
Các mô tả trừu tượng sẽ được tập hợp thành các thuộc tính. Một nhóm các thuộc tính có thể là một mô hình hoàn chỉnh.
Hình 5: Các cấp độ mô tả formal
Trong SVA, các biểu thức logic cơ bản được tạo từ các toán tử boolean (&&, ||, !). Các biểu thức này kết nối với nhau theo thứ tự thời gian bằng các toán tử chuỗi (sequence operator) sẽ tạo thành các chuỗi tuần tự (sequence). Ở đây, các biểu thức cơ bản và các sequence là các mô tả trừu tượng. Các biểu thức logic hoặc các sequence sẽ dùng để xây dựng nên các thuộc tính bằng các toán tử thuộc tính (property operator) và từ khóa property. Các biểu thức logic, sequence và  thuộc tính sẽ dùng để xây dựng lên các chỉ dẫn (directive) với từ khóa như assert, cover và chúng còn được gọi là các assertion.
Các assertion tạo ra các khối dùng để xác thực hành vi của thiết kế. Trong nhiều trường hợp, để mô hình hoàn chỉnh việc xác minh một chức năng, chúng ta cần đóng gói nhiều assertion thành một khối lớn hơn. Các khối này còn có thể chứa thêm các code khác tính toán các giá trị trung gian hoặc các biến phụ để sử dụng cho assertion hoặc tích hợp thêm các covergroup. System Verilog hỗ trợ từ khóa checker/endchecker để thực hiện điều này. Mỗi checker còn được gọi là một đơn vị assertion (assertion unit).
Hình 6: Các cấp mô tả trong SVA
Xét lại ví dụ 1, request và grant là các biểu thức logic cơ bản được hiểu tương ứng là request=1 và grant=1. Chuỗi " request |-> ##4 grant" là một thuộc tính được hiểu là grant=1 sau 4 chu kỳ delay tính từ lúc request=1.
Cụm "property( @( posedge clk ) request |-> ##4 grant )" tạo thành một thuộc tính hoàn chỉnh và một thuộc tính này tạo thành một asertion (hay một chỉ dẫn) với từ khóa assert.
Hình 7: Ví dụ về các lớp mô tả của SVA
Sau đây là ví dụ về một đơn vị assertion (một checker):
Ví dụ 2:
checker my_check (logic a, b);
a1: assert #0 ($onehot0({a, b});
c1: cover #0 (a == 0 && b == 0);
c2: cover #0 (a == 1);
c3: cover #0 (b == 1);
endchecker : my_check
Trong ví dụ 2, đơn vị assertion my_check sẽ kiểm tra các hành vi sau của hai đầu vào a và b:

  • (a1) Kiểm tra tại một thời điểm chỉ có a =1 hoặc b = 1 hoặc a=b=0
  • (c1) Báo cáo kết quả coverage trường hợp a=b=0
  • (c2) Báo cáo kết quả coverage trường hợp a=1
  • (c3) báo cáo kết quả coverage trường hợp b=1

Thứ Bảy, 26 tháng 5, 2018

[Background] SoC - System on a Chip

Bài này cố gắng trình bày một cách hiểu chi tiết về khái niệm SoC và cấu trúc cơ bản của một SoC qua đó các đặc điểm ưu việt và bất lợi của SoC cũng sẽ được trình bày.
1) SoC nghĩa là gì?
Khái niệm SoC ngày nay đã trở nên phổ biến. SoC là từ viết tắt của System on a Chip hoặc System on Chip, được hiểu là toàn bộ "một hệ thống" được đóng gói hoàn chỉnh trong một chip (vi mạch điện tử). Một system thông thường là một hệ thống hoàn chỉnh thực hiện một hoặc nhiều chức năng nào đó, ví dụ như một máy tính cá nhân gồm một bo mạch chủ để kết nối các thành phần như CPU, USB, VGA, RS232,...
Hình 1: Minh họa một System (nguồn: http://www.ugurdag.com)
Một hệ thống như mô tả có nhược điểm là kích thước lớn và tiêu tốn nhiều năng lượng khi hoạt động trong khi nhu cầu về các thiết bị di động, thiết bị dùng PIN, tiết kiệm năng lượng, kích thước nhỏ gọn và giảm chi phí sản phẩm ngày càng tăng. Bên cạnh đó, nhu cầu về đa chức năng, nhiều tiện ích của khách hàng ngày càng cao. Một hệ thống truyền thống sử dụng các chip có khả năng tích hợp thấp, ít chức năng khó đáp ứng nhu cầu khách hàng và nếu đáp ứn được thì giá thành sản phẩm có thể cao do sử dụng nhiều linh kiện hơn, bo mạch phức tạp và lớn hơn, sản phẩn to hơn. Ví dụ, trước đây, điện thoại chỉ có chức năng nghe, gọi, nhắn tin; sau đó thêm chức năng lưu và phát nhạc; sau đó là chụp ảnh; sau đó là kết nối internet, chạy ứng dụng, chơi game; và hiện nay điện thoại không khác gì một máy tính nhỏ.
Hình 2: Nhu cầu về một sản phẩm đa chức năng tăng cao
Để đáp ứng nhu cầu ngày càng tăng về tiện ích của sản phẩm, một chip ngày càng tích hợp nhiều chức năng hơn và tạo ra khái niệm System on Chip. Ví dụ như chip SoC dưới đây tích hợp một lõi CPU ARM và các ngoại vi như SegLCD, UDB, SCB, UART, CAN, SPI, ...
Hình 3: Một chip SoC sử dụng lõi CPU ARM (nguồn: www.thegeniusworks.com)
Thực tế, không có tiêu chuẩn chính xác để đánh giá một chip như thế nào thì được xem là SoC nên có SoC chỉ tích hợp một vài ngoại vi,SoC khác thì tích hợp số lượng ngoại vi khổng lồ.
Hình 4: Chip R-Car E2 của Renesas tích hợp nhiều lõi CPU, Video, Audio, DSP, .... (nguồn: en.wikichip.org)
2) Ưu nhược điểm của SoC?
Ưu điểm của SoC:
  • Sử dụng cho các thiết bị điện tử cần kích thước nhỏ như điện thoại, tablet,...
  • SoC có mật độ tích hợp cao, nhiều chức năng nên việc làm phần cứng sản phẩm đơn giản hơn, dễ sản xuất hơn, chi phí thấp hơn, thời gian thiết kế sản phẩm nhanh hơn. Sản xuất số lượng đủ lớn, giá thành sẽ giảm đáng kể.
  • Sản phẩm sử dụng SoC tiết kiệm năng lượng hơn so với sản phẩm cùng chức năng nhưng không dùng SoC vì số lượng linh kiện lớn hơn, bo mạch làm phức tạp hơn. Khi sản phẩn càng nhiều chức năng thì đặc điểm này càng thấy rõ.

Nhược điểm của SoC: một nhược điểm của SoC là một loại SoC khó đáp ứng nhu cầu của nhiều loại sản phẩm khác nhau. Chính vì vậy, mỗi hãng thiết kế và sản xuất chip đều có nhiều dòng SoC khác nhau, mỗi dòng sẽ đáp ứng một phân khúc sản phẩm nhất định và tối ưu nhất cho phân khúc sản phẩm này. Tối ưu ở đây được hiểu là số lượng chức năng mà chip tích hợp là vừa đủ, không quá nhiều và cũng không quá ít. Quá nhiều chức năng thì giá chip sẽ tăng, giá sản phẩm tăng trong khi chức năng thừa không được dùng đến. Quá ít chức năng thì không đáp ứng được nhu cầu ứng dụng của sản phẩm hoặc làm sản phẩm khó, thời gian ra thị trường lâu.
Hình 5: Mỗi dòng chip SoC sẽ đáp ứng cho một phần khúc sản phẩm (nhu cầu ứng dụng) khác nhau (nguồn: www.renesas.com)
3) Cấu trúc phần cứng của một SoC?
Như đã trình bày, mỗi chip SoC có mật độ tích hợp chức năng khác nhau nhưng hầu hết các SoC đều có các thành phần cơ bản sau đây:
CPU (Central Processing Unit): Lõi vi xử lý là thành phần không thể thiếu trong một SoC làm nhiệm vụ quản lý toàn bộ hoạt động chính của một SoC. CPU đảm nhiệm luồng xử lý chính trong SoC, điều phối các hoạt động giữa các thành phần khác trong SoC, thực thi các tính toán chính. Một SoC có thể có một hoặc nhiều lõi CPU. Một số lõi CPU:
  • Lõi CPU ARM dùng tập lệnh ARM và là sản phẩm của hãng ARM
  • RISC-V là các lõi CPU phát triển trên tập lệnh mở và miễn phí RISC-V (riscv.org)
  • SH (SuperH) dùng tập lệnh RISC được triển bởi Hitachi và nay là sản phẩm của Renesas
Bus hệ thống (System BUS): Bus hệ thống là có nhiệm vụ kết nối thông suốt các thành phần chức năng khác nhau trong vi xử lý. Bus hệ thống giống như những con đường để vận chuyển dữ liệu giữa các thành phần trong SoC. Một số cấu trúc bus hệ thống:
  • AMBA (AXI, AHB, APB) là chuẩn bus phát triển bởi ARM
  • CoreConnect là chuẩn bus phát triển bởi IBM
  • Avalon là chuẩn bus phát triển bởi Altera, hiện nay đã thuộc Intel
  • STBus là chuẩn bus phát triển bởi STMicroelectronic
  • Wishbone là chuẩn bus phát triển bởi Silicore Corporation, hiện nay đã được công bố miễn phí trên OpenCores
Bộ nhớ (Memory): Bộ nhớ trong một SoC gọi là bộ nhớ nội để phân biệt với bộ nhớ nằm ngoài SoC và giao tiếp với SoC thông qua các chân (pin) điều khiển của SoC. Bộ nhớ nội này có thể là:
  • ROM: lưu cấu hình hoặc chương trình ban đầu của SoC
  • RAM: được sử dụng để lưu thông tin hoặc giá trị tính toán trong suốt quá trình hoạt động của SoC
Thành phần điều khiển nội (Internal block): là thành phần chỉ điều khiển hoạt động bên trong SoC mà không điều khiển trực tiếp port nào của SoC như:
  • Khối tạo clock (clock generator): Cung cấp clock cho toàn bộ các khối chức năng trong SoC, kể cả CPU
  • Khối tạo Reset (reset generator): Cung cấp reset cho toàn bộ các khối chức năng trong SoC, kể cả CPU
  • Khối quản lý năng lượng (power management): Điều khiển cấp nguồn (bật/tắt) cho các khối chức năng trong SoC
  • Các khối giám sát (Monitor) là các khối có chức năng giám sát hoạt động của SoC, kịp thời phát hiện ra các lỗi trong quá trình hoạt động để khởi động lại một phần hoặc toàn bộ hệ thống.
Ngoại vi (Peripheral): là các khối có thể lái trực tiếp các chân (pin hoặc port) của SoC để thực thi một chức năng điều khiển bên ngoài SoC, ví dụ như:
  • UART: truyền nhận dữ liệu nối tiếp bất đồng bộ
  • SegLCD: Điều khiển hiện thị trên segment LCD
  • Video: Điều khiển camera
  • Audio: Thu phát âm thanh
  • ADC: bộ chuyển đổi tín hiệu tương tự thành tín hiệu số
  • ....
Hình 6: Mô hình minh họa các thành phần cơ bản của một SoC
4) Làm sao để xây dựng một SoC
Chúng ta giả sử đã có tất cả các khối chức năng cần thiết như CPU, các ngoại vi, bus hệ thống, ... Để xây dựng một SoC, chúng ta cần làm các công việc cơ bản sau:
Hình 7: Các bước cơ bản để thiết kế một chip SoC
1) Phân tích cấu trúc SoC: phân tích cấu trúc SoC là trả lời một số cấu hỏi cơ bản sau đây:
  • Cấu trúc bus hệ thống của SoC như thế nào?
  • Khối chức năng này (CPU, ngoại vi,...) được kết nối đến bus nào?
Ở bước này, chúng ta cần xác định bus hệ thống sẽ bao gồm những bus nào và kết nối với nhau ra sao. Để xác định được cấu trúc bus hệ thống, căn cứ vào phạm vi ứng dụng các master và slave sẽ được lựa chọn. Các thông tin cơ bản về các master và slave sẽ có trong SoC sẽ được liệt kê:
  • Chức năng và phạm vi ứng dụng
  • Độ rộng đường dữ liệu và địa chỉ
  • Tần số hoạt động
Đầu tiên, căn cứ vào phạm vi ứng dụng mà SoC nhắm đến (ứng dụng hiển thị hình ảnh, phân tích dữ liệu, điều khiển tự động, ...) để phân nhóm các Master và slave theo mức độ ưu tiên khác nhau. Ví dụ, chúng ta cần xây dựng một SoC chuyên dùng cho lấy mẫu phân tích dữ liệu cảm biến thời gian thực thì nhóm ưu tiên số 1 phải là các các ngoại vi liên quan đến chức năng này như ADC (dùng để chuyển đổi tín hiệu tương tự từ các cảm biến sang tín hiệu số). Như vậy, nó cần được bố trí ở sao cho việc trao đổi dữ liệu từ ADC đến các master là nhanh nhất.
Căn cứ tiếp theo là dựa vào tốc độ xử lý hoặc tần số hoạt động của các master và slave. Các thành phần tốc độ cao cần được gắn vào các bus có tốc độ cao, các thành phần tốc độ thấp sẽ gắn vào bus tốc độ thấp tương ứng.
Căn cứ trên độ rộng bus dữ liệu để gắn master và slave đến bus có độ rộng bus dữ liệu phù hợp.
Sau khi kết thúc bước này, chúng ta sẽ có được cấu trúc SoC như hình 6 và mô tả về giao tiếp của các bus thể hiện tần số bus; số lượng master, slave; độ rộng đường dữ liệu,...
Hình 8: Cấu trúc của STM32L151x6/8/B hãng ST
Trong ví dụ hình 8, hệ thống gồm 1 bus AHB và 2 bus APB đều có tần số tối đa là 32 Mhz.
2) Phân tích chi tiết
Trong bước này, chúng ta cần phân tích rõ các vấn đề sau:
  • Một master có thể truy xuất đến những slave nào và qua những bus nào?
  • Một slave có thể được truy xuất bởi những master nào và thông qua những bus nào?
  • Vùng địa chỉ của mỗi slave là bao nhiêu? từ địa chỉ nào đến địa chỉ nào?
Hình 9: Ví dụ về phân vùng địa chỉ cho mỗi slave trong hệ thống SoC
3) Kết nối hệ thống
Thực hiện kết nối các master, slave đến các bus như đã phân tích.
4) Kiểm tra kết nối
Thực hiện kiểm tra lỗi cú pháp bằng các phần mềm chuyên dụng như Leda, Spyglass để đảm bảo các kết nối là đúng. Nếu việc kết nối này được thưng hiện thông qua một phần mềm chuyên dụng để xây dựng SoC thì các kết nối thường đã được kiểm tra và cảnh báo trong quá trình xây dựng SoC.
5) Kiểm tra chức năng
Thực hiện mô phỏng mức hệ thống để đảm bảo tất cả các master đều có thể truy cập đến các slave của nó trong vùng địa chỉ đã quy định. Nếu truy cập ngoài vùng địa chỉ quy định thì hệ thống vẫn hoạt động thông suốt nhưng sẽ có cơ chế cảnh báo.
Chú ý, bước này không phải là mô phỏng chức năng các thành phần trong hệ thống như kiểm tra chức năng khối video, khối UART hay bất kỳ khối nào khác mà chỉ kiểm tra tính thông suốt của hệ thống SoC đã xây dựng.
6) Kiểm tra hiệu năng
Thực hiện mô phỏng kiểm tra để đảm bảo băng thông truy xuất của các master đến các slave hoặc bộ nhớ đáp ứng yêu cầu đặt ra. Việc truy xuất của các master, nhất là các master được ưu tiên phải đảm bảo được hoàn thành trong một khoảng thời gian cho phép. Nếu không đạt được thì SoC sẽ không đáp ứng được hiệu năng mong muốn. Ví dụ, master DSP luôn phải được đảm bảo một băng thông đọc bộ nhớ là 10 Mbps (đây chỉ là ví dụ minh họa, không có ý nghĩa áp dụng thực tế) để kịp tính toán và đưa ra kết quả kịp thời thì dù cho toàn bộ các master trong SoC đang truy xuất đến bộ nhớ thì hệ thống SoC vẫn phải đảm bảo bằng thông 10 Mbps cho master DSP.