Việc mô hình hoá, mô phỏng và kiểm chứng thiết kế thực hiện theo quy trình mạch VLSI, như mô tả trong Hình 3.6. Theo đó quy trình này bao gồm 4 bước cơ bản: xây dựng đặc tả và phân tích thiết kế; mô hình hoá thiết kế và xây dựng mô hình kiểm tra; mô hình kiểm chứng và cuối cùng là tổng hợp logic.
Xây dựng đặc tả, Phân tích thiết kế
Mô hình hóa thiết kế (VHDL) Xây dựng mô hình kiểm tra Mô phỏng và kiểm chứng Đạt? Tổng hợp logic Không Có
Hình 3.6: Quy trình mô hình hóa, mô phỏng và kiểm chứng thiết kế.
Trong quy trình thiết kế trên, hai công đoạn đầu đòi hỏi người thiết kế đầu tư nhiều thời gian và chất xám. Trong khi đó các công đoạn sau gần như được thực hiện hoàn toàn tự động bởi các công cụ thiết kế. Người thiết kế chỉ cần xây dựng các ràng buộc về mặt vật lý cho thiết kế nhằm thu được kết quả như mong muốn, đáp ứng được các đặc tả đặt ra. Các công đoạn này đòi hỏi kinh nghiệm của người thiết kế.
Trong quá trình thiết kế tôi áp dụng phương pháp thiết kế từ trên xuống (Top- Down) nhằm đơn giản hoá thiết kế và từ đó giảm thời gian thiết kế. Để kiểm chứng được chức năng hoạt động của thiết kế so với yêu cầu đặt ra tôi đã xây dựng môi trường kiểm tra (testbench) như Hình 3.7. Môi trường kiểm tra này bao gồm 3 khối: khối thứ nhất là IP phát (generator IP), khối thứ hai là mạch sẽ được kiểm tra CUT (Circuit-Under-Test) và khối thứ ba là IP nhận (receiver IP).
CUT Testbench O_send0 O_send1 O_data O_accept0 O_accept1 I_send0 I_send1 I_data I_accept0 I_accept1 Khối nhận dữ liệu Khối tạo dữ liệu
Hình 3.7: Môi trường kiểm tra và mô phỏng chức năng hoạt động của mạch.
* Khối IP phát: là một lõi xử lý đơn giản, được mô hình hoá ở mức cao (mức mô tả các hành xử), có nhiệm vụ tạo ra các gói dữ liệu để đưa vào mạch cần kiểm tra. Khối này có các đường tín hiệu ra là O_data, O_send(0, 1) và tín hiệu vào O_accept(0, 1). Trong đó, tín hiệu O_send(0, 1) và O_accept(0, 1) thực hiện giao thức bắt tay với mạch cần kiểm tra. Quy trình thực hiện của khối IP phát được thể hiện qua lưu đồ thuật toán Hình 3.8. Theo lưu đồ thuật toán này, đầu tiên ta khởi động lại (reset) toàn bộ các giá trị trên các tín hiệu O_send và O_data, tiếp đến là tạo các gói dữ liệu (mỗi gói gồm có nhiều flit, trong đó có một flit tiêu đề (header flit), một flit kết thúc (tail flit) và các flit dữ liệu (data flit). Sau khi tạo dữ liệu, ta tiến hành kiểm tra trạng thái (rỗi/bận) của kênh truyền rồi từ đó đưa ra quyết định truyền dữ liệu, nếu kênh truyền rỗi (O_accept = „1‟) tại sườn dương của xung nhịp clk thì thực hiện truyền dữ liệu (O_send = „1‟ và dữ liệu được truyền trên O_data). Còn nếu kênh truyền bận thì chương trình sẽ chờ đến khi kênh truyền rỗi, việc kiểm tra kênh truyền diễn ra liên tục cho đến khi kênh rỗi (có thể truyền dữ liệu trên kênh). Sau khi dữ liệu được truyền đi, nó luôn phải kiểm tra nơi nhận có sẵn sàng nhận dữ liệu không, nếu sẵn sàng (O_accept = „1‟) thì dữ liệu sẽ được gửi tiếp còn không (O_accept = „0‟) sẽ đưa tín hiệu O_send về „0‟ đồng nghĩa không truyền dữ liệu lên kênh. Sau khi kết thúc flit dữ liệu, nó quay trở về phần tạo các flit và lại thực hiện việc truyền flit tiếp theo.
Tạo các flit Truyền dữ liệu Sườn dương CLK? O_accept =„1‟? O_accept = „0‟? O_send = „0‟ S Đ S Đ Reset
Hình 3.8: Lưu đồ thuật toán của IP phát.
* Khối mạch kiểm tra (Circuit-Under-Test): là một hệ thống cần kiểm tra, trong nó có thể là một bộ định tuyến, hay hai bộ định tuyến kết nối với nhau, hay có thể là một mạng với kích thước 2×2 như đã xây dựng.
* Khối IP nhận: là nơi lưu giữ các kết quả thu được (cửa sổ hiển thị dạng sóng) từ hoạt động của hệ thống. Khối này có các đường tín hiệu vào là I_data, I_send(0, 1), và các tín hiệu trả về I_accept(0, 1). Quy trình nhận cũng được thể hiện qua lưu đồ thuật toán Hình 3.9. Từ Hình 3.9 ta thấy, trước khi nhận dữ liệu ta reset tín hiệu I_accept, sau đó đưa tín hiệu I_accept lên „1‟ báo hiệu sẵn sàng nhận dữ liệu. Để thực hiện nhận dữ liệu trước tiên nó kiểm tra trên kênh tín hiệu I_send và tại sườn dương xung clock, nếu thỏa mãn (rising_edge(clk) và I_send = „1‟) thì thực hiện nhận dữ liệu còn không nó lại kiểm tra tiếp cho đến khi thỏa mãn. Sau khi nhận dữ liệu xong nó đưa I_accept về „0‟ (báo hiệu bộ đệm đang bận) và lập tức đưa tín hiệu I_send về „0‟. Sau khi I_send về „0‟ nó trở về trạng thái I_accept = „1‟ và quá trình nhận các flit tiếp theo cũng được thực hiện tương tự.
I_Accept =„1‟ Nhận dữ liệu Sườn dương CLK? I_send =„1‟? I_send = „0‟ I_accept = „0‟ S Đ Reset
Hình 3.9: Lưu đồ thuật toán của IP nhận.