Thứ Sáu, 15 tháng 2, 2019

[Perl][Thiết kế lõi IP bằng script] Bài 1 - Quy trình thiết kế lõi IP bằng script

"Thiết kế lõi IP bằng script" là một thuật ngữ nói về việc tạo ra một lõi IP (RTL code) bằng một công cụ (tool) viết bằng ngôn ngữ script. Ngôn ngữ script được sử dụng trong loạt bài viết này là PERL, một trong những ngôn ngữ script mạnh và sử dụng phổ biến. Nội dung chính của bài này sẽ giải thích các khái niệm và các bước cơ bản để các bạn hiểu "thiết kế lõi IP bằng script" .
Bài viết này không trình bày về cú pháp PERL. Nếu bạn chưa biết về PERL thì hãy tìm và download cuốn "Teach Yourself Perl in 21 Days" (miễn phí và dễ download trong 1 nốt nhạc) để tra cứu các từ khóa và câu lệnh khi cần thiết.

Chú ý một số thuật ngữ sử dụng trong bài viết này:
  1. Thuật ngữ "một thiết kế" và "lõi IP" được dùng tương đương nhau và thay thế cho nhau.
  2. Thuật ngữ "hệ thống" (system) được hiểu là một chip hoặc một SoC mà các lõi IP được tích hợp bên trong.
  3. "RTL code" trong bài viết này là file Verilog.
1) Script là gì?
Script là thuật ngữ chỉ một công cụ (tool) chứa một danh sách các lệnh (instruction), là các từ khóa được cung cấp bởi một ngôn ngữ script, sẽ được thục thi bởi một trình thông dịch (interpreter) script tương ứng.
Công cụ (tool) là một hoặc nhiều file text với phần mở rộng của file tuân theo quy định của ngôn ngữ script, ví dụ như Perl là ".pl" hoặc ".pm".
Ngôn ngữ script có thể là Perl, Python, JavaScript, PHP, Tcl, VBScript, Unix Shell Script (csh, sh, bash, ...), ...
Trình thông dịch (interpreter) là một chương trình phần mềm đọc, phân tích và thực thi trực tiếp các lệnh viết trong file script. Nó khác với trình biên dịch (compiler), trình biên dịch sẽ dịch file chứa các lệnh thành một file thực thi và các lệnh được thực thi thông qua file trung gian này.
2) Cài đặt trình thông dịch cho Perl?
Để thực hành bạn hãy chuẩn bị một hệ điều hành và cài đặt trình thông dịch PERL (Practical Extraction and Report Language). Cài này bạn có thể dễ dàng tìm trên google. Nếu bạn là người mới, bạn hãy cố gắng tự cài  đặt và chạy một script Perl đầu tiên trước khi tiếp tục đọc loạt bài này. Hãy tham khảo một số linhk sau đây để cài đặt:
  1. https://www.tutorialspoint.com/perl/perl_environment.htm
  2. https://vinasupport.com/cai-dat-va-nang-cap-perl-tren-he-dieu-hanh-linux-unix/
Trong loạt bài viết này, tác giả sử dụng môi trường có thông số như sau:
  1. Hệ điều hành: Centos 6.4 64-bit
  2. Phiên bản trình thông dịch Perl: v5.10.1 (*) built for x86_64-linux-thread-multi (dùng lệnh "perl -v" để kiểm tra phiên bản trình thông dịch của bạn)
  3. Thông số khác:
    1. Phần mềm máy ảo VMware® Workstation 12 Pro - version 12.5.9 build-7535481
    2. Cấu hình phần cứng: CPU - 4 core, RAM - 2GB 
3) Tại sao cần có script tạo ra lõi IP?
Việc dùng script để tạo ra lõi IP dựa trên một số nhu cầu thực tế như sau:
  1. Lõi  IP được tái sử dụng nhiều lần trong nhiều dự án khác nhau nhưng cấu trúc cơ bản không đổi mà chỉ thay đổi về số lượng các thành phần (số lượng instance, số lượng port, số lượng bit của các port, số lượng các mạch logic, ...) bên trong lõi IP.
  2. Số lượng các thông số cấu hình (`define, parameter) cho một lõi IP nhiều và nằm nhiều vị trí khác nhau trong RTL code. Các thông số cấu hình này có thể nằm ở nhiều vị trí khác nhau trong một file code hoặc ở nhiều file code khác nhau. Điều này làm cho việc điều chỉnh các thông số không "tập trung" ở một file, khó kiểm soát, mất thời gian và dễ phát sinh lỗi.
  3. Để tạo ra một lõi IP "linh động" có thể sử dụng trong nhiều trường hợp khác nhau, các chỉ dẫn như `include, `ifdef, `ifndef hay generate được sử dụng với những cách mô tả phức tạp làm RTL code trở nên khó đọc, khó debug (gỡ lỗi).
Hình 1: Minh họa một lõi IP có thể dùng script để tạo ra RTL code đáp ứng yêu cầu của các hệ thống khác nhau
Trong hình trên, lõi IP có cấu trúc cố định gồm nhiều nhóm logic là group 0, group 1, ..., group n. Mỗi nhóm logic này có cấu trúc cơ bản tương đương nhau, gồm 3 thành phần là khối Interface, Logic và Driver. Đối với mỗi hệ thống, lõi IP này chỉ thay đổi ở các điểm sau:
  1. Số lượng group
  2. Số lượng khối Interface trong mỗi group
  3. Số lượng nhóm tín hiệu giữa khối Interface và Logic
  4. Số lượng port giao tiếp của khối Driver
Với các phân tích trên, RTL code của lõi IP có thể được tạo ra bằng một script.
4) Làm thế nào để tạo ra một lõi IP bằng script?
Trước khi đi vào quy trình thiết kế chi tiết một lõi IP bằng script. Chúng ta cần hiểu "một lõi IP được tạo ra từ script bằng cách nào?"
Hình 2: Cách tạo một lõi IP bằng script
Các thành phần được sử dụng để tạo ra một lõi IP bằng script gồm:
  1. SCRIPT: là một hoặc nhiều file viết bằng ngôn ngữ script, trong loạt bài này là Perl, có nhiệm vụ thu thập các thông tin đầu vào được người thiết cung cấp, phân tích các thông tin đầu vào và tạo ra các file RTL code và các file thông tin khác nếu có.
  2. User Input: Là một hoặc nhiều file mà người thiết kế lõi IP cần cung cấp cho SCRIPT đọc và hiểu để tạo ra được RTL mong muốn. File này chứa các từ khóa, giá trị và cú pháp theo một quy ước xác định mà SCRIPT có thể đọc và hiểu. Nó có thể là bất kỳ định dạng nào như một file text (.txt), file excel, file html, ... tùy vào sự hỗ trợ của SCRIPT. Chú ý, User Input càng ít và càng đơn giản càng tốt. Tuy nhiên, User Input đơn giản có thể làm cho việc xây dựng SCRIPT phức tạp hơn nên các bạn hãy cân bằng hai yếu tố này trước khi thực hiện.
  3. Library: Là một hoặc nhiều thư viện mà SCRIPT cần sử dụng trong quá trình thực thi. Các thư viện này có thể là:
    1. Thư viện ngôn ngữ script, như thư viện Perl, chứa các file script đã được viết sẵn để thực hiện các chức năng khác nhau. Ví dụ như thư viện chứa các hàm hỗ trợ phân tích file HTML, EXCEL, ...
    2. Thư viện RTL code, như thư viện Verilog, chứa các file RTL code có nội dung cố định, hoặc ít thay đổi. Ví dụ như RTL code của khối Interface trong hình 1.
    3. Thư viện khác: vó dụ như thư viện chứa các từ khóa cố định, giá trị cố định, khoảng giới hạn giá trị cho các biến, ... mà SCRIPT sẽ sử dụng để kiểm tra.
  4. OUTPUT: Là một hoặc nhiều file được tạo ra từ SCRIPT khi nó thực thi
    1. RTL code: là code của lõi IP (Verilog hoặc VHDL), trong loạt bài này RTL code viết bằng Verilog HDL.
    2. Information files: là các file cung cấp các thông tin liên quan đến quá trình tạo ra RTL code hoặc thông tin về lõi IP được tạo ra. Các file này có thể có hoặc không và mức độ chi tiết tùy vào nhu cầu sử dụng. Các file này có thể là:
      1. Log file: ghi nhận các thông tin về quá trình SCRIPT thực thi, cảnh báo các lỗi hay các chú ý đối với RTL code đã được tạo.
      2. File trung gian: SCRIPT có thể chạy nhiều bước khác nhau, mỗi bước có thể tạo ra các file trung gian để sử dụng cho bước tiếp theo.
      3. File specification của lõi IP: file mô tả chi tiết các thông số, cấu trúc của lõi IP được tạo ra.
5) Người thiết kế và người sử dụng SCRIPT
Trong loạt bài này, tác giả sẽ sử dụng hai thuật ngữ "người thiết kế" và "người sử dụng" với ý nghĩa như sau:
  1. "Người thiết kế" là người tạo ra toàn bộ các thành phần cơ bản để "người sử dụng" có thể tạo ra một lõi IP mong muốn từ SCRIPT. Như vậy, "người thiết kế" sẽ tạo ra các thành phần SCRIPT, thư viện, User Input mẫu và hướng dẫn sử dụng cho SCRIPT để cung cấp cho "người sử dụng". Các thành phần này được gọi là "tool".
  2. "Người sử dụng" là người dùng tool được cung cấp từ "người thiết kế" để tạo ra RTL code của lõi IP. Người sử dụng chỉ cần tạo ra User Input ứng với yêu cầu hệ thống và thực thi SCRIPT để lấy RTL code mong muốn.
Dưới góc nhìn hệ thống, "người sử dụng" là "người thiết kế lõi IP của hệ thống" sử dụng TOOL. Để tránh hiểu nhầm hoặc khó hiểu về "người thiết kế TOOL" và "người thiết kế lõi IP của hệ thống". Bài viết này chỉ dùng thuật ngữ "người thiết kế" với ý nghĩa là "người thiết kế TOOL" và "người sử dụng" với ý nghĩa "người thiết kế lõi IP của hệ thống".
Hình 3: Các thành phần cơ bản của TOOL là User Input mẫu, SCRIPT, thư viện và hướng dẫn sử dụng
6) Quy trình thiết kế lõi IP bằng script?
6.1) Tổng quan
Quy trình thiết kế này dành cho "người thiết kế". Quy trình sẽ mô tả cách thức tạo ra một TOOL. Quy trình gồm 3 bước cơ bản:
  1. Phân tích tool: Nhiệm vụ chính là tạo ra một bản mô tả càng chi tiết càng tốt về đặc điểm, chức năng, cấu trúc tổng quan của tool và các thành phần của tool.
  2. Xây dựng tool: Tạo ra các thành phần của tool.
  3. Kiểm tra tool: Kiểm tra tất cả các chức năng của tool

Hình 4: Quy trình cơ bản tạo ra một tool
6.2) Phân tích tool
Phân tích tool gồm các bước cơ bản sau:
  1. Phân tích cấu trúc lõi IP
  2. Phân tích tổng quan tool
  3. Phân tích chi tiết tool
Phân tích cấu trúc lõi IP gồm các bước sau:
  1. Nghiên cứu vấn đề thuộc bước 1 của quy trình thiết kế lõi IP trong bài viết hướng dẫn về quy trình này.
  2. Phân tích tổng quan thuộc bước 2 của quy trình thiết kế lõi IP trong bài viết hướng dẫn về quy trình này.
  3. Phân tích phạm vi ảnh hưởng của SCRIPT đến cấu trúc lõi IP:
    • Chỉ rõ phần nào của lõi IP là "phần cố định" (không thay đổi hoặc ít thay đổi trong các hệ thống và người sử dụng không thể thay đổi) và phần nào là "phần biến đổi" (thay đổi thường xuyên tùy hệ thống và người sử dụng có thể cấu hình)
    • Phần cố định sẽ thuộc về thư viện của tool. Nó là những file code có nội dung cố định sẽ được SCRIPT đọc và đưa vào RTL code của lõi IP.
    • Phần biến đổi sẽ thuộc về thư viện của tool hoặc SCRIPT.
      • Nếu nó thuộc về thư viện, nó sẽ là file chữa những mẫu cấu trúc cố định có chứa các từ khóa cố định mà SCRIPT sẽ đọc và thay thế các từ khóa này bằng các cấu hình của người sử dụng để tạo ra các đoạn RTL code mong muốn
      • Nếu nó thuộc về SCRIPT, nó là dòng code Perl in trực tiếp ra đoạn RTL code mong muốn theo cấu hình người dử dụng.
  4. Kết quả: Tạo được một file mô tả rõ cấu trúc tổng quan lõi IP trong đó chỉ rõ phần cố định và phần biến đổi
Phân tích tổng quan tool gồm các công việc sau:
  1. Xác định số lượng thư mục, số lượng file sẽ tạo ra và vị trí lưu trữ các thư mục/file. Mô tả chức năng,vai trò của các thư mục/file.
  2. Xây dựng các bước hoạt động cơ bản (các bước hoạt động trung gian) của SCRIPT. Xác định chức năng của mỗi bước hoạt động. Xác định input và output của mỗi bước.
  3. Xác định vị trí rõ phần biến đổi nào thuộc SCRIPT, phần biến đổi nào thuộc thư viện.
  4. Kết quả: Tạo được một file mô tả tổng quan các thành phần của tool và cấu trúc tool
Phân tích chi tiết tool gồm các công việc cơ bản sau:
  1. Phân tích cấu trúc của User input và các input trung gian. Input trung gian là các thành phần được sử dụng trong các bước hoạt động của SCRIPT
  2. Phân tích cấu trúc của các file OUTPUT và các file output trung gian.
  3. Phân tích cấu trúc các file thư viện: thực hiện bước phân tích tổng quan cho từng file như mô tả trong bài viết về thiết kế lõi IP.
  4. Phân tích các bước hoạt động của SCRIPT đã nêu ra ở bước "phân tích tổng quan tool". Xác định rõ cách thức thực hiện chức năng của mỗi bước.
  5. Kết quả: Tạo được một file mô tả cách thức xây dựng các thành phần của tool.

Hình 5: Quy trình thiết kế TOOL để tạo ra lõi IP
6.3) Xây dựng tool
Việc xây dựng tool thực hiện các công việc sau:
  1. Viết SCRIPT: trong loạt bài viết này, là thực hiện tạo các file Perl (.pm hoặc .pl)
  2. Tạo thư viện: trong loạt bài viết này, là thực hiện tạo file text (.txt), file RTL code (.v) hoặc file script (.pm hoặc .pl)
  3. Tạo User Input mẫu: trong loạt bài viết này, là thực tạo file excel (.xls hoặc .xlsx)
Khi bước phân tích tool đã được làm cẩn thận và chi tiết thì các bước xây dựng tool có thể được làm độc lập và song song bởi nhiều người khác nhau. Nếu chỉ một mình bạn thực hiện tool thì bạn nên làm theo thứ tự trên vì bước thực hiện trước thường có thể gây thay đổi lớn đến các bước sau. Ví dụ, SCRIPT lấy hai dữ liệu đầu vào là thư viện và User Input. Bạn nên viết SCRIPT trước vì trong quá trình viết, bạn có thể phát hiện một cách lập trình khác giúp tối ưu, đơn giản hơn. Điều này có thể phải thay đổi cấu trúc các file thư viện hoặc User Input.
Đặc biệt, nếu file thư viện là một file RTL code hoàn chỉnh (một module hoàn chỉnh) thì bạn phải thực hiện đầy đủ các bước như thiết kế 1 lõi IP độc lập đã mô tả trong bài viết về lõi IP.
6.4) Kiểm tra tool
Bước kiểm tra tool gồm các bước cơ bản:
  1. Kiểm tra SCRIPT:
    • Tạo các mẫu User input định nghĩa các trường hợp cấu hình khác nhau
    • Sử dụng SCRIPT để tạo ra OUTPUT
    • Kiểm tra để đảm bảo không vi phạm cú pháp Perl
    • Kiểm tra để đảm bảo các trường hợp OUTPUT được tạo ra như mong muốn
  2. Kiểm tra cú pháp OUTPUT
    • Đối với RTL code, dùng phần mềm chuyên dụng để kiểm tra cú pháp như Leda, Spyglass (Synopsys), 
    • Đối với các file khác, kiểm tra cấu trúc, tổ chức nội dung file có đúng và đủ như mong muốn hay không.
  3. Kiểm tra chức năng OUTPUT (chỉ áp dụng với RTL code)
    • Thực hiện kiểm tra bằng formal hoặc mô phỏng chức năng bằng phần mềm chuyên dụng như JasperGold, INCISIVE, Xcelium (Cadence), VC Formal,VCS (Synopsys), ModelSim/QuestaSim (Mentor Graphic), ...
7) Nhận xét

Quy trình thiết kế lõi IP bằng SCRIPT tích hợp quy trình thiết kễ lõi IP thông thường. Trong đó, nhưng thành phần RTL code của tool vẫn áp dụng quy trình thiết kế lõi IP thông thường.
Quy trình thiết kế lõi IP bằng SCRIPT mở rộng hơn quy trình thiết kế lõi IP thông thường nên sẽ mất nhiều thời gian để thực hiện trong lần đầu tiên thiết kế. Tuy nhiên, thời gian tái sử dụng, bắt đầu từ lần tạo lõi IP thứ 2 trở đi, rất ngắn vì vì chỉ cần tạo User Input là tạo được RTL code mong muốn. Đặc biệt đối với các IP cần tạo số lượng lớn trong hệ thống.

Ví dụ cụ thể để minh họa các bước thực hiện sẽ có trong những bài kế tiếp. Nếu bạn đọc có ý kiến đóng góp xin comment dưới bài viết hoặc gửi về email nguyenquan.icd@gmail.com

1 bình luận: