Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
Theo mình được biết thì trong quá trình thiết kế số sau quá trình Specification là quá trình Achitecture Design, rồi đến Logic DeSign, Circuit Design, Phisical Design.
Theo mình thì khi viết code xong sẽ có một số công đoạn như sau:
[1] Mô phỏng kiểm tra code ở mức RTL (đúng về logic)
Thông thường để cho khách quan thì sẽ có một đội riêng biệt làm việc này gọi là Verification Team. Ở mức thiết kế concept thông thường các kỹ sư cũng định nghĩa luôn các testcases cần có khi design (có thể gọi là test plan). Đội kiểm tra sẽ dựa vào test plan này để design test bench. Ví dụ mô phỏng kiểm tra ở mức top-level của một MCU 32-bit đã có khoảng ~400 testcases, Tuy nhiên vì là mô phỏng logic nên thời gian chạy cho mỗi trường hợp là rất nhanh (~ vài phút - vài chục phút). Nói thế không có nghĩa là người viết code không phải chạy mô phỏng mà người viết code vẫn phải tự thiết kế test bench cho riêng thiết kế của mình để đảm bảo bản thiết kế RTL là clean và đã đúng chức năng, thông số code coverage đạt ~100%, . . .
[2] Pre-layout synthesis và phân tích timing
Ở bước này, người kỹ sư sẽ phải viết các constrain cho mạch điện để công cụ Compiler có thể dùng các thư viện linh kiện từ nhà sản xuất tổng hợp ra pre-layout netlist của mạch điện (thường là verilog netlist)
Tiếp đó là kiểm tra equivalence giữa netlist và code RTL.
Sau đó là insert scan cho các Flip-Flop (tham khảo thêm DFT_Design For Test)
Cuối cùng là chạy kiểm tra equivalence giữa bản netlist có insert scan và bản netlist trước đó để đảm bảo vẫn đúng về mặt logic.
Và với bản netlist này, bạn có thể chạy STA (phân tích timing) để phát hiện sớm các big timing violation, vì các thư viện linh kiện chuẩn đều đã bao gồm các thông số về timing của linh kiện.
[3] Tới đây có thể dùng bản netlist này để layout
Ở bước này vì thông thường là auto layout nên kỹ năng viết script, sử dụng công cụ là rất cần thiết.
Kết quả bước này là một bản netlist hoàn chỉnh (gate netlist)
[4] Kiểm tra equivalence giữa gate netlist và pre-layout netlist.
Mục đích chủ yếu là đảm bảo bản gate netlist vẫn đúng về mặt logic như yêu cầu thiết kế.
[5] Kiểm tra timing và estimate power
Ở bản netlist này đã có đầy đủ thông số về điện trở cũng như tụ điện ký sinh của bản layout mạch điện.
Khi timing clean thì ta có thể có thêm file mô tả các thông số ký sinh (sdf file) bao gồm cả các thông số phụ thuộc vào công nghệ, điện áp hoạt động, nhiệt độ, . . . . sdf file sẽ được dùng để mô phỏng cùng với gate netlist.
[6] Cuối cùng là bước ATPG_Tạo ra các data dùng cho việc test chip sau khi silicon out.
Ở đây thông số test coverage là rất quan trọng, thông thường yêu cầu đạt từ 95% trở lên
Các bước Verification, Synthesis, Layout, Equivalence check, STA, ATPG nên được tổng hợp thành các bài viết riêng vì có rất nhiều khía cạnh mà bài viết này chưa đề cập tới. Hy vọng mọi người cùng đóng góp.
Hy vọng bài viết này đã có thể trả lời bạn một cách tổng quan nhất các bước cần phải làm sau khi viết xong code.
Nếu design có timing mà khó đạt, cần phải có thêm phần "floor planning". Phần này giúp đặt những cell/gate mà liên hệ gần nhau để tránh bị trễ timing.
Sau khi xác nghiệm RTL mà muốn biết thêm design đã được xác nghiệm kỹ càng, nên dùng thêm "formal equivalent, gate to RTL". Phần này có tác dụng nhiều nhất là khi có lỗi, sửa design ở gate và RTL riêng nhưng vẫn kô chắc là nó có hoạt động giống nhau hay kô.
Các bước Verification, Synthesis, Layout, Equivalence check, STA, ATPG nên được tổng hợp thành các bài viết riêng vì có rất nhiều khía cạnh mà bài viết này chưa đề cập tới. Hy vọng mọi người cùng đóng góp.
Tôi xin đóng góp thêm về các bước trên:
1) Synthesis (Tổng hợp)
Tổng hợp là cách chuyển biến từ abstract cao tới abstract thấp hơn. Hiện nay có 2 mức tổng hợp:
* C/C++/systemC (untime/partial time) tới RTL (Register Tranfer Level). Đây là công nghệ đang trên đà tiến để nâng cao sức thiết kế (giảm thời gian thiết kế khoảng 50% cho lần đầu tiên, 80% cho những phần thay đổi của thiết kế)
* RTL tới dạng cổng (gate) - Đây là dạng tổng hợp thông thường và đã được sử dụng trên 20 năm nay.
Công việc của tổng hợp là phải làm sao có được kết quả vừa nhanh, gọn và tiêu dùng ít nhiên liệu. Những công cụ tổng hợp của mấy công ty FPGA như Xilinx, Altera thì đơn giản hơn vì chỉ phải chuyển qua cấu trúc của riêng họ. Mục đích của mấy công ty này là làm cách nào để bán nhiều phần cứng của họ cho nên công cụ của họ không cần phải tóm gọn kết quả. Kết quả càng bự chừng nào càng lợi cho họ chừng đó. Công cụ tổng hợp của mấy công ty EDA thì ngược lại. Mục đích là càng dùng công cụ lâu chừng nào càng tốt. Những công cụ này sẽ vận động để làm kết quả càng nhanh, gọn và ít nhiên liệu. Tạo cơ hội để những kỹ sư tìm tòi làm kết quả hữu hiệu hơn (nhiều thời gian dùng công cụ hơn). Giá cả của những công cụ này rất mắc tiền không như của công ty FPGA thường thì cho free khi mua phần cứng của họ.
Quá trình của tổng hợp là:
* Language parser hay còn gọi là compile để chuyển thiết kế từ ngôn ngữ nguồn tới primitive netlist (cấu trúc nguyên thủy của tổng hợp, AND, OR, FF, SHIFT, số toán + - * / và vân vân).
* Boolean optimization - Tóm gọn logic, constant propagation (ví dụ "a AND 1 = a", "a AND 0 = 0", "a OR 0 = a", "a OR 1 = 1" và vân vân)
* Liên hệ thời gian với target technology (Virtex, Stratix, 90nm, 25nm, etc...) rồi dùng STA (Static timing analysis) để kiểm soát thời gian (cổng vào tới FF, FF tới FF và FF tới cổng ra).
* STA chỉ dùng để kiểm soát thời gian mà không cần chi tiết về cách hoạt động với mục đích để chạy cho nhanh và đỡ tốn memory cho nên đôi lúc sẽ hiểu lầm về trễ thời gian. Chẳng hạn như reset chỉ chuyển có một lần trong thời gian hoạt động nhưng STA không biết cho nên vẫn xét thời gian ở mỗi chu kỳ.
* Clock tree synthesis (CTS) - Xung clock thường chạy khắp nơi cho nên có rất nhiều load. CTS dùng để bão hòa load cho xung clock để thời gian tới địa điểm càng ít sai lạc càng tốt.
Xin hẹn các bạn kỳ tới để nói thêm về những bước khác.
2) Scan Insertion và ATPG
Tương tự như bên thiết kế board, mọi điểm trên thiết kế cần phải được giám sát để đề phòng sự trục trặc khi làm ra sản phẩm. Có nhiều điểm trên mạch IC không có thể giám sát hoặc điều khiển từ ở ngoài (khi thử chip, chỉ có thể trực tiếp giám sát va điều khiển ở mấy chân của chip mà thôi. Không thể nhìn thấy hoặc đụng những điểm ở bên trong). Scan Insertion tạo điều kiện để có thể chuyển vô bên trong IC những pattern để có thể điều khiển (controllability) rồi sau đó chuyển ra ngoài những chi tiết để dựa vào đó mà có thể giám sát (observability) tình trạng của những điểm ở bên trong. Những pattern dùng để điều khiển và giám sát này là Automatic Test Pattern Generation (ATPG)
Các bước Verification, Synthesis, Layout, Equivalence check, STA, ATPG nên được tổng hợp thành các bài viết riêng vì có rất nhiều khía cạnh mà bài viết này chưa đề cập tới. Hy vọng mọi người cùng đóng góp.
Bài viết dưới đây là phần dẫn nhập cho bước đầu tiên: Functional Verification
Trong thiết kế FPGA, các thiết kế (RTL code) trước khi được chuyển xuống chip FPGA thường qua công đoạn chạy mô phỏng. Cũng giống như vậy trong thiết kế ASIC, trước khi tiến hành bước tổng hợp (synthesis), RTL code cần qua bước mô phỏng kiểm tra về mặt chức năng (functional verification). Hiện nay công việc này chiếm phần lớn thời gian trong toàn bộ quy trình thiết kế ASIC do sự gia tăng đáng kể về kích thước và mức độ phức tạp của thiết kế. Có thể nói lỗi về logic và function chiếm gần một nửa số lỗi làm cho không đạt được “first time right silicon”. Chính vì vậy mô phỏng chức năng ngày càng trở nên quan trọng hơn. Để có thông tin thêm về lĩnh vực này các bạn có thể tham khảo lại các bài viết trước đây của anh Tony:
Rất đúng, thời gian để làm kiểm tra tốn hơn là thiết kế. Nó có thể chiếm đến 80% tổng số thời gian làm sản phẩm. Đây là một nỗi lo lắng lớn cho người thiết kế. Kỹ thuật kiểm tra đã phải thay đổi từ AVM qua OVM rồi UVM. Để tiếp nhận kỹ thuật kiểm tra này đòi hỏi thời gian và nhân lực cho nên vẫn không được mọi người hưởng ứng. Hiện giờ những công ty hiện đại đang tìm kiếm cách giải quyết khác. Một trong những giải quyết này là làm kiểm tra ở tầng cao cấp hơn (higher abstraction)
Theo tôi thì sẽ có một thay đổi mới về cách thiết kế trong một vài năm tới.
Tớ không làm về TLM nên mảng này tớ không biết nhiều lắm nhưng cũng muốn trao đổi với mọi người một chút. Nếu tớ không nhầm thì systemc và TLM được đưa ra để tăng tốc độ chạy mô phỏng trong các hệ thống bao gồm cả hardware và software. Nếu dùng verilog để chạy mô phỏng thì chỉ có thể chạy một số chức năng cơ bản của phần cứng chứ khó mà có thể chạy nguyên một phần mềm ví dụ như boot một hệ điều hành lên được. Trong khi đó TLM thì khác. Nó sẽ không mô phỏng theo kiểu phần cứng mà lại mô phỏng hoàn toàn theo kiểu chạy của phần mềm nên rất nhanh. Nhưng ở đây có một luận điểm tớ muốn các bạn cùng trao đổi xem liệu có nên sử dụng systemc và TLM hay không?
Nếu tớ không nhầm thì ở chỗ tớ để chạy nguyên cả một phần mềm người ta dùng fpga emulator. Nó là một cái máy, kích thước cũng cỡ như một máy chủ, bên trong có rất nhiều fpga board. Người ta sẽ đem RTL code phân chia ra rồi nạp lên các board này vậy là fpga emulator này đã có thể chạy tương tự như một phần cứng thật sự. Tốc độ của emulator này rất chậm, dưới 10 MHz, nhưng cũng hoàn toàn đủ để chạy nguyên một phần mềm. Việc kiểm tra các tín hiệu bên trong khi đang chạy tương đối khó khăn hơn là dùng phần mềm mô phỏng nhưng nói chung vẫn có thể đọc ra để kiểm tra được. Hình như một cái máy fpga emulator này của synopsys bán cũng chỉ khoảng 100K chẳng là gì so với một công ty làm bán dẫn. Thêm một điểm nữa là fpga emulator chạy chính xác hơn nhiều so với dùng TLM vì TLM không quan tâm đến vấn đề thời gian.
Theo mình biết thì những dự án lớn, phức tạp người ta hay dùng tới emulator, còn những loại tầm tầm như MCU 8-bit chẳng hạn thì có thể dùng mô phỏng để kiểm tra. Hơn nữa có một số phần việc mà dùng emulator không hiệu quả thì người ta sẽ dùng mô phỏng. Ví dụ như việc phân tích CPU load (đo thời gian tương tác của các ngắt theo những kịch bản khác nhau) bằng emulator là không đơn giản vì rất khó để có được những thông tin chi tiết về PC hay interrupt theo thời gian thực nếu quan sát bằng board mạch.
Để mô phỏng một hệ thống, dùng C với native data type là lẹ nhất. SystemC với bit accurate data type thì chậm hơn nhiều nhưng có lợi điểm là xác thực hơn để mô phỏng phần cứng. TLM dung hòa ở giữa. Tùy theo mục đích mà xử dụng cho thích hợp.
Emulation thì lẹ hơn systemC nhưng phải có RTL và rất tốn kém cho nên không thích hợp để mô phỏng cả hệ thống. Thường thì để làm nhanh vấn đề thử nghiệm ở chip level.
Mình cần đặt hàng thiết kế chế tạo mạch nghịch lưu 3 pha để cài đặt các thuật toán điều khiển động cơ FOC, DTC, ... Xin liên hệ trungaut@gmail.com để bàn chi tiết. Xin cảm ơn diễn dàn đăng tin!
Comment