cạnh, cố gắng chắnh ựể giải quyết những vấn ựề của ựiều khiển và ựồng bộ. Những cách mô phỏng không ựồng nhất này, là những tối ưu cục bộ theo khắa cạnh khả năng thực thi mô phỏng cũng như dễ dàng tắch hợp hệ thống bởi chỉ có một lượng thông tin nhỏ truyền thông giữa hai bộ mô phỏng hoàn toàn khác nhau. Tuy nhiên chỉ có một sự lựa chọn khi ngôn ngữ VHDL hoặc Verilog là mức ựộ mô phỏng cao nhất có thể của phần cứng ựược mô hình hóa. Một vài công cụ thương mại như Mentor Graphics Seamless cũng cung cấp khả năng ựồng mô phỏng không ựồng nhất. Tuy nhiên các công cụ này chỉ cho phép ựồng mô phỏng ở mức bus, mà mỗi một trao ựổi trên bus bao gồm toàn bộ những tắn hiệu cần thiết ựể hoàn thành chức năng của bus, bởi vậy giảm hiệu suất của ựồng mô phỏng.
Trong luận văn này, do không có nhiều thời gian ựể phát triển, cũng như yêu cầu chắnh của tác giả là tập trung vào thiết kế phần cứng nên tác giả sử dụng mô hình ựồng mô phỏng không ựồng nhất. Thực ra ở ựây tác giả nêu ra khái niệm ựồng mô phỏng, nhưng trên thực tế tác giả chỉ mô phỏng phần cứng, sử dụng các phần mềm nhỏ, những ựoạn chương trình chắnh ựể làm testbench khi thực mô phỏng phần cứng.
4.3. Mô ph?ng ự8 ki8m tra thit k
Mô phỏng thể hiện những kĩ thuật kiểm ựịnh chắnh khi chức năng của một hệ thống nhúng không ựồng nhất cần phải kiểm ựịnh. Trong thực tế, các kĩ thuật mô phỏng cho hệ thống nhúng ựược chi thành hai loại chắnh mô phỏng bởi testbench và mô kiểm ựịnh hệ thống bằng phường pháp Assertion. Phần tiếp theo sẽ tập
SW description SW description Simulator Communication interface Simulator Communication interface Communication BUS
trung vào mô tả phương pháp dựa vào testbench bởi ựây sẽ là phương pháp dùng ựể thiết kế vào mô phỏng vi xử lý ở những chương sau.
Kĩ thuật mô phỏng dựa trên testbench về cơ bản kiểm ựịnh chức năng của mô hình bằng cách tạo ra một số lượng lớn các stimuli ựầu vào. Các stimuli này sau ựó sẽ ựược dùng ựể mô phỏng ựể quan sát các hoạt ựộng của mô hình, hệ thống trong giai ựoạn nay ựược gọi là thiết bị ựang ựược kiểm ựịnh (Device under verification). Những việc chúng ta cần làm ựể hoàn thành quá trình kiểm ựịnh này là: một mô hình có thể mô phỏng ựược của thiết kế, một bộ mô phỏng, một testbench ựể ựưa stimuli tới những lối vào cơ bản của thiết kế, một phương pháp ựể sửa sai khi phát hiện thiết kế có lỗi theo như kết quả mô phỏng. Nói một cách chung, bộ tạo stimuli và các bộ mô phỏng ựược tắch hợp trong một chương trình ứng dụng ựược gọi là bộ bạo các mẫu kiểm tra tự ựộng
Trong khi ta có thể dễ dàng hiểu ựược ba yêu tố ựầu tiên trong mô hình kiểm ựịnh ựộng, yếu tố cuối cùng là một khắa cạnh khá trừu tượng. Nếu như có rất nhiều trạng thái là một vấn ựề lớn của việc kiểm ựịnh hệ thống thì vấn ựề lớn nhất của mô phỏng là thiếu tắnh toàn diện của quá trình kiểm ựịnh. Bởi vậy, giống như những tiến trình kiểm ựịnh khác, kiểm ựịnh ựộng rất phù hợp trong việc tìm ra lỗi nhưng không thể ựảm bảo rằng không còn một lỗi nào trong thiết kế. Mô phỏng có thể cung cấp một câu trả lời toàn diện cho vấn ựề sửa lỗi thiết kế nếu như tập hợp của toàn bộ các stimuli ựược ựưa vào làm lối vào của thiết kế. Kết quả, sau khi mô phỏng phải nằm trong tập các kết quả cơ bản ựã ựược ựịnh nghĩa trước khi tiến hành mô hình hóa hệ thống cần thiết kế. Thật không hay, ựiều này là không thể bởi vì hai lý do. Tập hợp các kết quả mong muốn thường không hiện hữu, và tập các stimuli cho lối vào ựược tăng theo hàm mũ theo thời gian và không gian. Bởi vậy, chất lượng của kiểm ựịnh ựộng và trong thực tế là chất lượng của tập stimuli ựược tạo ra và ựược ựo bởi ựộ hội tụ của mã (code coverage) hoặc ựộ hội tụ lỗi (fault coverage). Phụ thuộc vào kĩ thuật nào ựược sử dụng, chúng ta có thể phân ra làm hai loại kiểm ựịnh ựộng: mô phỏng logic (logic simulation) và mô phỏng sai (fault simulation).
4.3.1 Mô phỏng logic
Trong mô phỏng logic, chất lượng của tập stimuli ựược ựo bởi ựộ hội tụ của mã, là một lớp các tiêu chắ ựược sử dụng trong công nghệ phần mềm ựể phân tắch có hay không tập hợp các testcase có thể bao trùm toàn bộ các chức năng ựược yêu cầu. Một trong những tiêu chắ thông dụng nhất ựược sử dụng trong mô phỏng
logic ựó là ựộ hội tụ các phát biểu (statement coverage), hội tụ ựiều kiện, và hội tụ ựường.
Một khó khăn của mô phỏng logic là rất khó và tốn thời gian ựể tạo ra ựược hội tụ 100% có nghĩa là không thể tạo ra ựược những test bench ựể có thể kắch hoạt toàn bộ những ựoạn mã trong chương trình. Hơn nữa, mô phỏng logic cũng không thể chỉ ra ựược ựộ ựúng ựắn của thiết kế, mô phỏng logic rất thắch hợp trong việc tìm ra những Ộhiện tượngỢ của thiết kế.
4.3.2 Mô phỏng sai.
Các tiêu chắ hội tụ mã truyền thống ựược suy ra từ quá trình phát triển phầm mềm thể hiện một giải pháp rẻ tiền và thông dụng. Tuy nhiên, chúng dựa trên các thông tin ựiều khiển, việc kắch hoạt các phát biểu, các lệnh rẽ nhánh hoặc một chuỗi các phát biểu. Chúng không cho ta thấy ựược những yêu cầu từ việc quan sát ựó như có hay không những lỗi có thể xảy ra có thể quan sát ựược bởi ựầu ra ựó. Có thể thấy một vắ dụ như có thể trong chương trình tồn tại một phát biểu với lỗi trong ựó, phát biểu này bị kắch hoạt bởi stimuli ựầu vào nhưng như thế không có gì ựảm bảo rằng kết quả quan sát ựầu ra sẽ không ựúng. Một cách tiếp cận khác ựể giải quyết vấn ựề này là sử dụng mô hình lỗi mức ựộ cao (hight level fault model [43]. Mô hình này bao hàm cả những ựặc tắch của ựộ hội tụ mã cũng như mô hình sai ở mức logic. Bởi vậy mô phỏng sai bao gồm cả những mô phỏng của thiết kế vẫn còn bị lỗi logic, chắnh là những lỗi về vật lý lên mức hành vi của thiết kế hệ thống. Sai có thể ựược mô hình hóa bởi nhiều mô hình sai khác nhau, phụ thuộc vào rất nhiều loại lỗi có thể ảnh hưởng lên thiết kế, phụ thuộc vào mức ựộ trừu tượng hóa. Lỗi ở mức cao cho chúng ta thấy ựược cái nhìn tổng quát về những lỗi trong thiết kế có thể xảy ra bởi nó tạo ra rất nhiều các hành vi khác nhau cho hệ thống. Phân tắch tắnh tự nhiên của nó cho phép ta ựưa ra những chiến thuật verification hệ thống một cách hiệu quả nhất những hành vi mong muốn cũng như không mong muốn của hệ thống.
Chương này ựã trình bày về những nguyên lý cơ bản của thiết kế, chiến thuật và cách thực thi một quy trình kiểm tra hệ thống dựa trên các testbench và stimuli ựầu vào. Chương tiếp theo dựa trên những nguyên lý cơ bản này ựể thiết kế, mô phỏng và kiểm tra chức năng của những module cơ bản của vi xử lý.
Chương 5: THIẾT KẾ CHI TIẾT CHỨC NĂNG CỦA VI đIỀU KHIỂN VÀ MÔ PHỎNG TRÊN MODELSIM.
5.1. Gii thi u chung.
Trong thiết kế một hệ thống nhúng dựa trên nền tảng FPGA, việc mô phỏng ựể kiểm tra chức năng của hệ thống ( hệ thống ựã hoạt ựộng ựúng theo những chức năng mong muốn ựặt ra ban ựầu hay chưa) là một bước rất quan trọng và thường tiêu tốn khá nhiều thời gian của người phát triển hệ thống. Việt thiết kế một hệ thống luôn ựi cùng với quá trình mô phỏng thiết kế ựó, trong thiết kế phần cứng ta vẫn thấy rằng việc mô tả các thiết kế phần cứng luôn ựi cùng với việc viết các testbench ựể kiểm tra chức năng của thiết kế. Chắnh vì thế thiết kế và mô phỏng chức năng ựược xem như hai quá trình luôn ựi cùng nhau. Chương này sẽ xây dựng các mô ựun cơ bản như ựược nêu ở chương ba, mô phỏng kiểm tra chức năng của từng mô ựun, sau ựó kết nối các mô ựun và mô phỏng chức năng của cả hệ thống.
Trong phần này sử dụng phần mềm ModelSim của Altera bởi nó có một số ưu ựiểm sau:
- Phần mềm ModelSim thường chạy nhanh hơn so với một số phần mềm mô phỏng khác, ưu ựiềm này rất quan trọng vì như ựã nêu ra trong phần ựầu của luận văn, thời gian dùng ựề verification lại hệ thống thường rất dài.
- Dùng ModelSim ta có thể kiểm tra ựược chức năng của các Module nhỏ cũng như một hệ thống lớn tắch hợp nhiều module nhỏ.
Quy trình ựể mô phỏng chức năng của vi xử lý, trong luận văn này ựược chia ra làm hai phần nhỏ.
- Phần thứ nhất sẽ mô phỏng và kiểm tra chức năng của từng module nhỏ. Vi xử lý gồm rất nhiều module nhỏ như: Bộ nhớ chương trình, ALU, Register fileẦ.. Do ựó, bước ựầu tiên ta cần phải ựảm bảo rằng các module này ựược thiết kế ựúng, có như vậy
khi tắch hợp các module thành hệ thống lớn hơn mới có thể ựảm bảo hệ thống chạy ựúng.
- Phần thứ hai sẽ mô phỏng chức năng của vi xử lý, phần này ựược thực hiện khi các module nhỏ ựã ựược tắch hợp thành một hệ thống lớn hơn. Mục ựắch của phần này là ta có thể kiểm tra toàn bộ các hoạt ựộng có thể của vi xử lý, ựảm bảo rằng các hoạt ựộng ựó hoạt ựộng ựúng. Thông thường một hệ thống lớn thường có rất nhiều tổ hợp trạng thái khác nhau, do ựó trong phần này sẽ rất tốn thời gian ựể có thể verification ựược hệ thống và thường là không thể kiểm tra hết ựược các trường hợp. Do ựó người ta thường ựưa ra các cách kiểm tra hệ thống khác nhau như, lựa chọn các trường hợp ựiển hình và ựảm bảo rằng các trường hợp ựó ựược chạy ựúng. 5.2. Thit k và mô ph?ng ch*c năng cAa các module c$ bn
trong vi xC lý.
Như ta ựã biết, một hệ vi xử lý hoàn thiện ựược cấu thành từ rất nhiều các module nhỏ khác nhau. Một phương pháp thiết kế truyền thống ựó là phương pháp Ộbottom Ờ upỢ, phương pháp thiết kế từ dưới lên, trong phương pháp này ta sẽ thiết kế các module cơ bản cần thiết trước, sau ựó dựa vào các module này ta sẽ tắch hợp ựể thành một hệ thống lớn hơn. đối với một hệ vi xử lý cơ bản cũng như vậy, nó ựược cấu thành từ các module nhỏ khác nhau, do ựó trước hết ta cần phải thiết kế các module này trước.
5.2.1 Thiết kế bộ logic và số học.
Bộ logic và số học chắnh là trung tâm của vi xử lý, nơi thực hiện toàn bộ các thao tác tắnh toán của vi xử lý. Do ựây là vi xử lý ựơn giản nên các thao tác tắnh toán chắnh chỉ bao gồm phép cộng và phép trừ, các phép toán logic ựơn giản. Sơ ựồ khối của bộ ALU ựược chỉ ra như trong hình sau:
Ý nghĩa của các lối vào ra của bộ logic và số học như sau:
- C_in: 1 bit Là lối vào Carry in, lối vào của phần nhớ của các thao tác số học như cộng hoặc trừ.
- S1[7..0]: Lối vào 8 bits thứ nhất của hai toán hạng nguồn, lối vào này sẽ nhận dữ liệu từ register file hoặc nhận dữ liệu từ các thanh ghi ựặc biệt, special function register. Việc lựa chọn ựầu vào (toán hạng) cho ựầu vào S1 của ALU