ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KỸ THUẬT MÁY TÍNH PHẠM QUANG HẢI VŨ DUY DI ĐAN KHÓA LUẬN TỐT NGHIỆP MÔ PHỎNG VÀ HIỆN THỰC 32-BIT RISC-V CPU TRÊN FPGA SIMULATION AND IMPLEMENTATION OF THE 32-BIT RISCV CPU ON FPGA KỸ SƯ NGÀNH KỸ THUẬT MÁY TÍNH TP. HỒ CHÍ MINH, 2022 ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KỸ THUẬT MÁY TÍNH PHẠM QUANG HẢI - 18520703 VŨ DUY DI ĐAN - 18520554 KHÓA LUẬN TỐT NGHIỆP MÔ PHỎNG VÀ HIỆN THỰC 32-BIT RISC-V CPU TRÊN FPGA SIMULATION AND IMPLEMENTATION OF THE 32-BIT RISCV CPU ON FPGA KỸ SƯ NGÀNH KỸ THUẬT MÁY TÍNH GIẢNG VIÊN HƯỚNG DẪN TIẾN SĨ NGUYỄN MINH SƠN TP. HỒ CHÍ MINH, 2022 THÔNG TIN HỘI ĐỒNG CHẤM KHÓA LUẬN TỐT NGHIỆP Hội đồng chấm khóa luận tốt nghiệp, thành lập theo Quyết định số 528/QĐĐHCNTT ngày 19 tháng 07 năm 2022 của Hiệu trưởng Trường Đại học Công nghệ Thông tin. LỜI CẢM ƠN Lời đầu tiên, nhóm thực hiện đề tài xin gửi lời cảm ơn chân thành đến thầy hướng dẫn Tiến sĩ Nguyễn Minh Sơn, thầy đã tận tình hướng dẫn chúng em trong quá trình làm khóa luận, cung cấp các trang thiết bị, cũng như dành nhiều thời gian chỉnh sửa, góp ý để chúng em có thể hoàn thành khóa luận một cách tốt đẹp. Bên cạnh đó, nhóm thực hiện cũng xin gửi lời cảm ơn đến Thầy/Cô và bạn bè khoa Kỹ thuật máy tính nói riêng và trường Đại học Công nghệ Thông tin – Đại học quốc gia Thành phố Hồ Chí Minh nói chung đã tận tình giảng dạy, truyền đạt các kiến thức vô cùng bổ ích, đồng hành và hỗ trợ chúng em trong suốt quá trình học tập tại trường Đại học Công nghệ Thông tin. Những kiến thức và kinh nghiệm quý báu đó sẽ là hành trang giúp chúng em có thể tự tin tiếp xúc với công việc chuyên ngành một cách thuận lợi hơn. Cuối cùng, chúng em cũng xin dành lời cảm ơn sâu sắc đến ba mẹ và gia đình vì đã luôn sát cánh, động viên, tạo điều kiện và là chỗ dựa tinh thần vững chắc trên con đường học tập và làm việc. Trong suốt quá trình thực hiện đề tài khóa luận, chúng em không thể tránh khỏi những khó khăn và sai sót do một số giới hạn liên quan đến chuyên ngành chuyên sâu. Vì thế, chúng em mong các quý Thầy/Cô và các bạn sẽ thông cảm, và có thể đóng góp ý kiến để đề tài khóa luận này được phát triển và hoàn thiện hơn trong tương lai. Một lần nữa chúng em xin chân thành cảm ơn. TP. Hồ Chí Minh, ngày 27 tháng 06 năm 2022 Sinh viên thực hiện PHẠM QUANG HẢI VŨ DUY DI ĐAN MỤC LỤC Chương 1. TỔNG QUAN ................................................................................ 15 1.1. Giới thiệu về kiến trúc tập lệnh ................................................................ 15 1.1.1. Tổng quan về kiến trúc tập lệnh RISC-V ....................................... 15 1.1.2. Các kiến trúc tập lệnh ..................................................................... 17 1.2. Chi tiết kiến trúc tập lệnh RISC-V ........................................................... 19 1.3. Thiết kế hệ thống của CPU ....................................................................... 26 Chương 2. THIẾT KẾ VI XỬ LÝ RISC-V 32-BIT......................................... 27 2.1. Tổng quan thiết kế vi xử lý ....................................................................... 27 2.2. Lý thuyết về xung đột (Pipeline hazard) .................................................. 28 2.2.1. Xung đột cấu trúc (Structure hazard) ............................................. 29 2.2.2. Xung đột dữ liệu (Data hazard) ...................................................... 29 2.2.3. Xung đột điều khiển (Control/Branch hazard) ............................... 30 2.3. Các khối chức năng có trong vi xử lý thông qua từng giai đoạn.............. 32 2.3.1. Controller ........................................................................................ 32 2.3.2. Instruction Fetch (IF)...................................................................... 34 2.3.3. Instruction Decode (ID).................................................................. 38 2.3.4. Execute (EX) .................................................................................. 44 2.3.5. Memory Access (MEM) ................................................................. 49 2.3.6. Write Back (WB) ............................................................................ 52 Chương 3. THIẾT KẾ VI XỬ LÝ RISC-V 32-BIT VỚI GIAO THỨC AXI4 53 3.1. Đóng gói vi xử lý RISC-V với giao thức AXI4 ....................................... 53 3.1.1. Kiến trúc vi xử lý trước khi đóng gói ............................................. 53 3.1.2. Kiến trúc vi xử lý khi đóng gói thành IP ........................................ 53 3.2. Giao thức AXI4 ........................................................................................ 54 3.2.1. Tổng quan giao thức ....................................................................... 54 3.2.2. Các tín hiệu cụ thể của giao thức AXI4 trong khóa luận ............... 57 Chương 4. THIẾT KẾ BLOCK DESIGN TRÊN VIVADO............................ 59 4.1. Tổng quan thiết kế Block Design ............................................................. 59 4.1.1. Thiết kế trên Vivado ....................................................................... 59 4.2. Các IP của Xilinx dự kiến dùng trong thiết kế Block Design .................. 59 4.2.1. IP Memory Interface Generator (MIG 7 Series) ............................ 59 4.2.2. IP Central Direct Memory Access (IP CDMA) ............................. 60 4.2.3. IP AXI Bram Controller ................................................................. 60 Chương 5. MÔ PHỎNG VÀ ĐÁNH GIÁ THIẾT KẾ .................................... 62 5.1. Kịch bản kiểm thử trên FPGA .................................................................. 62 5.2. Mô phỏng chức năng ................................................................................ 64 5.3. Kết quả mô phỏng..................................................................................... 65 5.4. Đánh giá thiết kế ....................................................................................... 68 5.4.1. Kết quả tổng hợp ............................................................................ 68 5.4.2. Đánh giá thiết kế và so sánh với các đề tài khác ............................ 70 Chương 6. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ..................................... 73 6.1. Kết luận ..................................................................................................... 73 6.1.1. Những kinh nghiệm tích lũy ........................................................... 73 6.1.2. Các vấn đề hạn chế ......................................................................... 73 6.1.3. Kết quả đạt được............................................................................. 74 6.2. Hướng phát triển ....................................................................................... 74 TÀI LIỆU THAM KHẢO ...................................................................................... 75 PHỤ LỤC I. KIT FPGA XILINX VIRTEX-7 VC707 .......................................... 76 PHỤ LỤC II. CÁC BƯỚC GENERATE BITSTREAM ....................................... 79 DANH MỤC HÌNH Hình 1.1: Định dạng tập lệnh RV32I ..................................................................... 21 Hình 1.2: Kiến trúc hệ thống CPU ......................................................................... 26 Hình 2.1: Hình mô tả CPU RISC-V đơn chu kỳ .................................................... 27 Hình 2.2: Hình mô tả chi tiết các khối chức năng trong vi xử lý 32-bit RISC-V 5Stage pipeline sử dụng trong khoá luận ................................................................. 28 Hình 2.3: Hình mô tả các tín hiệu control qua các tầng ......................................... 32 Hình 2.4: Module Controller trong thiết kế ........................................................... 32 Hình 2.5: Thanh ghi Program Counter (PC) .......................................................... 35 Hình 2.6: Module Program Counter add 4 (PC_add4) .......................................... 36 Hình 2.7: Module IMEM ....................................................................................... 36 Hình 2.8: Thanh ghi IF to ID (IF_to_ID) ............................................................... 37 Hình 2.9: Register file ............................................................................................ 38 Hình 2.10: Module imm_gen ................................................................................. 39 Hình 2.11: Module Branch Comparator ................................................................ 40 Hình 2.12: Module Branch Detection .................................................................... 41 Hình 2.13: Module Hazard Detection .................................................................... 42 Hình 2.14: Thanh ghi ID to EX (ID_to_EX) ......................................................... 43 Hình 2.15: Module MuxA ...................................................................................... 45 Hình 2.16: Module MuxB ...................................................................................... 45 Hình 2.17: Module ALU ........................................................................................ 46 Hình 2.18: Module Forwarding Unit ..................................................................... 47 Hình 2.19: Module Addition Branch ..................................................................... 48 Hình 2.20: Thanh ghi EX to MEM (EX_to_MEM)............................................... 48 Hình 2.21:Module DMEM ..................................................................................... 50 Hình 2.22: Thanh ghi MEM to WB (MEM_to_WB) ............................................ 51 Hình 2.23: Module Mux_W ................................................................................... 52 Hình 3.1: Kiến trúc vi xử lý RISC-V trước khi đóng gói ...................................... 53 Hình 3.2: Kiến trúc vi xử lý sau khi đóng gói và được kết nối với IP System Cache ...................................................................................................................... 54 Hình 4.1: Thiết kế Block Design trên phần mềm Vivado ...................................... 59 Hình 5.3: Kịch bản kiểm thử sử dụng SD .............................................................. 63 Hình 5.4: Đoạn chương trình assembly và mã máy sau khi biên dịch để kiểm tra chức năng CPU....................................................................................................... 64 Hình 5.5: Kết quả mô phỏng ba câu lệnh đầu tiên trên phần mềm Vivado ........... 65 Hình 5.6: Kết quả mô phỏng ba câu lệnh đầu tiên trên Venus .............................. 66 Hình 5.7: Memory sau khi thực hiện lệnh SW trên CPU ...................................... 66 Hình 5.8: Memory sau khi thực hiện lệnh SW trên phần mềm ............................. 67 Hình 5.9: Kết quả thanh ghi của CPU sau khi chạy xong đoạn chương trình ....... 67 Hình 5.10: Kết quả thanh ghi của phần mềm Venus sau khi chạy xong đoạn chương trình ........................................................................................................... 68 Hình 5.11: Tài nguyên sử dụng của CPU RISC-V ................................................ 69 Hình 5.12: Tài nguyên sử dụng theo từng module của CPU RISC-V ................... 69 Hình 5.13: Xung clock của CPU RISC-V.............................................................. 70 Hình 5.14: Phân tích timing cho CPU RISC-V ..................................................... 70 Hình 5.15: Tốc độ tối đa dự kiến của CPU RISC-V .............................................. 70 DANH MỤC BẢNG Bảng 1.1: Trạng thái phiên bản của ISA cơ sở và các phần mở rộng .................... 16 Bảng 1.2: Thuận lợi và bất lợi của mỗi ISA .......................................................... 17 Bảng 1.3: Quy ước các thanh ghi của RISC-V ...................................................... 20 Bảng 1.4: Lệnh RV32I thông qua ngôn ngữ assembly .......................................... 21 Bảng 2.1: Bảng mô tả các công đoạn khi xử lý câu lệnh ....................................... 27 Bảng 2.2: Bảng mô tả tín hiệu điều khiển khối ALU ............................................ 33 Bảng 2.3: Bảng mô tả tín hiệu điều khiển thanh ghi PC ........................................ 33 Bảng 2.4: Bảng mô tả tín hiệu điều khiển halt ....................................................... 33 Bảng 2.5: Bảng mô tả tín hiệu điều khiển khối Imm_Gen .................................... 33 Bảng 2.6: Bảng mô tả tín hiệu BrEq ...................................................................... 34 Bảng 2.7: Bảng mô tả tín hiệu BrLT ...................................................................... 34 Bảng 2.8: Bảng mô tả tín hiệu BrUn ...................................................................... 34 Bảng 2.9: Bảng các tín hiệu trong module Controller ........................................... 34 Bảng 2.10: Bảng các tín hiệu trong thanh ghi PC .................................................. 35 Bảng 2.11: Bảng các tín hiệu trong thanh ghi PC_add4 ........................................ 36 Bảng 2.12: Bảng các tín hiệu trong module IMEM ............................................... 37 Bảng 2.13: Bảng các tín hiệu trong thanh ghi IF_to_ID ........................................ 38 Bảng 2.14: Bảng các tín hiệu trong RegFile .......................................................... 39 Bảng 2.15: Bảng các tín hiệu trong khối imm_gen................................................ 40 Bảng 2.16: Bảng các tín hiệu trong khối br_comp ................................................ 40 Bảng 2.17: Bảng các tín hiệu trong khối branch_detect ........................................ 41 Bảng 2.18: Bảng các tín hiệu trong khối Hazard Detection................................... 42 Bảng 2.19: Bảng các tín hiệu trong thanh ghi ID_to_EX ...................................... 43 Bảng 2.20: Bảng các tín hiệu trong khối MuxA .................................................... 45 Bảng 2.21: Bảng các tín hiệu trong khối MuxB .................................................... 46 Bảng 2.22: Bảng các tín hiệu trong khối ALU ...................................................... 46 Bảng 2.23: Bảng các tín hiệu trong khối forwarding_unit ..................................... 47 Bảng 2.24: Bảng các tín hiệu trong khối add_br.................................................... 48 Bảng 2.25: Bảng các tín hiệu trong thanh ghi EX_to_MEM ................................. 49 Bảng 2.26: Bảng các tín hiệu trong khối DMEM .................................................. 50 Bảng 2.27: Bảng các tín hiệu trong thanh ghi MEM_to_WB ................................ 51 Bảng 2.28: Bảng các tín hiệu trong khối Mux_W ................................................. 52 Bảng 3.1: Các tín hiệu trong AXI4 bus .................................................................. 57 Bảng 5.1: Bảng so sánh các thiết kế RISC-V pipeline [5] ..................................... 71 DANH MỤC TỪ VIẾT TẮT Viết tắt Viết đầy đủ Ý nghĩa IP Intellectual Property Lõi sỡ hữu trí tuệ AXI Advanced eXtensible Interface Giao diện bus mở rộng nâng cao CISC Complex Instruction Set Computer Máy tính với tập lệnh phức tạp RISC Reduced Instruction Set Computer ARM Advanced RISC Machines Máy tính với tập lệnh đơn giản hóa Bộ xử lý dựa trên kiến trúc tập lệnh RISC Microprocessor without Kiến trúc tập lệnh RISC phát Interlocked Pipeline Stages triển bởi MIPS Technologies RAM Random Access Memory Bộ nhớ truy cập ngẫu nhiên CPU Central Processing Unit Bộ xử lý trung tâm MIPS Vi mạch tích hợp cỡ lớn dùng FPGA Field Programmable Gate Array cấu trúc mảng phần tử logic mà người dùng có thể lập trình ALU Arithmetic Logic Unit Khối số học logic PLL Phase Locked Loop RTL Register Transfer Level CDMA Central Direct Memory Access Hệ thống kiểm soát tần số khép kín Mức chuyển thanh ghi MMCM Mixed-Mode Clock Manager 12 Trung tâm truy cập bộ nhớ trực tiếp Trình quản lý xung clock chế độ hỗn hợp TÓM TẮT KHÓA LUẬN Đề tài khóa luận bao gồm hai nội dung chính xoay quanh nghiên cứu thiết kế bộ vi xử lý RISC-V và đóng gói vi xử lý thành IP theo chuẩn giao tiếp AXI4. Nội dung thứ nhất là hướng đến nghiên cứu thiết kế vi xử lý RISC-V áp dụng kỹ thuật pipeline để xử lý câu lệnh. Vi xử lý gồm các khối chức năng xử lý lệnh trong tập lệnh RV32I và xử lý các xung đột. Tiếp đến là nhóm thực hiện thay thế hai khối Instruction Memory (IMEM) và Data Memory (DMEM) bằng IP System Cache v5.0 của Xilinx. Nội dung thứ hai của đề tài khóa luận là đóng gói bộ vi xử lý. Hầu hết các IP trên phần mềm Vivado giao tiếp với nhau thông qua bus AXI4 hoặc AXI3. Trong khóa luận này, RISC-V sẽ được đóng gói theo chuẩn giao tiếp AXI4. Sau đó kết nối với các IP khác trên Block Design của phần mềm Vivado đề tạo sự liên kết giữa hai nội dung. Trong Block Design, RISC-V đóng vai trò là một Master, yêu cầu đọc dữ liệu từ các Slaver thông qua bus AXI4, tính toán và lưu các giá trị đó vào trong System Cache, đồng thời trả các giá trị đó cho Slaver hoặc xuất ra Uart. Qua hai nội dung của khóa luận này, nhóm thực hiện hy vọng sẽ tích lũy được thêm kinh nghiệm về việc thiết kế kiến trúc vi xử lý RISC-V, cải thiện tốc độ xử lý của vi xử lý theo các kiến trúc đã được học, về thiết kế hệ thống có tích hợp các khối IP có sẵn. Ngoài ra hiểu về cách sử dụng BUS AMBA AXI4 để truyền nhận dữ liệu trong hệ thống. Đóng góp cho sự phát triển của kiến trúc RISC-V. 13 MỞ ĐẦU Ngày nay, nhu cầu về chip bán dẫn của ngành sản xuất các thiết bị thông minh ngày càng tăng cao, tình trạng dịch Covid-19 trở nên phức tạp, mọi người dần chuyển đổi sang hình thức học tập, làm việc trực tuyến và giải trí tại nhà. Chính vì vậy, việc phát triển các thiết bị thông minh, hiện đại, đòi hỏi các thiết bị phải có vi xử lý mạnh mẽ, đáp ứng các nhu cầu của người dùng càng trở nên cấp thiết hơn. Tuy nhiên, giá thành cấu tạo các vi xử lý còn cao do qui trình chế tạo phức tạp, thêm với đó là những khó khăn đến từ vấn đề thiếu hụt nguyên liệu và nhân công do bối cảnh dịch Covid-19 kéo dài hiện nay. Các vấn đề trên càng làm tăng thêm sự quan trọng của các vi xử lý trong các thiết bị thông minh. Từ thực trạng được nêu trên, chúng ta thấy được sự cần thiết trong việc tối ưu hóa các bộ vi xử lý. Một trong những giải pháp được đề xuất là thiết kế các vi xử lý phù hợp với thiết bị thông minh. Một vi xử lý với cấu trúc lệnh đợn giản để có thể giảm số lượng các cổng logic trên thiết kế, làm giảm năng lượng hoạt động cho vi xử lý, khi ấy nhà sản xuất sẽ điều chỉnh giá thành hợp lý hơn, từ đó làm giảm giá thành khi đến tay người dùng. Tại mức độ là sinh viên nghiên cứu, nhóm chúng em đề xuất đề tài khóa luận mang tên “NGHIÊN CỨU THIẾT KẾ BỘ VI XỬ LÝ RISC-V 32-BIT THEO KIẾN TRÚC PIPELINE”, đề tài khóa luận có hai nội dung. Nội dung thứ nhất hướng đến việc thiết kế vi xử lý RISC-V theo kiến trúc Pipeline 5-stage, tăng số lượng lệnh có thể xử lý trong đường ống của vi xử lý. Nội dung thứ hai đó là tinh chỉnh vi xử lý RISC-V thành một Master, có thể giao tiếp với các Slaver (System Cache) khác thông qua bus AXI4. Mục đích của nội dung này hướng đến việc tiếp cận thiết kế theo kiến trúc của các vi xử lý ngày nay, nhằm đóng góp cho sự phát triển của ngành vi mạch. 14 Chương 1. TỔNG QUAN 1.1. Giới thiệu về kiến trúc tập lệnh Kiến trúc tập lệnh (ISA) là một phần trừu tượng của máy tính xác định cách CPU được điều khiển bởi phần mềm. ISA hoạt động như một giao diện giữa phần cứng và phần mềm, chỉ định cả những gì bộ xử lý có khả năng thực hiện cũng như cách nó được thực hiện.[1] ISA cung cấp cách duy nhất để người dung có thể tương tác với phần cứng. Nó có thể được xem như sổ tay hướng dẫn của lập trình viên vì nó là phần của máy hiển thị với người lập trình hợp ngữ, người viết trình biên dịch và người lập trình ứng dụng. [1] ISA xác định các kiểu dữ liệu được hỗ trợ, các thanh ghi, cách phần cứng quản lý bộ nhớ chính, các tính năng chính (chẳng hạn như bộ nhớ ảo), các lệnh mà bộ xử lý có thể thực thi và mô hình đâu vào/đầu ra của nhiều triển khai ISA. ISA có thể được mở rộng bằng cách thêm hướng dẫn hoặc các khả năng khác hoặc bằng cách thêm hỗ trợ cho các địa chỉ và giá trị dữ liệu lớn hơn. 1.1.1. Tổng quan về kiến trúc tập lệnh RISC-V RISC-V là một kiến trúc tập lệnh (Instruction Set Architecture - ISA) mã nguồn mở dựa trên nguyên tắc RISC giống như MIPS, ngoại trừ RISC-V ISA được cung cấp giấy phép nguồn mở không yêu cầu bất kỳ khoản phí nào để sử dụng. Nhiều công ty đang sản xuất hoặc đã giới thiệu phần cứng RISC-V, Hệ điều hành mã nguồn mở hỗ trợ RISC-V như Nvidia, Western Digital, … RISC-V được cấu trúc như một ISA cơ sở nhỏ với nhiều phần mở rộng tùy chọn khác nhau. ISA cơ sở của RISC-V rất đơn giản, làm cho RISC-V phù hợp cho nghiên cứu và giáo dục, nhưng đủ hoàn chỉnh để trở thành ISA phù hợp cho các thiết bị nhúng công suất thấp, giá rẻ. Các phần mở rộng tùy chọn tạo thành ISA mạnh mẽ hơn cho mục đích chung và tính toán hiệu suất cao. 15 RISC-V cũng xác định một tập hợp các phần mở rộng tiêu chuẩn để cung cấp một số tính năng cụ thể: [2] • Số nguyên cơ sở ISA, được đặt là “I” (tiền tố là RV32 hoặc RV64 tùy thuộc vào độ rộng thanh ghi số nguyên) và chứa các lệnh tính toán số nguyên, nạp số nguyên, lưu số nguyên và điều khiển luồng câu lệnh. • Phần mở rộng phép nhân và phép chia, được đặt là “M” và them các lệnh để nhân và chia các giá trị được giữ trong thanh ghi số nguyên. • Phần mở rộng lệnh nguyên tử tiêu chuẩn, được ký hiệu là “A”, thêm các lệnh có thể đọc, sửa đổi và ghi nguyên tử vào bộ nhớ để đồng bộ hóa giữa các bộ xử lý. • Phần mở rộng dấu chấm động chính xác đơn tiêu chuẩn, được ký hiệu là “F”, thêm các thanh ghi dấu chấm động, lệnh tính toán chính xác đơn, nạp và lưu trữ chính xác đơn. • Phần mở rộng dấu chấm động chính xác kép tiêu chuẩn, được ký hiệu là “D”, mở rộng các thanh ghi dấu phẩy động và thêm các lệnh tính toán chính xác kép, nạp và lưu trữ. • Phần mở rộng nén tiêu chuẩn, được ký hiệu là “C”, cung cấp các dạng lệnh phổ biến hơn 16-bit • Các tiêu chuẩn khác (L, B, J, T, ….) được giới thiệu nhưng đây chỉ là phiên bản nháp và cần thời gian để phát triển (Xem chi tiết các phần mở rộng khác trong bảng 1.1). Bảng 1.1: Trạng thái phiên bản của ISA cơ sở và các phần mở rộng Base RVWMO RV32I RV64I RV32E RV128I Extension M A Version 2.0 2.1 2.1 1.9 1.7 Version 2.0 2.1 16 Status Ratified Ratified Ratified Draft Draft Status Ratified Ratified F D Q C Counters L B J T P V Zicsr Zifencei Zam Ztso 2.2 2.2 2.2 2.0 2.0 0.0 0.0 0.0 0.0 0.2 0.7 2.0 2.0 0.1 0.1 Ratified Ratified Ratified Ratified Draft Draft Draft Draft Draft Draft Draft Ratified Ratified Draft Frozen 1.1.2. Các kiến trúc tập lệnh x86 là một kiến trúc CISC khác biệt hoàn toàn so với ARM, MIPS, RISCV; chúng đều là các thiết kế RISC khác nhau. Chi tiết hơn, kiến trúc ARM, MIPS, RISC-V dựa trên một loại kiến trúc phổ biến “load-store” hoặc “register-register”, có nghĩa là các hoạt động xử lý dữ liệu hoạt động trên nội dung thanh ghi và chỉ nạp và lưu trữ các lệnh có thể truy cập bộ nhớ.[3] Mỗi kiến trúc vẫn có thuận lợi và bất lợi riêng. Bảng 1.2 minh họa ưu điểm và nhược điểm ISA của chúng; các bộ xử lý được xây dựng từ các ISA này.[3] Bảng 1.2: Thuận lợi và bất lợi của mỗi ISA ISA Thuận lợi Bất lợi x86 • Tất cả các phần mềm phổ biến • Có bộ thanh ghi “anemic”. đã được chuyển sang hoặc được • x86 không thể ảo hóa theo cách cổ điển. phát triển cho x86. • Là kiến trúc phổ biến nhất trên • Yêu cầu cấp phép sử dụng. thị trường máy tính xách tay, máy tính để bàn và máy chủ. 17 ARMv7 • ARMv7 định nghĩa 3 lớp (A, R, • Không hỗ trợ địa chỉ 64-bit. M) cho một ứng dụng cụ thể. • Số lượng lớn phần mềm đã • ARMv7 rất rộng và phức tạp để triển khai. được chuyển đến ISA và phổ • Yêu cầu cấp phép sử dụng. biến trong các thiết bị nhúng và • ARMv7 không thể ảo hóa theo di động. cách cổ điển. • ARMv7 cho đến nay là kiến trúc được triển khai rộng rãi nhất trên thế giới. ARMv8 • ARMv8 đã được mở rộng lên • ISA vẫn phức tạp và khó sử 64-bit, tập lệnh được thiết kế từ đầu, khắc phục nhiều sự cố cũ. • Khả năng tương thích ngược. dụng. • Không hỗ trợ mã hóa lệnh compressed. • Yêu cầu cấp phép sử dụng. MIPS • Tất cả các lệnh opcode có 4 • Một phần nhỏ không gian bytes đơn giản hóa bộ giải mã opcode có sẵn cho các phần lệnh. mở rộng ISA. • Tập lệnh MIPS số nguyên ở • ISA được tối ưu hóa quá mức mức độ người dùng chỉ bao cho một mẫu vi kiến trúc cụ gồm 58 lệnh. thể, five-stage, single-issue, • Tập lệnh phức tạp và phần cứng in-order pipeline. được giảm bớt, tạo điều kiện • Yêu cầu cấp phép sử dụng. thuận lợi cho việc triển khai kỹ thuật pipeline không bị tốn kém. RISC-V • Lệnh mã hóa tốt (imm field), có • Nhiều tiện ích mở rộng không thể sử dụng một bộ giải mã cho nhiều định dạng lệnh. 18 phải là bản tiêu chuẩn, cần • Cộng đồng đa dạng và có công thời gian để tối ưu hóa và phát triển. cụ hỗ trợ. • RISC-V là mã nguồn mở. • Khả năng mở rộng cao. Kiến trúc X86, ARM, MIPS thiếu một số tính năng kỹ thuật và yêu cầu phí giấy phép để hoạt động trên ISA của chúng. Đó là lý do tại sao chúng emq chọn RISC-V cho khóa luận của mình, một ISA miễn phí và mở, tránh được những nhược điểm kỹ thuật của ISA cũ và dễ dàng triển khai theo nhiều phong cách vi kiến trúc. Phần tiếp theo giới thiệu thêm về kiến trúc RISC-V. 1.2. Chi tiết kiến trúc tập lệnh RISC-V RISC-V được định nghĩa để hỗ trợ nghiên cứu trong các kiến trúc song song dữ liệu, chữ số la mã “V” được sử dụng như một cách chơi chữ, đó là chữ viết tắt của “Vector”. RISC-V tạo ra ISA phù hợp với hầu hết mọi thiết bị máy tính và chúng đáp ứng tất cả các mục tiêu kỹ thuật cụ thể khi bắt đầu phát triển ISA này: [3] • Tách ISA thành một ISA cơ sở nhỏ và các phần mở rộng tùy chọn. • Hỗ trợ cả không gian đại chỉ 32-bit và 64-bit. • Tạo điều kiện thuận lợi cho các phần mở rộng ISA tùy chỉnh. • Hỗ trợ phần mở rộng tập lệnh có độ dài thay đổi. • Cung cấp hỗ trợ hóa phần cứng hiệu quả cho các tiêu chuẩn hiện đại. • Trực quan hóa ISA cỉa người dùng và kiến trúc đặc quyền. Trong khóa luận này, nhóm thực hiện nhóm lệnh RV32I, đây là ISA số nguyên 32-bit cơ sở. RV32I là một tập lệnh đơn giản, số lượng lệnh phần cứng ở mức độ người dùng lên đến 40 lệnh, đủ hoàn chỉnh để tạo thành mục tiêu trình biên dịch và đáp ứng các yêu cầu cơ bản. Giống như các bộ lệnh RISC khác, các lệnh này được chia thành ba loại (tính toán, luồng điều khiển và truy cập bộ nhớ). Bởi vì RISC-V là kiến trúc lưu trữ nạp, trong đó các lệnh số học chỉ hoạt động trên các thanh ghi, chỉ tải và lưu trữ cho phép truyền dữ liệu đến và đi từ bộ nhớ. 19 Các chế độ định địa chỉ của hướng dẫn RISC-V như sau: • Định địa chỉ tức thời, trong đó toán hạng là một hằng số trong chính lệnh đó. • Định địa chỉ thanh ghi, trong đó toán hạng là một thanh ghi. • Định địa chỉ cơ sở hoặc chuyển vị, trong đó toán hạng ở vị trí bộ nhớ có địa chỉ là tổng thanh ghi và một hằng số trong lệnh. • Định địa chỉ tương đối PC, trong đó địa chỉ nhánh là tổng PC và một hằng số trong lệnh. Bảng 1.3 sau cho thấy 32 thanh ghi có chiều rộng 32-bit và được gán cho một mục đích sử dụng cụ thể. Thanh ghi x0 được nối với tất cả các bit bằng 0. Thanh ghi đích x1 - x31 giữ các giá trị mà các lệnh khác nhau diễn giải dưới dạng tập hợp các giá trị Boolean hoặc dưới dạng bổ sung của hai số nguyên nhị phân có dấu hoặc số nguyên nhị phân không dấu. Thanh ghi bổ sung duy nhấy là bộ đếm (pc) cụ thể là chứa địa chỉ của lệnh hiện tại. [2] Bảng 1.3: Quy ước các thanh ghi của RISC-V Name (ABI) x0(zero) Register Usage number 0 The constant value 0 x1 (ra) 1 Return address (link register) x2 (sp) 2 Stack pointer x3 (gp) 3 Global pointer x4 (tp) 4 Thread pointer x5-x7 (t0-t2) 5-7 Temporaries x8-x9 (s0-s1) 8-9 Saved x10-x17 (a0-a7) 10-17 Arguments/results 20 x18-x27 (s0- 18-27 Saved 28-31 Temporaries s11) x28-x31(t3-t6) Bốn mươi lệnh được mã hóa thành các định dạng lệnh: R, I, S, B, U, J (được mô tả ở hình 1.1). Trong các định dạng ngày, các lệnh tạo nguồn tối đa hai toán hạng thanh ghi, được xác định bởi rs1 và rs2 và tạo ra tối đa một kết quả, ghi vào thanh ghi rd. Một tính năng quan trọng của mã hóa này là các thanh ghi “specifiers”, luôn chiếm một vị trí trong lệnh. Thuộc tính này cho phép tìm nạp thanh ghi tiến hành song song với giải mã lệnh, cải thiện một đường dẫn quan trọng trong nhiều triển khai. Hình 1.1: Định dạng tập lệnh RV32I Chức năng của từng lệnh mà nhóm thực hiện sử dụng trong khóa luận này được thể hiện trong bảng 1.4 (để giữ nguyên được ý nghĩa của lệnh nhóm xin phép được sử dụng tiếng anh để trình bày). Bảng 1.4: Lệnh RV32I thông qua ngôn ngữ assembly Ví dụ Ý nghĩa Add add x5, x6, x7 x5 = x6 + x7 Subtract sub x5, x6, x7 x5 = x6 - x7 Lệnh 21 Ghi chú Three register operands Three register operands Add immediate addi x5, x6, 20 x5 = x6 + 20 Set if less than slt x5, x6, x7 x5 = 1 if x5 < x6, else 0 sltu x5, x6, x7 x5 = 1 if x5 < x6, else 0 slti x5, x6, x7 x5 = 1 if x5 < x6, else 0 Set if less than, unsigned Set if less than, immediate Set if less than immediate, sltiu x5, x6, x7 x5 = 1 if x5 < x6, else 0 unsigned Used to add constraints Three register operands Three register operands Comparison with immediate Comparison with immediate Word from Load word lw x5, 40(x6) x5 = Memory[x6 + 40] memory to register Word from Store word sw x5, 40(x6) Memory[x6 + 40] = x5 register to memory Halfword from Load halfword lh x5, 40(x6) x5 = Memory[x6 + 40] memory to register Unsigned Load halfword, unsigned lhu x5, 40(x6) x5 = Memory[x6 + 40] halfword from memory to register 22 Halfword from Store halfword sh x5, 40(x6) Memory[x6 + 40] = x5 register to memory Byte from Load byte lb x5, 40(x6) x5 = Memory[x6 + 40] memory to register Load byte, unsigned Store byte Byte halfword lbu x5, 40(x6) x5 = Memory[x6 + 40] from memory to register sb x5, 40(x6) Memory[x6 + 40] = x5 Byte from register to memory Load; 1st half of Load reserved lr.w x5, (x6) x5 = Memory[x6] an atomic swap sequence Store sc.w x7, x5, Memory[x6] = x5; x7 = conditional (x6) 0/1 Load upper lui x5, immediate 0x12345 Add upper immediate to PC auipc x5, 0x12345 Store; 2nd half of an atomic swap sequence Loads 20-bit x5 = 0x12345000 constant shifted left 12 bits Used for PC- x5 = PC + 0x12345000 relative data addressing Three reg. And and x5, x6, x7 x5 = x6 & x7 operands; bit-bybit AND 23 Three reg. Inclusive or or x5, x6, x8 x5 = x6 | x8 operands; bit-bybit OR Three reg. Exclusive or xor x5, x6, x9 x5 = x6 ^ x9 operands; bit-bybit XOR And immediate Inclusive or immediate Exclusive or immediate Shift left logical Shift right logical Shift right arithmetic andi x5, x6, 20 x5 = x6 & 20 ori x5, x6, 20 x5 = x6 | 20 xori x5, x6, 20 x5 = x6 ^ 20 sll x5, x6, x7 x5 = x6 << x7 srl x5, x6, x7 x5 = x6 >> x7 sra x5, x6, x7 x5 = x6 >> x7 slli x5, x6, 3 x5 = x6 << 3 srli x5, x6, 3 x5 = x6 >> 3 Shift left logical immediate Shift right logical mmediate 24 Bit-by-bit AND reg. with constant Bit-by-bit OR reg. with constant Bit-by-bit XOR reg. with constant Shift left by register Shift right by register Arithmetic shift right by register Shift left by immediate Shift right by immediate Shift right arithmetic Arithmetic shift srai x5, x6, 3 x5 = x6 >> 3 immediate Branch if equal Branch if not equal Branch if less than Branch if immediate beq x5, x6, if (x5 == x6) go to 100 PC+100 bne x5, x6, if (x5 != x6) go to 100 PC+100 blt x5, x6, 100 if (x5 < x6) go to PC+100 bge x5, x6, if (x5 >= x6) go to greater or equal 100 PC+100 Branch if less, bltu x5, x6, if (x5 < x6) go to 100 PC+100 bgeu x5, x6, if (x5 >= x6) go to 100 PC+100 unsigned Branch if greatr/eq, unsigned right by PC-relative branch if registers equal PC-relative branch if registers not equal PC-relative branch if registers less PC-relative branch if registers greater or equal PC-relative branch if registers less PC-relative branch if registers greater or equal x1 = PC+4; go to PC-relative PC+100 procedure call jalr x1, x1 = PC+4; go to Procedure return; 100(x5) x5+100 Jump and link jal x1, 100 Jump and link register 25 indirect call 1.3. Thiết kế hệ thống của CPU Thiết kế FPGA bao gồm các thành phần trong hệ thống máy tính (mô tả hình 1.2): • Processor (RISC-V) • System Cache • DMA • Memory/RAM/BRAM • Peripherals • APB/AHB Bridge • Interconnect Hình 1.2: Kiến trúc hệ thống CPU 26 Chương 2. THIẾT KẾ VI XỬ LÝ RISC-V 32-BIT 2.1. Tổng quan thiết kế vi xử lý Cấu trúc CPU RISC-V pipeline được phát triển từ CPU RISC-V đơn chu kỳ có sơ đồ khối như hình 2.1. Hình 2.1: Hình mô tả CPU RISC-V đơn chu kỳ Dựa trên thiết kế của CPU đơn chu kỳ, ta nhận thấy rằng để thực hiện một câu lệnh cần nhiều nhất là 5 công đoạn. Các trang thái được mô tả chi tiết như bảng 2.1. Bảng 2.1: Bảng mô tả các công đoạn khi xử lý câu lệnh IF ID EX MEM WB Instruction Instruction Execute/address Memory access Write back Fetch decode/register calculation Nạp lệnh file read Giải mã lệnh Tính toán Truy cập MEM Ghi kết quả (nếu có) vào bộ nhớ (nếu có) Cấu trúc pipeline tăng hiệu suất của CPU bằng cách cho các câu lệnh thực hiện song song, giúp cho việc thực thi một chương trình gồm nhiều câu lệnh trở nên 27 nhanh hơn. Tuy nhiên, cần chú ý là pipeline sẽ không làm giảm thời gian thực thi của một câu lệnh. Khi thiết kế CPU có áp dụng pipeline, các giá trị của các tầng pipeline phải được lưu trữ để được xử lý ở các tầng tiếp theo. Do đó thiết kế của CPU đơn chu kỳ sẽ được chia làm 5 tầng tương ứng với 5 công đoạn, ngoài ra giữa các công đoạn sẽ được chèn thêm các thanh ghi để lưu trữ các tín hiệu từ tầng trước như hình 2.2. To inputs of Controller RegWen_2 stage1_rewrite pc_in PC+4pc_out 32 RegWen stage1_rewrite MemRW_2 MemRead BrEq pc_rewrite BrLt BrUn (c) br_comp pc_add4 pc_add4 hazard_detection rd_out_2 rs1 rs2 rd rs1 inst1[24:20] rs2 stall pc_in To input of Mux Hazard 32 2 RegW memRW WB_sel_in pc_sel_out alu_op_out memRW_out RegW_out A_sel_out B_sel_out WB_sel_out A_sel rs1 muxA_out muxA wb alu_out rs1 inst1[11:7] inst1 32 memRW inst1[19:15] inst1[24:20] 32 inst_out 32 A_sel_in (c) B_sel_in (c) RegW alu_op WB_sel_in pc_sel_in inst1[19:15] rd rs2 wb muxB_out pc_branch pc_alu PC muxB IMEM pc_out 32 PC inst 32 inst_in inst pc_out To input of Controller RegWen (c) inst1[19:15] inst2[24:20] pc_sel dataA rs1 pc inst rs2 RegisterFile halt IF_to_ID 5 32 dataB dataB_out_2 32 pc_add4 inst imm_gen imm_out alu_out_4 alu_out pc_add4_4 pc_add4_out dataR_out rd_out data_in alu pc_add4 mux_W wb data_w_4 mem rd_out_4 WB_sel alu_in pc_out_2 EX_to_MEM pc add_br imm_out imm_out_2 wb imm_in dataR_in data_mem_o dataR dataW Addr dataB_out_2 data2_out data2_in ID_to_EX pc_out pc_out pc_add4_out data_out alu_out_3 alu_out dataA_out_2 pc_in inst1[31:7] in2 rd pc_add4_1 pc_out_1 DMEM data_B_out3 data1_in data1_out 2 alu_out alu_out imm_in 32 RegW_out WB_sel_out MemRW_3 MemRW alu_in ALU B_sel pc_rewrite pc_in in1 alu_sel alu_out rs2 RegW WB_sel_in memRW_out RegW_out WB_sel_out MEM_to_WB pc_add4 pc_add4_out pc_branch imm pc_add4_2 pc_add4_out pc_add4 inst2 inst_out inst rd_out_2 rd imm_in rd_out rd_out_3 rd imm_sel (c) EX_MEM_rd MEM_WB_rd RegWen_1 (b) RegWen_2 instr1 instr instr2 instr3 halt rs1_out rs2_out rs2_out_2 rs1 fb rs2forwarding_unit rd_out RegW_in1 RegW_in2 A_sel B_sel branch_detect halt inst1[31:7] fa rs1_out_2 fw_stage inst_out inst3 rd_out_1 rd_out_2 BrEq BrLt inst PCsel RegWen MemRW Alu_sel WBsel branch RegW MemRW alu_op MemReg Controller mux_hazard Asel (c) Bsel (c) imm_sel (c) BrUn (c) RegW_out (b) MemRW_out stall MemReg_out branch_out alu_op_out Hình 2.2: Hình mô tả chi tiết các khối chức năng trong vi xử lý 32-bit RISC-V 5Stage pipeline sử dụng trong khoá luận Các thanh ghi thêm vào được mô tả sau đây: • Thanh ghi IF to ID: Là thanh ghi pipeline phân chia giữa tầng tìm nạp lệnh và giải mã lệnh. • Thanh ghi ID to EX: Là thanh ghi pipeline phân chia giữa tầng giải mã lệnh và tính toán. • Thanh ghi EX to MEM: Là thanh ghi pipeline phân chia giữa tầng tính toán và truy cập bộ nhớ. • Thanh ghi MEM to WB: Là thanh ghi pipeline phân chia giữa tầng truy cập bộ nhớ và tầng ghi kết quả. 2.2. Lý thuyết về xung đột (Pipeline hazard) Xung đột là trạng thái mà lệnh tiếp theo không thể thực thi trong chu kỳ pipeline ngay sau đó (hoặc thực thi nhưng sẽ cho ra kết quả sai). 28 2.2.1. Xung đột cấu trúc (Structure hazard) Xung đột cấu trúc: Xảy ra khi có hai câu lệnh cần truy cập vào cùng một phần cứng trong cùng một chu kỳ nhưng phần cứng chỉ có thể thực thi một câu lệnh trong một chu kỳ. Nói cách khác, xung đột cấu trúc xảy ra khi có hai lệnh cùng truy xuất vào một tài nguyên phần cứng nào đó cùng một lúc. Xung đột cấu trúc trong pipeline xảy ra với lệnh Load, khi câu lệnh cần ghi dữ liệu vào bộ nhớ trong lúc một lệnh khác đang truy cập bộ nhớ. Để giải quyết Structual hazard trong trường hợp này, dữ liệu của câu lệnh R-format sẽ được lưu vào các thanh ghi để được xử lý sau khi xử lý lệnh Load. Hình 2.3: Giải quyết xung đột cấu trúc 2.2.2. Xung đột dữ liệu (Data hazard) Xung đột dữ liệu xảy ra khi một câu lệnh không thể được xử lý trong chu kỳ đã định trước vì dữ liệu cần được xử lý chưa xuất hiện. Data hazard có thể được chia làm 2 loại: • R-format instruction Xung đột dữ liệu có thể được khắc phục bằng cách sử dụng “stall” – không làm gì cả cho đến khi dữ liệu để tính toán xuất hiện. Xét ví dụ sau: 29 add x1, x2,x3 sub x4, x1,x5 Nếu sử dụng stall ta mất 3 chu kì trống. Tuy nhiên dữ liệu cho x đã có sau khi ALU tính toán tại Excecute stage mà không cần đợi đến Write back để lấy dữ liệu. Việc gửi dữ liệu trực tiếp ngay từ ALU gọi là “forwarding”. Hình 2.4: Giải quyết xung đột dữ liệu R-format • Load Instruction Xung đột dữ liệu lệnh Load xuất hiện khi dữ liệu từ lệnh Load chưa được xuất hiện nhưng dữ liệu đó đã được sử dụng cho một câu lệnh khác. Khi xuất hiện câu lệnh sử dụng kết quả từ lệnh Load, phần cứng sẽ được stall một chu kì. Hình 2.5: Giải quyết xung đột dữ liệu lệnh Load 2.2.3. Xung đột điều khiển (Control/Branch hazard) 30 Xung đột điều khiển xảy ra khi một câu lệnh không được xử lý trong chu kỳ đã được định vì câu lệnh được giải mã ở chu kì trước không phải câu lệnh cần được thực thi. Có thể xử lý xung đột điều khiển theo hai cách: • Stall: khi có lệnh nhảy có điều kiện, chương trình sẽ được stall cho đến khi thực thi xong lệnh nhảy. Hình 2.6: Xử lý xung đột điều khiển theo cách Stall • Predict: khi có lệnh nhảy có điều kiện, chương trình thực hiện dự đoán địa chỉ câu lệnh kế tiếp và thực thi. Tuy nhiên nếu kết quả dự đoán sai sẽ phải thực hiện lại từ đầu. Hình 2.7: Xử lý xung đột điều khiển theo cách Predi 31 2.3. Các khối chức năng có trong vi xử lý thông qua từng giai đoạn 2.3.1. Controller Tín hiệu điều khiển trong CPU pipeline được giữ nguyên so với CPU đơn chu kỳ. Tuy nhiên, không phải tất cả tín hiệu đều được sử dụng trong cùng một chu kỳ, cho nên các tín hiệu điều khiển phải được lưu trữ thông qua các thanh ghi pipeline cho đến khi được sử dụng. Hình 2.8: Hình mô tả các tín hiệu control qua các tầng Trong thiết kế, khối Controller có chức năng điều khiển các khối khác để thực hiện một câu lệnh nhất định nào đó, ngoài ra, các tín hiệu điều khiển cũng được truyền qua khối chức năng Mux Hazard để xử lý các xung đột. Hình 2.9: Module Controller trong thiết kế • Hoạt động: 32 Bảng 2.2: Bảng mô tả tín hiệu điều khiển khối ALU AluSel Chức năng 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 ADD SUB SLL SLT SLTU XOR SRL SRA OR AND BUFFER Bảng 2.3: Bảng mô tả tín hiệu điều khiển thanh ghi PC PC_sel Chức năng 00 pc_add4 01 pc_branch 10 pc_alu (Jal, JALR) 11 Nothing Bảng 2.4: Bảng mô tả tín hiệu điều khiển halt Halt 00 01 10 11 Chức năng nohalt haltA (F rewrite, IF_to_ID work haltB (F rewrite, IF_to_ID block) haltC (F flow, IF_to_ID block) Bảng 2.5: Bảng mô tả tín hiệu điều khiển khối Imm_Gen Imm_Sel I S B U Chức năng 000 001 010 011 33 J 100 Bảng 2.6: Bảng mô tả tín hiệu BrEq BrEq 0 1 Chức năng unbranch branch Bảng 2.7: Bảng mô tả tín hiệu BrLT BrLT 0 1 Chức năng greater less Bảng 2.8: Bảng mô tả tín hiệu BrUn BrUn Chức năng 0 signed 1 unsigned • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.9: Bảng các tín hiệu trong module Controller Tên tín hiệu I/O BrEq BrLt inst pc_sel RegEn BrUn Asel Bsel MemRW imm_sel Alu_sel WBsel I I I O O O O O O O O O Width (bit) 1 1 32 2 1 1 1 1 1 3 4 2 Ý nghĩa Tín hiệu điều khiển cho lệnh so sánh bằng Tín hiệu điều khiển cho lệnh so sánh nhỏ hơn Câu lệnh hiện tại Tín hiệu điều khiển thanh ghi PC Tín hiệu điều khiển tập thanh ghi Regfiles Tín hiệu điều khiển cho lệnh nhảy Tín hiệu điều khiển cho mux A Tín hiệu điều khiển cho mux B Tín hiệu điều khiển cho Memory Tín hiệu điều khiển cho khối Imm_gen Tín hiệu điều khiển (opcode) của ALU Tín hiệu điều khiển cho Mux WB 2.3.2. Instruction Fetch (IF) Giai đoạn Intruction Fetch bao gồm 5 khối chức năng chính: Program Counter, Program Counter add 4, Instruction Memory, IF to ID Register. 34 a) Program Counter (PC) Bộ đếm chương trình, chứa địa chỉ câu lệnh đang được nạp vào bộ nhớ. Hình 2.10: Thanh ghi Program Counter (PC) • Hoạt động: o PC reset về địa chỉ ban đầu khi có tín hiệu rst_n tích cực thấp. o PC cập nhật địa chỉ câu lệnh tiếp theo khi có tín hiệu clk tích cực cao. o Khi có tín hiệu pc_rewrite, halt, PC giữ nguyên giá trị hiện có. o Khi giá trị của pc_sel là 2’b01, ngõ ra pc_out sẽ lấy giá trị pc_branch từ khối add_br để nhảy đến địa chỉ tương ứng. Khi pc_sel là 2’b10 (dùng cho lệnh JAL, JALR), ngõ ra pc_out lấy giá trị của pc_alu sau khi khối ALU tính toán xong. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.10: Bảng các tín hiệu trong thanh ghi PC clk rst_n I I Width (bit) 1 1 pc_rewrite I 1 pc_in pc_branch pc_alu pc_sel halt pc_out I I I I I O 32 32 32 2 2 32 Tên tín hiệu I/O Ý nghĩa Tín hiệu xung clock tích cực cạnh lên Tín hiệu reset tích cực mức thấp Tín hiệu thông báo để PC giữ nguyên giá trị hiện tại Địa chỉ PC đầu vào Địa chỉ PC mà lệnh Branch sử dụng để nhảy tới Địa chỉ PC sau khi ALU tính toán xong địa chỉ Tín hiệu để chọn giữa pc_branch hoặc pc_sel Tín hiệu để hold địa chỉ PC hiện tại Địa chỉ PC đầu ra 35 b) Program Counter add 4 (PC_add4) • Khối chức năng tính toán địa chỉ của câu lệnh kế tiếp. Hình 2.11: Module Program Counter add 4 (PC_add4) • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.11: Bảng các tín hiệu trong thanh ghi PC_add4 Tên tín hiệu I/O pc_in pc_out I I Width (bit) 32 32 Ý nghĩa Địa chỉ PC đầu vào Địa chỉ PC đầu ra c) Instruction Memory (IMEM) • Khối chức năng đóng vai trò là bộ nhớ của chương trình, chứa câu lệnh có địa chỉ lưu trong PC. Khối này được dùng tạm thời để test chức năng của CPU trước khi được tháo ra để tiến hành thiết kế Block Design. Hình 2.12: Module IMEM • Các tín hiệu ngõ vào và ngõ ra: 36 Bảng 2.12: Bảng các tín hiệu trong module IMEM Tên tín hiệu I/O PC inst I I Width (bit) 32 32 Ý nghĩa Địa chỉ cần đọc câu lệnh Câu lệnh tương ứng với địa chỉ PC d) Thanh ghi IF to ID (IF_to_ID) • Khối chức năng lưu các giá trị từ tầng Instruction Fetch. Hình 2.13: Thanh ghi IF to ID (IF_to_ID) • Hoạt động: o Các giá trị từ tầng Instruction Fetch như: pc_add4, pc_in, inst_in được cập nhật sau mỗi chu kì clock clk và bị xoá khi có rst_n. o Khi có tín hiệu stage1_rewrite, các giá trị trong thanh ghi này được giữ nguyên. o Khi có tín hiệu halt, các giá trị trong thanh ghi là unknown (32’hxxxxxxxx). 37 • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.13: Bảng các tín hiệu trong thanh ghi IF_to_ID Tên tín hiệu I/O clk rst_n pc_add4 pc_in I I I I Width (bit) 1 1 32 32 inst_in I 32 halt stage1_rewrite inst_out pc_out pc_add4_out I I O O O 2 1 32 32 32 Ý nghĩa Tín hiệu xung clock tích cực cạnh lên Tín hiệu reset tích cực mức thấp Địa chỉ PC từ khối PC_add4 Địa chỉ PC từ khối PC Câu lệnh tương ứng với địa chỉ PC được nạp vào CPU Tín hiệu hoãn Tín hiệu hoãn Câu lệnh cần thực thi Địa chỉ PC đầu ra Địa chỉ PC_add4 đầu ra 2.3.3. Instruction Decode (ID) Giai đoạn Intruction Decode bao gồm 5 khối chức năng chính: Register File, Immediate Gen, Branch Detection, Branch Comparator, ID to EX Register. a) Register File • Tập các thanh ghi cho phép truy xuất dữ liệu, bao gồm 32 thanh ghi, mỗi thanh ghi có độ dài 32 bits. Hình 2.14: Register file • Hoạt động: o Khi có tín hiệu clk, module sử dụng giá trị inst1[19:15] để xác định miền giá trị của rs1 và xuất giá trị lưu trong rs1 đến ngõ ra dataA; sử dụng giá trị inst1[29:24] để xác định miền giá trị của 38 rs2 và xuất giá trị lưu trong rs2 đến ngõ ra dataB; sử dụng giá trị rd_out2 để xác định miền rd. o Khi có tín hiệu cho phép ghi RegWen_out3, giá trị của wb sẽ được lưu vào tập thanh ghi. o Để đảm bảo trong mỗi chu kỳ chỉ có một câu lệnh được xử lý, các tín hiệu điều khiển được lấy từ tầng Write Back. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.14: Bảng các tín hiệu trong RegFile Tên tín hiệu I/O clk rst_n rs1 rs2 rd wb RegWen dataA dataB I I I I I I I O O Width (bit) 1 1 5 5 5 32 1 32 32 Ý nghĩa Tín hiệu xung clock tích cực cạnh lên Tín hiệu reset tích cực mức thấp Trường giá trị rs1 của inst1 Trường giá trị rs2 của inst1 Trường giá trị rd Dữ liệu cần ghi sau khi tính toán Tín hiệu cho phép ghi (1: write, 0: read) Dữ liệu đầu ra A Dữ liệu đầu ra B b) Immediate Generator (imm_gen) • Khối chức năng thực hiện mở rộng dấu tuỳ thuộc vào câu lệnh đang được thực thi. Hình 2.15: Module imm_gen • Hoạt động: Tín hiệu điều khiển imm_sel từ khối Controller quyết định cách mở rộng dấu tuỳ thuộc vào dạng lệnh (I, S, B, U, J, R). • Các tín hiệu ngõ vào và ngõ ra: 39 Bảng 2.15: Bảng các tín hiệu trong khối imm_gen Width (bit) 25 3 32 Tên tín hiệu I/O imm_in imm_sel imm_out I I O Ý nghĩa Tín hiệu ngõ vào từ trường giá trị inst1[31:7] Tín hiệu điều khiển thao tác mở rộng dấu Tín hiệu ngõ ra sau khi được mở rộng dấu c) Branch Comparator (br_comp) • Khối chức năng thực hiện so sánh dùng cho các lệnh Branch. Hình 2.16: Module Branch Comparator • Hoạt động: o So sánh giá trị giữa dataA và dataB, nếu kết quả nhỏ hơn thì xuất giá trị BrLt là 1, nếu lớn hơn là 0, nếu bằng thì xuất giá trị BrEq về Controller. o Ngõ vào BrUn quyết định phép so sánh là có dấu hay không dấu • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.16: Bảng các tín hiệu trong khối br_comp rs1 rs2 I I Width (bit) 32 32 BrUn I 1 BrEq BrLt O O 1 1 Tên tín hiệu I/O Ý nghĩa Ngõ vào A Ngõ vào B Tín hiệu điều khiển phép so sánh có dấu hoặc không dấu Tín hiệu ngõ ra cho lệnh so sánh bằng Tín hiệu ngõ ra cho lệnh so sánh nhỏ hơn d) Branch Detection (branch_detect) 40 • Khối chức năng phát hiện lệnh nhảy (Branch). Hình 2.17: Module Branch Detection • Hoạt động: Tiến hành kiểm tra opcode của inst[6:0] để xác định loại lệnh nhảy nào. Sau khi xác định được sẽ sử dụng tín hiệu halt để dừng nạp câu lệnh mới nhằm tránh sai sót tại địa chỉ PC. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.17: Bảng các tín hiệu trong khối branch_detect Tên tín hiệu I/O instr instr1 instr2 instr3 RegWen_1 RegWen_2 Rd_out_1 Rd_out_2 halt I I I I I I I I O Width (bit) 32 32 32 32 1 1 5 5 2 Ý nghĩa Tín hiệu inst từ IF Stage Tín hiệu inst từ ID Stage Tín hiệu inst từ EX Stage Tín hiệu inst từ MEM Stage Tín hiệu RegWen từ khối Mux Hazard Tín hiệu RegWen từ thanh ghi ID_to_EX Trường giá trị inst1[11:7] Trường giá trị rd từ thanh ghi ID_to_EX Tín hiệu điều khiển hoãn dùng cho các PC e) Hazard Detection • Khối chức năng phát hiện xung đột. 41 Hình 2.18: Module Hazard Detection • Hoạt động: Thực hiện so sánh trường rd của câu lệnh trước với các trường rs1, rs2 của câu lệnh sau để kiểm tra, khi phát hiện một lệnh cần sử dụng giá trị chưa được xử lý xong từ lệnh load thì các tín hiệu điều khiển bị xoá, giá trị được lưu tại PC và thanh ghi ID_to_EX được giữ nguyên không cập nhật. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.18: Bảng các tín hiệu trong khối Hazard Detection Tên tín hiệu I/O rd rs1 rs2 MemRead RegWen I I I I I Width (bit) 5 5 5 1 1 pc_rewrite O 1 stage1_rewrite O 1 stall O 1 Ý nghĩa Trường giá trị rd từ thanh ghi ID_to_EX Trường giá trị inst1[19:15] Trường giá trị inst1[24:20] Tín hiệu MemRead từ thanh ghi ID_to_EX Tín hiệu RegWen từ thanh ghi ID_to_EX Tín hiệu đầu ra dùng để điều khiển thanh ghi PC Tín hiệu đầu ra dùng để điều khiển thanh ghi IF_to_ID Tín hiệu đầu ra được kết nối với Mux Hazard f) ID to EX Register (ID_to_EX) • Khối chức năng lưu các giá trị từ tầng Instruction Decode. 42 Hình 2.19: Thanh ghi ID to EX (ID_to_EX) • Hoạt động: Khi có tín hiệu xung clock clk, thanh ghi thực hiện lưu các giá trị từ tầng ID. Khi có tín hiệu reset rst_n thì các giá trị hiện tại bị xoá. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.19: Bảng các tín hiệu trong thanh ghi ID_to_EX Tên tín hiệu I/O clk rst_n pc_in pc_add4 data1_in data2_in imm_in inst rd rs1 rs2 alu_op memRW A_sel_in B_sel_in I I I I I I I I I I I I I I I Width (bit) 1 1 32 32 32 32 32 32 5 5 5 4 1 1 1 Ý nghĩa Tín hiệu xung clock tích cực cạnh lên Tín hiệu reset tích cực mức thấp Tín hiệu PC đầu vào Tín hiệu PC_add4 đầu vào Dữ liệu từ đầu ra 1 của tập thanh ghi Dữ liệu từ đầu ra 2 của tập thanh ghi Tín hiệu từ đầu ra của khối imm_gen Tín hiệu inst1 Trường giá trị inst1[11:7] Trường giá trị inst1[19:15] Trường giá trị inst1[24:20] Tín hiệu đầu vào dùng để điều khiển ALU Tín hiệu đầu vào từ Mux Hazard Tín hiệu đầu vào từ Controller Tín hiệu đầu vào từ Controller 43 pc_sel_in RegW WB_sel_in alu_op_out I I I O 2 1 2 4 memRW_out O 1 pc_sel_out O 2 RegW_out O 1 A_sel_out O 1 B_sel_out O 1 WB_sel_out O 2 pc_out O 32 pc_add4_out O 32 rd_out O 5 rs1_out rs2_out data1_out data2_out O O O O 5 5 32 32 imm_out O 32 inst_out O 32 Tín hiệu đầu vào từ Mux Hazard Tín hiệu đầu vào từ Mux Hazard Tín hiệu đầu vào từ Mux Hazard Tín hiệu đầu ra dùng để điều khiển ALU Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu đầu ra dùng để tính toán tại khối add_branch Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu đầu ra dùng cho khối branch_detect và hazard detection Tín hiệu đầu ra dùng cho khối forwarding_unit Tín hiệu đầu ra dùng cho khối forwarding_unit Dữ liệu đầu ra từ đầu ra 1 của tập thanh ghi Dữ liệu đầu ra từ đầu ra 2 của tập thanh ghi Tín hiệu đầu ra dùng để tính toán tại khối add_branch Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng 2.3.4. Execute (EX) Giai đoạn Execute bao gồm 6 khối chức năng chính: Multiplexor 1, Multiplexor 2, Arithmetic Logic Unit, Forwarding Unit, Addition Branch, EX to MEM Register. a) Multiplexor 1 (muxA) • Khối chức năng lựa chọn giá trị đưa vào khối ALU để tính toán. 44 Hình 2.20: Module MuxA • Hoạt động: Thực hiện lựa chọn giá trị toán hạng muxA_out được điều khiển bởi tín hiệu A_sel để đưa giá trị vào khối ALU từ wb, data1_out và alu_out2, fa từ forwarding_unit. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.20: Bảng các tín hiệu trong khối MuxA rs1 wb I I Width (bit) 32 32 alu_out I 32 A_sel muxA_out I O 2 32 Tên tín hiệu I/O Ý nghĩa Tín hiệu rs1 nhận từ thanh ghi ID_to_EX Tín hiệu wb nhận từ MuxW tại tầng Write Back Giá trị đầu ra của ALU được lưu tại thanh ghi EX_to_MEM Tín hiệu điều khiển MuxA Giá trị đầu ra MuxA b) Multiplexor 2 (muxB) • Khối chức năng lựa chọn giá trị đưa vào khối ALU để tính toán. Hình 2.21: Module MuxB 45 • Hoạt động: Thực hiện lựa chọn giá trị toán hạng muxB_out được điều khiển bởi tín hiệu B_sel để đưa giá trị vào khối ALU từ imm_out1, data2_out, alu_out2, fa từ forwarding_unit. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.21: Bảng các tín hiệu trong khối MuxB rs2 wb I I Width (bit) 32 32 alu_out I 32 imm_in B_sel muxB_out I I O 32 2 32 Tên tín hiệu I/O Ý nghĩa Tín hiệu rs2 nhận từ thanh ghi ID_to_EX Tín hiệu wb nhận từ MuxW tại tầng Write Back Giá trị đầu ra của ALU được lưu tại thanh ghi EX_to_MEM Tín hiệu imm nhận từ thanh ghi ID_to_EX Tín hiệu điều khiển MuxB Giá trị đầu ra MuxB c) Arithmetic Logic Unit (ALU) • Khối chức năng chính thực hiện các phép tính trong CPU. Hình 2.22: Module ALU • Hoạt động: Khi nhận tín hiệu alu_op, tiến hành thực hiện các phép tính ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, AND, … • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.22: Bảng các tín hiệu trong khối ALU in1 in2 I I Width (bit) 32 32 alu_sel I 4 alu_out O 32 Tên tín hiệu I/O Ý nghĩa Giá trị từ MuxA Giá trị từ MuxB Tín hiệu điều khiển thực hiện chọn phép tính thích hợp Tín hiệu đầu ra thể hiện kết quả của phép tính 46 d) Forwarding Unit (forwarding_unit) • Khối chức năng xử lý xung đột. Hình 2.23: Module Forwarding Unit • Hoạt động: Thực hiện kiểm tra thanh ghi đích rd ở MEM/WB Stage: o Nếu rd_out_1 trùng với rs1: fa chọn giá trị alu_out_2 vào khối ALU. Nếu rd_out_2 và rd_out_3 trùng với rs1: fa chọn giá trị wb vào khối ALU o Nếu không trùng có nghĩa là không có xung đột, fa sẽ chọn data1_out. Nếu có tín hiệu B_sel thì fb sẽ chọn data2_out cho ALU, nếu không có thì fb sẽ chọn imm_out1 cho ALU. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.23: Bảng các tín hiệu trong khối forwarding_unit Tên tín hiệu I/O EX_MEM_rd MEM_WB_rd rs1 rs2 RegW_in1 RegW_in2 A_sel B_sel fa fb I I I I I I I I O O Width (bit) 5 5 5 5 1 1 1 1 2 2 Ý nghĩa Giá trị thanh ghi rd từ thanh ghi EX_to_MEM Giá trị thanh ghi rd từ thanh ghi MEM_to_WB Giá trị thanh ghi rs1 từ thanh ghi ID_to_EX Giá trị thanh ghi rs2 từ thanh ghi ID_to_EX Tín hiệu RegW từ thanh ghi EX_to_MEM Tín hiệu RegW từ thanh ghi MEM_to_WB Tín hiệu A_sel từ thanh ghi ID_to_EX Tín hiệu B_sel từ thanh ghi ID_to_EX Tín hiệu điều khiển MuxA Tín hiệu điều khiển MuxB e) Addition Branch (add_br) • Khối chức năng tính toán địa chỉ cho lệnh nhảy. 47 Hình 2.24: Module Addition Branch • Hoạt động: Thực hiện cộng giá trị hiện tại của PC với immediate để lấy được địa chỉ mới phục vụ cho lệnh nhảy. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.24: Bảng các tín hiệu trong khối add_br Tên tín hiệu I/O pc imm pc_branch I I O Width (bit) 32 32 32 Ý nghĩa Giá trị pc_out2 từ thanh ghi ID_to_EX Giá trị imm_out2 từ thanh ghi ID_to_EX Địa chỉ mà câu lệnh cần nhảy đến f) EX to MEM Register • Khối chức năng lưu các giá trị từ tầng Execute. Hình 2.25: Thanh ghi EX to MEM (EX_to_MEM) 48 • Hoạt động: Khi có tín hiệu xung clock clk, thanh ghi thực hiện lưu các giá trị từ tầng EX. Khi có tín hiệu reset rst_n thì các giá trị hiện tại bị xoá. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.25: Bảng các tín hiệu trong thanh ghi EX_to_MEM clk rst_n pc_add4 data_in inst alu_in rd memRW RegW WB_sel_in I I I I I I I I I I Width (bit) 1 1 32 32 32 32 5 1 1 2 memRW_out O 1 RegW_out O 1 WB_sel_out O 2 rd_out O 5 pc_add4_out O 32 alu_out O 32 data_out O 32 inst_out O 32 Tên tín hiệu I/O Ý nghĩa Tín hiệu xung clock tích cực cạnh lên Tín hiệu reset tích cực mức thấp Tín hiệu pc_add4_2 từ thanh ghi ID_to_EX Tín hiệu data_B_out2 từ thanh ghi ID_to_EX Tín hiệu inst2 từ thanh ghi ID_to_EX Tín hiệu alu_out từ khối ALU Tín hiệu rd_out_2 từ thanh ghi ID_to_EX Tín hiệu MemRW_2 từ thanh ghi ID_to_EX Tín hiệu RegWen_2 từ thanh ghi ID_to_EX Tín hiệu WBsel_2 từ thanh ghi ID_to_EX Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng 2.3.5. Memory Access (MEM) Giai đoạn Memory Access bao gồm 2 khối chức năng chính: Data Memory, MEM to WB Register. 49 a) Data Memory (DMEM) • Khối chức năng đóng vai trò là bộ nhớ dữ liệu, sử dụng cho các lệnh Load và Store. Khối này được dùng tạm thời để test chức năng của CPU trước khi được tháo ra để tiến hành thiết kế Block Design. Hình 2.26:Module DMEM • Hoạt động: Khi có tín hiệu xung clock clk, DMEM kiểm tra nếu có tín hiệu cho phép truy cập bộ nhớ MemRW_out2. Nếu bằng 1 DMEM thực hiện ghi giá trị dataB_out3 vào thanh ghi có địa chỉ lấy từ alu_out3. Nếu bằng 0 DMEM thực hiện gửi giá trị cần đọc từ DMEM đến dataR. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.26: Bảng các tín hiệu trong khối DMEM Tên tín hiệu I/O clk rst_n dataW Addr MemRW dataR I I I I I O Width (bit) 1 1 32 32 1 32 Ý nghĩa Tín hiệu xung clock tích cực canh lên Tín hiệu reset tích cực mức thấp Giá trị cần ghi Địa chỉ cần ghi/đọc Tín hiệu điều khiển DMEM (1: write, 0: read) Giá trị đọc ra từ DMEM theo địa chỉ tương ứng b) MEM to WB Register • Khối chức năng lưu các giá trị từ tầng Memory Access. 50 Hình 2.27: Thanh ghi MEM to WB (MEM_to_WB) • Hoạt động: Khi có tín hiệu xung clock clk, thanh ghi thực hiện lưu các giá trị từ tầng MEM. Khi có tín hiệu reset rst_n thì các giá trị hiện tại bị xoá. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.27: Bảng các tín hiệu trong thanh ghi MEM_to_WB clk rst_n alu_in pc_add4 dataR_in rd RegW WB_sel_in I I I I I I I I Width (bit) 1 1 32 32 32 5 1 2 RegW_out O 1 WB_sel_out O 2 rd_out O 5 Tên tín hiệu I/O Ý nghĩa Tín hiệu xung clock tích cực canh lên Tín hiệu reset tích cực mức thấp Tín hiệu alu_out_3 từ thanh ghi EX_to_MEM Tín hiệu pc_add4_3 từ thanh ghi EX_to_MEM Dữ liệu từ khối DMEM Tín hiệu rd_out_3 từ thanh ghi EX_to_MEM Tín hiệu RegWen_3 từ thanh ghi EX_to_MEM Tín hiệu WB_sel3 từ thanh ghi EX_to_MEM Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng 51 alu_out O 32 pc_add4_out O 32 dataR_out O 32 Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng Tín hiệu điều khiển/dữ liệu được lưu trữ ở thanh ghi pipeline qua các tầng 2.3.6. Write Back (WB) Giai đoạn Write Back bao gồm 1 khối chức năng chính: Multiplexor a) Multiplexor (mux_W) • Khối chức năng thực hiện chọn giá trị để ghi trở lại vào tập thanh ghi. Hình 2.28: Module Mux_W • Hoạt động: Chọn giá trị để ghi lại tập thanh ghi từ các giá trị: pc_add4_out4, alu_out3, data_out3. • Các tín hiệu ngõ vào và ngõ ra: Bảng 2.28: Bảng các tín hiệu trong khối Mux_W alu I Width (bit) 32 pc_add4 I 32 mem WB_sel wb I I O 32 2 32 Tên tín hiệu I/O Ý nghĩa Tín hiệu alu_out_4 từ thanh ghi MEM_to_WB Tín hiệu pc_add4_out4 từ thanh ghi MEM_to_WB Tín hiệu data_w_4 từ thanh ghi MEM_to_WB Tín hiệu chọn giá trị để ghi lại Giá trị cần được ghi lại 52 Chương 3. THIẾT KẾ VI XỬ LÝ RISC-V 32-BIT VỚI GIAO THỨC AXI4 3.1. Đóng gói vi xử lý RISC-V với giao thức AXI4 3.1.1. Kiến trúc vi xử lý trước khi đóng gói Sau khi hoàn thành bước mô phỏng chức năng của CPU, tiến hành tháo bỏ hai khối IMEM và DMEM khỏi thiết kế. RISC-V IMEM PROCESSOR DMEM Hình 3.1: Kiến trúc vi xử lý RISC-V trước khi đóng gói 3.1.2. Kiến trúc vi xử lý khi đóng gói thành IP Kiến trúc vi xử lý sau khi lược bỏ hai khối IMEM và DMEM sẽ được thay bằng hai khối IP System Cache của Xilinx, giao tiếp qua AXI4. System Cache 1 đóng vai trò như khối IMEM, chứa chương trình để CPU thực hiện. System Cache 2 đóng vai trò như khối DMEM, chứa dữ liệu phục vụ cho các lệnh Load và Store. 53 IP RISCV System Cache (IMEM) RISCV System Cache (DMEM) Hình 3.2: Kiến trúc vi xử lý sau khi đóng gói và được kết nối với IP System Cache 3.2. Giao thức AXI4 3.2.1. Tổng quan giao thức AXI (Advanced eXtensible Interface) là một trong các giao thức BUS (BUS protocol) trong họ AMBA (Advanced Microcontroller Bus Architecture), một họ các bus điều khiển vi xử lý được giới thiệu lần đầu tiên vào năm 1996. Phiên bản đầu tiên của AXI lần đầu tiên được đưa vào AMBA 3.0 vào năm 2003. AMBA 4.0 được phát hành vào năm 2010, bao gồm phiên bản chính thứ hai của AXI là AXI4. Với giao diện eXtensible nâng cao, giao thức AXI4 dựa trên kết nối điểm tới điểm để tránh chia sẻ bus, do đó băng thông cao và độ trễ thấp hơn. AXI được cho là phổ biến trong tất cả các kết nối giao diện AMBA. Có ba loại giao thức AXI4, trong nội dung khóa luận này, nhóm sử dụng giao thức AXI4 - Full (viết tắt là AXI4): • AXI4 - Full: Dành cho yêu cầu ánh xạ bộ nhớ đối với hiệu suất cao • AXI4 - Lite: Đối với giao tiếp ánh xạ bộ nhớ thông lượng thấp, đơn giản (ví dụ: đến và đi từ các thanh ghi trạng thái và điều khiển) • AXI4 - Stream: Truyền streaming data với tốc độ cao 54 Hình 3.3: Kiến trúc chung của giao thức AXI4 Kiến trúc chung của giao thức AXI4 bao gồm AXI Master và AXI Slave, quy định cơ chế, cách thức xử lý cho 2 hoạt động cơ bản: • Đọc (Read): Master lấy dữ liệu từ Slave. • Ghi (Write): Master phát dữ liệu cho Slave. AXI hoạt động dựa trên 5 kênh riêng biệt như hình 3.1 (2 kênh cho việc đọc và 3 kênh cho việc ghi dữ liệu): • Kênh địa chỉ ghi (Write Address Channel) • Kênh ghi dữ liệu (Write Data Channel) • Kênh phản hồi tín hiệu ghi dữ liệu (Write Response Channel) • Kênh địa chỉ đọc (Read Address Channel) • Kênh đọc dữ liệu (Read Data Channel) Thông qua AXI Interconnect, bus AXI có thể thực hiện giao tiếp giữa nhiều AXI Masters và AXI Slavers 55 Hình 3.4: Một transaction đọc của giao thức AXI4 Một transaction đọc bắt đầu từ việc Master thông qua kênh địa chỉ đọc, gửi tín hiệu thông báo cần đọc cũng như địa chỉ đọc tới Slave. Sau khi nhận được tín hiệu từ Master, Slave sẽ gửi trả lại dữ liệu về cho Master cũng như các tín hiệu báo đọc transaction thành công. Bằng cách làm việc với Master và Slave, giao thức AXI4 hoạt động trên năm kênh khác nhau, và vì mỗi kênh có tín hiệu duy nhất của riêng mình, nên nó có thể gửi phản hồi liên tục để có thể nhận và ghi dữ liệu. Bằng cách đó, kênh có mức độ ưu tiên sẽ được phản hồi trước tiên, v.v. Nguồn phải cung cấp tín hiệu hợp lệ và tín hiệu nhận được phản hồi thích hợp từ bộ thu. Một transaction ghi sử dụng địa chỉ ghi, ghi dữ liệu và ghi các kênh phản hồi. Giao thức AXI hỗ trợ burst có độ dài biến thiên, từ 1 đến 16 dữ liệu truyền cho mỗi burst, mỗi burst có kích thước truyền từ 8-bit đến 1024-bit. 56 Hình 3.5: Một transaction ghi của giao thức AXI4 Bằng cách thực hiện truyền tải trong các giai đoạn riêng biệt, AXI4 cho phép việc truyền thông tin được thực hiện một cách có trật tự. Điều này có nghĩa là một yêu cầu tín hiệu đọc hoặc tín hiệu ghi được gửi trước tiên, sau đó dữ liệu mới được chuyển từ nguồn gửi đến nơi nhận. Và đó là cách giao thức AXI4 hoạt động để di chuyển dữ liệu giữa các nguồn khác nhau mà không bị nhiễu. Với rất nhiều thiết bị sử dụng giao thức AXI4, việc kết nối các thiết bị khác nhau vào cùng một Master trở nên dễ dàng hơn vì mức độ ưu tiên được thiết lập. Bằng cách tìm hiểu về cách thức hoạt động của giao diện, có thể đặt các mức độ ưu tiên để việc giao tiếp diễn ra rõ ràng. Qua các mô tả trên, ta thấy giao thức AXI4 có các đặc điểm chung như sau: • Master và Slave phải kết nối với nhau để xác nhận tín hiệu hợp lệ • Việc truyền tín hiệu điều khiển phải theo các pha riêng biệt • Các kênh cần được riêng biệt để việc truyền kiểu tín hiệu liên tục có thể được thực hiện thông qua giao tiếp liên tục 3.2.2. Các tín hiệu cụ thể của giao thức AXI4 trong khóa luận Bảng 3.1: Các tín hiệu trong AXI4 bus Ý nghĩa Tên tín hiệu 57 Kênh địa chỉ ghi Kênh ghi dữ liệu axi_awaddr[31:0] Địa chỉ cần ghi data axi_awvalid Tín hiệu báo địa chỉ ghi hợp lệ axi_awready Tín hiệu báo slave sẵn sàng nhận yêu cầu ghi axi_wdata[63:0] Data cần ghi axi_wstrb[7:0] Tín hiệu cho biết data được ghi như thế nào axi_wlast Tín hiệu báo đó là data ghi cuối cùng axi_wvalid Tín hiệu báo data ghi là hợp lệ axi_wready Tín hiệu báo Slave sẵn sàng nhận data axi_bresp[1:0] Kênh phản hồi tín hiệu ghi dữ liệu Kênh địa chỉ đọc axi_bvalid axi_bready Tín hiệu phản hồi từ Slave cho biết data được ghi là Okay hoặc Fail Tín hiệu Slave phản hồi đã ghi dữ liệu thành công Tín hiệu CPU báo đã nhận được phản hồi từ Slave axi_araddr[31:0] Địa chỉ cần đọc data axi_arvalid Tín hiệu báo địa chỉ đọc hợp lệ axi_arready Tín hiệu báo slave sẵn sàng nhận yêu cầu đọc axi_rdata[63:0] Data đọc được, trả về từ slave Tín hiệu phản hồi data nhận dc axi_rresp[1:0] Kênh đọc dữ liệu là OKAY hoặc FAIL axi_rlast Tín hiệu báo data cuối cùng trong burst axi_rvalid Tín hiệu báo data đọc được là hợp lệ axi_rready Tín hiệu báo CPU sẵn sàng nhận data 58 Chương 4. THIẾT KẾ BLOCK DESIGN TRÊN VIVADO 4.1. Tổng quan thiết kế Block Design 4.1.1. Thiết kế trên Vivado Trong khoá luận này, nhóm sử dụng phần mềm Vivado 2020.2 để thiết kế. Các tập lệnh chương trình sẽ được biên dịch sang dạng mã hex, được lưu dưới định dạng file .coe, sau đó sẽ được nạp vào BRAM. Hình 4.1: Thiết kế Block Design trên phần mềm Vivado 4.2. Các IP của Xilinx dự kiến dùng trong thiết kế Block Design 4.2.1. IP Memory Interface Generator (MIG 7 Series) IP Memory Interface Generator: phần mềm Vivado hỗ trợ IP MIG để khởi tạo giao diện Memory Controller có nhiệm vụ giao tiếp với DDR3 SDRAM bằng giao thức AXI4. 59 Hình 4.2: IP Memory Interface Generator 4.2.2. IP Central Direct Memory Access (IP CDMA) IP Central Direct Memory Access: đây là IP của Xilinx, cung cấp khả năng Truy cập Bộ nhớ Trực tiếp (DMA) có băng thông cao giữa địa chỉ nguồn được ánh xạ với bộ nhớ và địa chỉ đích được ánh xạ bộ nhớ bằng giao thức AXI4. IP CDMA giúp tránh hiện tượng nghẽn cổ chai trong trường hợp vi xử lý (Master) đang yêu cầu đọc từ Slave và ghi giá trị vào Slave cùng lúc. Hình 4.3: IP Central Direct Memory Access (CDMA) 4.2.3. IP AXI Bram Controller IP Block Memory Generator chỉ có các port đơn giản như hình 2.2, muốn giao tiếp được trên bus AXI4 cần phải có thêm IP Bram Controller. IP Block Memory Generator trên Block Design khác với 2 IP sử dụng trong vi xử lý. 60 Hình 4.4: IP Bram Controller và IP Block Memory Generator 61 Chương 5. MÔ PHỎNG VÀ ĐÁNH GIÁ THIẾT KẾ 5.1. Kịch bản kiểm thử trên FPGA Sau khi hoàn thành thiết kế, nhóm tiến hành kiểm tra thiết kế trên FPGA theo hai mô hình khác nhau. Chương trình kiểm tra là các câu lệnh ngẫu nhiên, sau đó sử dụng công cụ Venus tại trang https://venus.cs61c.org/ để biên dịch sang mã máy hex. Ngoài ra, Venus còn có khả năng thực thi các câu lệnh trong tập lệnh RV32I và hiển thị kết quả tương tự như công cụ MARS 4.5 sử dụng cho MIPS. Từ đó nhóm có thể so sánh kết quả của thiết kế với công cụ Venus để đánh giá. Hình 5.1: Giao diện của Venus compiler Kịch bản kiểm thử hình 5.2: Sau khi biên dịch chương trình để kiểm tra chức năng CPU, các câu lệnh sẽ được lưu vào một file với định dạng .coe dưới dạng mã hex. Sau đó, nhóm sẽ nạp file .coe này vào BRAM, từ đây BRAM sẽ chứa dữ liệu là các câu lệnh đã được biên dịch sang mã máy, các câu lệnh này sẽ được BRAM controller chuyển vào I-Cache thông qua giao thức AXI4 khi CPU đưa yêu cầu. 62 IP RISCV DMA AXI4 System Cache (IMEM) BRAM BRAM Controller Interconnect RISCV System Cache (DMEM) Hình 5.2: Kịch bản kiểm thử sử dụng BRAM Kịch bản kiểm thử hình 5.3: Sau khi biên dịch chương trình để kiểm tra chức năng của CPU, các câu lệnh sẽ được lưu tạm vào thẻ SD. Khi CPU đưa ra yêu cầu, DMA sẽ lấy dữ liệu câu lệnh từ SD và lưu trữ tại RAM, I-Cache sẽ đi ra RAM và lấy dữ liệu đó về CPU để thực hiện tính toán. IP RISCV DMA AXI4 System Cache (IMEM) Interconnect AHB Memory/RAM APB AHB Bridge APB System Cache (DMEM) AXI4 RISCV Peripherals SD Hình 5.3: Kịch bản kiểm thử sử dụng SD 63 5.2. Mô phỏng chức năng Nhóm thực hiện kiểm tra chức năng của khối CPU bằng một số lệnh thuộc tập lệnh RV32I. Hình 5.4: Đoạn chương trình assembly và mã máy sau khi biên dịch để kiểm tra chức năng CPU Trong báo cáo này, đoạn chương trình để đánh giá hoạt động của CPU khá ngắn gọn, gồm có tổng cộng 18 lệnh thuộc tập lệnh RV32I như sau: • R-type: 3 lệnh ADD • I-type: 7 lệnh ADDI, 1 lệnh ANDI • S-Type: 1 lệnh SW 64 5.3. • B-Type: 1 lệnh BEQ, 2 lệnh BNE • U-type: Không có • J-Type: 2 lệnh JAR, 1 lệnh JALR Kết quả mô phỏng Sau khi biên dịch lệnh, tiến hành chạy mô phỏng để nạp lệnh vào CPU thông qua khối IMEM bằng lệnh $readmemh. CPU sẽ bắt đầu hoạt động sau khi các tín hiệu rst, clk được khởi tạo. Thanh ghi PC tiến hành lấy câu lệnh đầu tiên từ bộ nhớ IMEM để thực thi. Hình 5.5: Kết quả mô phỏng ba câu lệnh đầu tiên trên phần mềm Vivado Tại câu lệnh đầu tiên của đoạn chương trình trong hình 5.4, lệnh ADDI thực hiện lấy thanh ghi 0 cộng với giá trị 10 và lưu tại thanh ghi thứ 10. Sau 4 chu kỳ xung clock, tại thời điểm 22.5 ns như hình 5.6, giá trị tại thanh ghi 10 mới được cập nhật. Câu lệnh thứ 2 sẽ được nạp vào sau 1 clock của câu lệnh đầu tiên, kết quả của câu lệnh thứ 2 là 1 sẽ có tại thanh ghi thứ 11. Tương tự với câu lệnh thứ 3. Tiến hành so sánh giá trị thanh ghi của CPU với giá trị thanh ghi của phần mềm mô phỏng Venus. 65 Hình 5.6: Kết quả mô phỏng ba câu lệnh đầu tiên trên Venus Từ kết quả như hình 5.6, có thể thấy CPU đã chạy đúng ba câu lệnh đầu tiên, tiến hành chạy tiếp chương trình kiểm tra đến câu lệnh cuối của chương trình. Khi chương trình chạy đến câu lệnh thứ 13, lệnh SW sẽ store dữ liệu vào vùng nhớ thứ 0 trong Memory, kết quả được trình bày như hình 5.7. Hình 5.7: Memory sau khi thực hiện lệnh SW trên CPU Phần mềm Venus cũng có khả năng hiển thị vùng Memory, từ đây nhóm so sánh kết quả Memory của CPU với kết quả Memory trên phần mềm. 66 Hình 5.8: Memory sau khi thực hiện lệnh SW trên phần mềm Từ hình 5.8, ta có thể thấy kết quả ô nhớ thứ 0 của CPU rất giống với ô nhớ thứ 0 trên phần mềm, vậy lệnh SW đã thực hiện đúng. Đoạn chương trình sẽ tiếp tục thực thi như hình 5.9. Hình 5.9: Kết quả thanh ghi của CPU sau khi chạy xong đoạn chương trình Sau khi hoàn thành 18 câu lệnh trong chương trình kiểm tra, giá trị tại thanh ghi thứ 5 và thanh ghi thứ 12 là 0x00375F00, tại thanh ghi thứ 7 là 0x00058980. Tiến hành so sánh với phần mềm Venus. 67 Hình 5.10: Kết quả thanh ghi của phần mềm Venus sau khi chạy xong đoạn chương trình Sau khi hoàn thành quá trình kiểm tra, nhóm nhận thấy kết quả thanh ghi của CPU RISC-V rất giống với kết quả thanh ghi trên phần mềm Venus, từ đây có thể tạm kết luận CPU đã hoạt động đúng các chức năng cơ bản. Nhóm cũng đã kiểm tra thêm nhiều lệnh nhưng chưa được trình bày trong báo cáo này. Sau khi kiểm tra nhóm nhận ra CPU vẫn còn tồn đọng hai vấn đề chính đó là: • Chưa thực thi được toàn bộ lệnh trong tập lệnh RV32I, cụ thể các lệnh chưa thực thi được bao gồm: LB, LH, LBU, LHU, SB, SH. • CPU chỉ có khả năng xử lý xung đột dữ liệu, chưa xử lý được xung đột cấu trúc và xung đột điều khiển. 5.4. Đánh giá thiết kế 5.4.1. Kết quả tổng hợp Sau khi kiểm tra chức năng của CPU thành công, nhóm tiến hành tổng hợp thiết kế và thu được kết quả như hình 5.11. 68 Hình 5.11: Tài nguyên sử dụng của CPU RISC-V Vi xử lý RISC-V sử dụng số lượng LUT dự kiến là 5850 và số lượng FF là 2557. Vì chưa kết nối với IP nào của Xilinx nên lượng tài nguyên sử dụng còn thấp. Hình 5.12: Tài nguyên sử dụng theo từng module của CPU RISC-V 69 Hình 5.12 liệt kê tài nguyên sử dụng theo từng module của vi xử lý. Trong đó, khối EX_to_MEM chiếm nhiều tài nguyên nhất, tiếp đến là khối DMEM. Hình 5.13: Xung clock của CPU RISC-V Vi xử lý chỉ sử dụng một xung clock duy nhất là clk với chu kỳ 6 ns như hình 5.13. Hình 5.14: Phân tích timing cho CPU RISC-V Sau quá trình tổng hợp mạch (synthesis design), phần mềm Vivado đã tính toán và phân tích được thời gian của các path có trong thiết kế. Từ kết quả của hình 5.14, nhóm nhận thấy CPU đã thoả các điều kiện về WNS, WHS, WPWS; vậy CPU đã thoả mãn điều kiện để chạy ở tốc độ 166.667Mhz. Hình 5.15: Tốc độ tối đa dự kiến của CPU RISC-V 5.4.2. Đánh giá thiết kế và so sánh với các đề tài khác Như vậy, sau quá trình tổng hợp nhóm nhận thấy vi xử lý khi chưa tích hợp các IP còn rất nhỏ, vi xử lý có thể hoạt động với tốc độ tối đa là 166.667 MHz. Ngoài ra, vi xử lý còn hạn chế ở việc xử lý lệnh và xung đột như đã đề cập ở cuối 70 mục 5.3. Cuối cùng, do chưa thể mô phỏng được thiết kế ở mức hệ thống trên FPGA nên kết quả đánh giá có thể sai lệch so với thực tế khoảng 5%. Để có thể đánh giá chi tiết thiết kế, nhóm có so sánh với một số thiết kế trong và ngoài nước, được liệt kê trong bảng 5.1. Bảng 5.1: Bảng so sánh các thiết kế RISC-V pipeline [5] Nội dung so sánh Kết quả Thiết kế Thiết kế của RVCoreP của nhóm tác giả [12] Shakti [13] Nguyễn Phan Hoàng Phúc [4] ISA RISC-V RISC-V RISC-V RISC-V Mở RV32I RV32IA RV32IMFD RV32IMAFD Tần số Dự kiến 50 MHz trên 190 MHz 60 MHz trên hoạt 166.67 MHz Board DE2 trên Board Board Virtex- động trên Board Nexys 4 7 tối đa Virtex-7 DDR Pipeline 5 tầng 6 tầng 5 tầng 5 tầng Tính Kết nối Thiết kế Tối ưu Hiện thực năng được với dual-core và được được Cache nổi bật System hiện thực pipeline cùng với tính Cache thành công rộng năng xử lý ngắt Từ bảng trên cho thấy, thiết kế của tác giả Nguyễn Phan Hoàng Phúc đã hiện thực thành công dual-core, các thiết kế còn lại chỉ dừng lại ở mức single-core. Tuy 71 nhiên, tốc độ đạt được 50 MHz là khá thấp so với luận văn của nhóm (166.667 MHz). 72 Chương 6. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1. Kết luận 6.1.1. Những kinh nghiệm tích lũy Trong quá trình nghiên cứu, thực hiện khóa luận, nhóm đã tiếp thu được nhiều kiến thức quý báu cũng như học hỏi được những kỹ năng cần thiết như: • Kỹ năng tìm tài liệu, phân tích và trích xuất thông tin từ nhiều tài liệu khác nhau. • Được ôn lại các kiến thức của môn học như Thiết kế luận lý số, Thiết kế hệ thống số với HDL, tìm hiểu thêm về các kiến thức vi mạch hiện tại. • Học được nhiều kiến thức mới về cấu trúc vi xử lý trong lĩnh vực thiết kế phần cứng, cụ thể là thiết kế RISC-V tích hợp với bộ nhớ Cache và các IP liên quan do Xilinx cung cấp. • Đọc hiểu sơ đồ, datasheet, đặc tả của thiết bị và các IP. • Thực hành, nghiên cứu kit FPGA Virtex-7 VC707. • Kỹ năng nghiên cứu và viết báo cáo khóa luận hoàn chỉnh. 6.1.2. Các vấn đề hạn chế Với thời gian còn hạn chế, trong quá trình thực hiện đề tài khóa luận, nhóm không thể tránh khỏi những khó khăn và sai sót do một số giới hạn liên quan đến chuyên ngành chuyên sâu, do đó sẽ chưa hoàn thiện tốt các vấn đề sau: • Chưa thực hiện được hai kịch bản kiểm thử thông qua SD và BRAM. • Vi xử lý chưa đưa được lên hệ thống hoàn chỉnh. • Chưa thực hiện mô phỏng được toàn bộ hệ thống trên FPGA. • Chưa thực hiện được hoàn chỉnh các lệnh trong tập lệnh RV32I. • Số lượng các cổng logic trên vi xử lý còn lớn. 73 6.1.3. Kết quả đạt được Sau khi hoàn thành hoàn thành khóa luận, em đã đạt được những kết quả mong đợi như sau: • Vi xử lý hoạt động thành công với hầu hết lệnh trong tập lệnh RV32I. • Thiết kế pipeline giúp vi xử lý tăng tốc độ xử lý. • Thiết kế giải quyết được xung đột thường gặp (data hazard). • Thiết kế được hệ thống cùng với kịch bản kiểm thử trên FPGA. • Kết nối System Cache với CPU. 6.2. Hướng phát triển Trong tương lai, để cải tiến chất lượng, cũng như đối với sự phát triển thêm của khóa luận, em xin đề xuất các ý kiến sau: • Mở rộng bộ lệnh cho vi xử lý có thể thực thi như: RV32A, RV64I… • Tích hợp thêm xử lý các ngoại lệ và ngắt. • Tối ưu code Verilog để giảm số lượng cổng logic không cần thiết nhằm tăng tốc vi xử lý và tối ưu tài nguyên. • Phát triển CPU đa nhân đa luồng giúp tăng khả năng xử lý lệnh. 74 TÀI LIỆU THAM KHẢO [1] David A.Patterson and John L. Hennessy, “Computer Architecture: A Quantiative Approach”, Morgan Kaufmann Publishers, 5th edition, [2] David A.Patterson and John L. Hennessy, “Computer Organization and Design: The hardware/software interface”, Morgan Kaufmann Publishers, 5th edition, [3] A. S. Waterman, Design of the RISC-V Instruction Set Architecture, EECS Department, University of California, Berkeley, 2016. [4] Nguyễn Phan Hoàng Phúc, “Nghiên cứu thiết kế vi xử lý đa nhân dựa trên kiến trúc tập lệnh RISC-V”, Khóa luận tốt nghiệp, June 25, 2021. [5] Xilinx, “Vivado Design Suite User Guide” Using the Vivado IDE, UG893 (v2017.3) October 4, 2017. [6] Xilinx, “System Cache v5.0” LogiCore IP Product Guide, Vivado Design Suite, PG118 (v5.0) November 5, 2021. [7] Xilinx, “AXI Reference Guide” Vivado Design Suite, UG1037 (v4.0) July 15, 2017. [8] Xilinx, “VC707 Evaluation Board for the Virtex-7 FPGA” User Guide, UG885 (v1.8) February 20, 2019. [9] Xilinx, “Clocking Wizard v6.0” LogiCore IP Product Guide, Vivado Design Suite, PG065 August 6, 2021. [10] Xilinx, “AXI Central Direct Memory Access v4.1” LogiCore IP Product Guide, Vivado Design Suite, PG034 April 4, 20218. [11] Xilinx, “SmartConnect v1.0” LogiCore IP Product Guide, Vivado Design Suite, PG247 February 3, 2020. [12] Hiromu Miyazaki, Takuto Kanamori, Ashraful Islam, Kenji Kise, "RVCoreP: An optimized RISC-V soft processor of five-stage pipelining," 2020. [13] Akshay Binari, Piyush Birla, Kuruvilla Varghese, Amrutur Bharadwaj, "A RISCV ISA Compatible Processor IP," 2020. 75 PHỤ LỤC I. KIT FPGA XILINX VIRTEX-7 VC707 Giới thiệu KIT FPGA Xilinx Virtex-7 VC707 Bo mạch Virtex®-7 FPGA cung cấp môi trường để phát triển phần cứng và đánh giá các thiết kế trên chip Virtex-7 XC7VX485T-2FFG1761C FPGA. Bo mạch VC707 cung cấp các tính năng chung cho nhiều hệ thống xử lý nhúng, bao gồm bộ nhớ DDR3 SODIMM, giao diện PCI Express® 8 làn, Ethernet PHY ba chế độ, cổng I / O mục đích chung và hai UART interface. Các tính năng khác có thể được thêm vào bằng cách sử dụng thẻ mezzanine gắn vào một trong hai đầu nối VITA-57 FPGA (FMC) được cung cấp trên kit. Sơ đồ khối Hình PI.1: Sơ đồ KIT FPGA VC707[6] Bổ sung cho chip Virtex-7 XC7VX485T-2FFG1761C, thì trên board sẽ gồm các thành phần sau: • Bộ nhớ: 1GB RAM DDR3, 8Kb IIC EEPROM, hỗ trợ SD card • Hiển thị: HDMI, màn hình 2x16 LCD, LEDs x8 • Giao tiếp và kết nối: UART, Ethernet, I2C Thành phần bo mạch VC707 76 Hình PI.2: Cấu trúc KIT FPGA VC707[6] Dưới đây là bảng mô tả thành phần có trên bo mạch KIT FPGA VC707. Bảng PI.1: Mô tả vị trí các thành phần trên KIT FPGA VC707 STT Mô tả thành phần 1 Chip Virtex-7 với quạt làm mát 2 DDR3 SODIMM memory (1 GB) 3 BPI parallel NOR flash memory (1 Gb) 4 USB ULPI transceiver, USB mini-B connector 5 SD card interface connector 6 USB JTAG interface, USB micro-B connector 7 Xung clock chính của hệ thống – 200Mz (mặt sau của bo mạch) 8 Xung clock I2C programmable - 156.250 MHz 9 User SMA clock 10 GTX transceiver SMA reference clock 11 Xung clock Jitter attenuated 12 GTX transceiver Quad 111 – Quad 119 13 PCI Express connector 77 14 SFP/SFP+ module connector 15 10/100/1000 Mb/s Ethernet PHY 16 SGMII GTX transceiver clock generator 17 Cổng USB-to-UART 18 HDMI video connector, HDMI controller 19 Màn hình LCD và cổng kết nối 20 I2C Bus Switch 21 Ethernet status LEDs 22 Đèn LED người dùng có thể điều chỉnh được 23 Pushbutton , active-High 24 User DIP Switch 25 User rotary switch (under LCD assembly) 26 User SMA GPIO 27 Công tắc nguồn 28 FPGA PROG pushbutton 29 Config mode/upper linear flash address dip switch 30 FMC HPC1 connector 31 FMC HPC2 connector 32 Power management system 33 Xilinx XADC header 34 GTX receiver SMA (RX) 35 GTX transmitter SMA (TX) 36 2 x 5 shrouded PMBus connector 37 12V power input 2 x 3 connector 78 PHỤ LỤC II. CÁC BƯỚC GENERATE BITSTREAM Để khởi tạo và generate ra tệp bitstream trên Vivado có 4 bước chính sau: Khởi tạo project và RTL code Điều đầu tiền cần làm đó chính là khởi tạo Project trên phần mềm Vivado. Khi cửa sổ “New project” hiện lên, cần điền tên và chọn đường dẫn chứa thư mục. Tiếp theo, chúng ta sẽ cho phần mềm biết RTL code của project là Verilog hay VHDL. Sau đó trong cửa sổ để chọn FPGA, cần chỉ rõ rằng kit đang sử dụng đó là Virtex-7 XC7VX485T-2FFG1761C. Dùng ngôn ngữ mô tả phần cứng Verilog hoặc VHDL để thể hiện hóa sơ đồ mạch thiết kế. Thiết kế mức RTL chưa cần quan tâm đến cấu tạo chi viết của mạch mà chú trọng hơn vào chức năng dựa trên kết quả tính toán, cũng như sự luân chuyển dữ liệu của các thanh ghi. Tạo tệp constraint Tệp constraint là loại tệp rất quan trọng với bất kì phần mềm liên quan đến thiết kế vi mạch, trong Vivado, tệp constraint có đuôi là .xdc (Xilinx Design Constraint). Khi lập trình FPGA trên Vivado của Xilinx, cần thông báo cho phần mềm biết các pin port đang sử dụng hoặc kết nối đến RTL code đã viết ở trên để mô tả hoạt động của FPGA. Hình PII.1: Têp constraint trong Vivado Mô hình hóa RTL code, chạy synthesis và implementation 1) Mô hình hóa RTL code Đây là bước giúp mô hình RTL code. Thay vì đọc code và tưởng tượng các dây dẫn hay các thanh ghi được kết nối ra sao, phần mềm Vivado sẽ biến RTL code thành dạng biểu diễn hình ảnh tương đương, giúp dễ dàng chỉnh sửa, debug code. 79 Hình PII.2: Mô hình hóa cho RTL code Mux 2-to-1 64-bit trên Vivado 2) Chạy Synthesis cho thiết kế Bước tiếp theo là tổng hợp thiết kế (Synthesis). Đây là quá trình chuyển đổi thiết kế RTL thành một biểu diễn cấp cổng. Vì vậy, về cơ bản, điều này có nghĩa là nó sẽ lấy code Verilog hoặc VHDL và một thư viện standard cell (thư viện UNISIM hay bất kỳ thư viện nào khác) và tạo ra một danh sách mạng cấp cổng làm đầu ra như: Look-up table (LUT), flip-flop… Sau khi kết thúc Synthesis, phần mềm sẽ tạo ra tệp netlist cho giai đoạn sau. 3) Chạy Implementation cho thiết kế Sau đây là giai đoạn hiện thực thiết kế (Implementation). Việc hiện thực về cơ bản của giai đoạn này là place and route (đặt và định tuyến) các dây dẫn hay flip-flop. Vivado sẽ sử dụng một số thuật toán phức tạp để đặt các phần tử của netlist trên FPGA và kết nối tất cả chúng với nhau theo cách đáp ứng tất cả các ràng buộc. Trong quá trình làm khóa luận, em thấy đây là giai đoạn tốn nhiều thời gian nhất, do nếu một phần tử không thể được thực hiện theo các ràng buộc, thì sẽ phải lập lại bản đồ và định tuyến lại cho phần tử đó. 4) Tạo bitstream và tải xuống kit Nếu như đã sửa hết lỗi ở các giai đoạn trên, thì tại thời điểm này, mọi thứ dường như đã chuẩn bị xong. Nếu không thì chỉ có một ngoại lệ, đó là Windows không tìm thấy driver phù hợp cho giao diện USB-to-JTAG, cách tốt nhất cho việc này là cập nhật driver mới. Sau đó, kit Virtex 7 và máy tính sẽ tự động kết nối với nhau, phần mềm Vivado sẽ tạo tệp bitstream và tải tệp bitstream xuống kit thông qua cổng Jtag. 80
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )