• 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, 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.

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

[System Verilog] Kiểm tra formal - phần 1: Các phương pháp kiểm tra thiết kế

Đây là bài thứ nhất trong loạt bài trao đổi về phương pháp kiểm tra formal (formal verification) sử dụng System Verilog. Trước khi đi sâu về việc làm thế nào sử dụng System Verilog để kiểm tra formal. Bài này trình bày tổng quan về các phương pháp kiểm tra (xác minh) tính đúng đắn của một thiết kế để bạn đọc có thể hình dung cơ bản về vài trò của các phương pháp và phạm vi áp dụng trong một quy trình thiết kế vi mạch.
1) Các phương pháp kiểm tra (xác minh) thiết kế
Việc kiểm tra thiết kế được chia thành 3 nhóm phương pháp:
  1. Kiểm tra dựa trên mô phỏng (simulation-based verification), gọi tắt là mô phỏng
  2. Kiểm tra formal (formal verification)
  3. Kiểm tra bán formal (semi-formal verification)
Chú ý, ban đầu bài viết dịch từ "formal" là "hình thức" nhưng tác giả cảm thấy không thể hiện được bản chất của phương pháp này nên chuyển qua từ "thuộc tính". Tuy nhiên, phương pháp này lại được chia thành 2 nhóm nhỏ là kiểm tra tương đương và kiểm tra thuộc tính (property) nên tác giả quyết định giữ nguyên từ formal để tranh gây hiểu lầm.
Để phân biệt các phương pháp này, chúng ta căn cứ vào các đặc điểm sau:
  1. Mô phỏng dựa trên các vector, phương pháp này cần Stimulus để cung cấp các vector (giá trị) đầu vào và cần có một tập các vector (giá trị) đầu ra để so sánh, kiểm tra so với kết quả của thiết kế. Kiểm tra formal  không dựa trên các vector.
  2. Mô phỏng định hướng theo đầu vào (input) vì người kiểm tra sẽ cung cấp các giá trị đầu vào mong muốn để tạo ra trường hợp cần kiểm tra. Trong khi đó, kiểm tra formal định hướng theo đầu ra, người thiết kế sẽ cung cấp các thuộc tính của các đầu ra để kiểm tra. Chú ý, kiểm tra formal sẽ kiểm tra thuộc tính đầu ra chứ không phải kiểm tra giá trị đầu ra.
  3. Kiểm tra bán formal là một phương pháp kết hợp giữa mô phỏng và kiểm tra formal. Nó vừa dựa trên các vector đầu vào vừa thực hiện kiểm tra thuộc tính lân cận các vector.
2) Mô phỏng
Phương pháp mô phỏng đặt thiết kế trong một testbench, thiết kế lúc này gọi là DUT (Design Under Test). Các kích thích ngõ vào (các test vector) được đưa đến testbench. Ngõ ra thiết kế được so sánh với các giá trị ngõ ra tham khảo.
Hình 1: Phương pháp kiểm tra dựa trên mô phỏng
Phạm vi áp dụng:
  • Mức RTL code
  • Mức gate netlist sau tổng hợp
  • Mức Layout sau layout
Phần mềm sử dụng: là các trình mô phỏng (simulator)
  • Incisive Enterprise Simulator - Cadence
  • ModelSim and Questa - Mentor Graphic
  • VCS - Synopsys
Ưu điểm:
  • Kiểm tra được các chức năng và hoạt động như thực tế vì các test vector dựa theo các trường hợp sử dụng thực tế của thiết kế.
  • Các phần mềm mô phỏng thường trực quan và dễ debug
Nhược điểm:
  • Số lượng test vector là có giới hạn và được tạo theo những kịch bản (mục đích) kiểm tra nhất định. Ở điểm này, tuy ngôn ngữ mô phỏng như System Verilog có hỗ trợ tạo các test vector ngẫu nhiên nhưng người kiểm tra vẫn phải ràng buộc (constraint) để giá trị ngẫu nhiên nằm trong phạm vi sử dụng thực tế.
  • Thời gian để kiểm tra toàn bộ thiết kế có thể lâu hơn (tốc độ coverage).
Hình 2: Phạm vi áp dụng phương pháp mô phỏng
3) Kiểm tra formal
Khác với mô phỏng, kiểm tra formal không yêu cầu tạo ra các test vector. Nó có thể được chia làm hai loại là:
  • Kiểm tra tương đương (equivalence checking)
  • Kiểm tra thuộc tính (property verification)
3.1) Kiểm tra tương đương
Kiểm tra tương đương là xác định xem giữa hai mô hình có tương đương về chức năng hay không, ví dụ như giữa thiết kế và một mô hình tham khảo. Kiểm tra tương đương không thể thực hiện với phương pháp mô phỏng với trình mô phỏng thông thường vì số lượng test vector cần đến là quá lớn. Nếu dùng phương pháp mô phỏng để kiểm tra tương đương chúng ta cần có số lượng test vector bao phủ toàn bộ các tổ hợp giá trị có thể của ngõ vào, ví dụ số bit ngõ vào là 32 bit thì số lượng test vector cần là (2^32 - 1) = 4.294.967.295, hơn 4 tỷ.
Kiểm tra tương đương được thực hiện với các phần mềm chuyên dụng. Việc kiểm tra tương đương được thực hiện dựa trên hai phương pháp.
Phương pháp thứ nhất, các phần mềm sẽ dựa trên thiết lập (cấu hình) của người dùng để giới hạn phạm vi ngõ vào, tự động tạo ra các test vector phù hợp để xác định sự tương đương của 2 mạch. phương pháp này cũng giống như mô phỏng, cung cấp các vector đầu vào để kiểm tra và cùng đối mặt với vấn đề số lượng vector quá nhiều khi số ngõ vào lớn nhưng thông qua phần mềm các vector được tạo tự động có giới hạn đủ để phân kiểm tra 2 mạch.
Phương pháp thứ hai, 2 mạch cùng được biến đổi về một dạng tiêu chuẩn chứa các thuộc tích đặc trưng để so sánh, ví dụ như "Sơ đồ quyết định nhị phân theo thứ tự tối giản" (Reduced Ordered Binary Decision Diagram).
Hình 3: Phương pháp kiểm tra tương đương
Phạm vi áp dụng:
  • RTL và Gate netlist
  • Gate netlist trước và sau khi chèn các mạch DFT
  • Gate netlist trước và sau Place&Route
Phần mềm sử dụng:
  • Formality - Synopsys
  • Conformal - Cadence
  • JasperGold - Cadence
  • Formal Pro - Mentor Graphic
Hình 4: Phạm vi kiểm tra tương đương
Chú ý, kiểm tra tương đương sẽ không phải là mục tiêu phân tích của loạt bài này, mục tiêu chính của loạt bài này là về kiểm tra thuộc tính trong phương pháp kiểm tra formal.
3.2) Kiểm tra thuộc tính
Kiểm tra thuộc tính là kiểm tra hoạt động, hành vi của thiết kế có phù hợp với thuộc tính đã được quy định trong spec hay không. Một thuộc tính là một phần của spec, nó là một hành vi, đặc điểm mà thiết kế được yêu cầu phải có. Một thiết kế có nhiều thuộc tính khác nhau, các thuộc tính này có thể được mô hình hóa bằng ngôn ngữ kiểm tra như System Verilog. Các mô hình dùng để kiểm tra này có thể được gọi là các "model checker".
Hình 5: Phương pháp kiểm tra thuộc tính
Việc mô tả một thuộc tính giống như việc mô tả một chức năng thiết kế nhưng theo một cách khác. Ví dụ, chức năng của thiết kế được mô tả bằng Verilog khả tổng hợp còn thuộc tính tương ứng được mô tả bằng System Verilog Assertion. Ví dụ, chúng ta có spec sau đây: 
Hình 6: Yêu cầu của spec
Chức năng trên được mô tả trong thiết kế như sau:
always @ (posedge clk) begin
  if (rst) syn0 <= 1'b0;
  else     syn0 <= ctrl;
end
Một thuộc tính của chức năng này là nếu tín hiệu reset rst=0 và ctrl=1 thì syn0 sẽ bằng 1 ở chu kỳ sau. Thuộc tính này được mô hình như sau:
chk_syn0: assert property (@ (posedge clk) (~rst & ~syn0 & ctrl) |-> ##1 syn0)
  else  $display("[%d] Assertion FAIL", $time);
Trong quá trình kiểm tra nếu thiết kế không đảm bảo thuộc tính này "Assertion FAIL" sẽ được hiển thị.
4) So sánh giữa mô phỏng và kiểm tra formal
Một vector mô phỏng được xem như một điểm của không gian đầu vào (input space). Không gian đầu vào được hiểu là tập chưa toàn bộ các giá trị ngõ vào có thể có của thiết kế. Việc mô phỏng là lấy mẫu không gian đầu vào nên thiết kế chỉ đảm bảo không tồn tại lỗi nếu tất cả các điểm đầu vào đều được lấy mẫu. Khác với mô phỏng, kiểm tra formal làm việc ở mức thuộc tính. Với một thuộc tính, việc kiểm tra thực hiện trên tất cả các điều kiện ngõ vào có thể.
Nếu nhìn ở đầu ra, mô phỏng kiểm tra chỉ kiểm tra một điểm ngõ ra tại mỗi thời điểm. Trong khi đó, kiểm tra formal là kiểm tra thuộc tính mà một thuộc tính có thể là một nhóm điểm ngõ ra.
Hình 7: Minh họa không gian đầu ra của mô phỏng (trái) và kiểm tra formal (phải)
Có thể thấy, sử dụng kiểm tra formal có thể giúp chúng ta xác minh được toàn bộ thiết kế nhanh hơn mô phỏng. Tuy nhiên để đảm bảo toàn bộ thiết kế đã được kiểm tra thì tập các thuộc tính phải được xây dựng đầy đủ.
Một điểm bất lợi chính của phần mềm kiểm tra formal là tốn nhiều dung lượng bộ nhớ khi thực thi. Bên cạnh đó, do tính chát kiểm tra thuộc tính (nhóm điểm) nên phần mềm có thể ít trực quan và khó sử dụng.