đều có những bằng sáng chế trên kiến trúc tập lệnh mà họ đang sở hữu, do đó các công ty này đều tính phí bản quyền đối với việc sử dụng kiến trúc tập lệnh của các công ty này đồng thời n
Trang 1ĐẠI HỌC QUỐC GIA TP HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
NGUYỄN VĂN LINH
THIẾT KẾ BỘ NHỚ ĐỆM LỆNH CHO VI XỬ LÝ RISC-V
Ngành: KHOA HỌC MÁY TÍNH Mã số: 60480101
LUẬN VĂN THẠC SĨ
TP HỒ CHÍ MINH, tháng 7 năm 2019
Trang 2CÔNG TRÌNH ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG TP HCM
Cán bộ hướng dẫn khoa học: TS Phạm Quốc Cường
Cán bộ chấm nhận xét 1: PGS.TS Phan Công Vinh
2 TS Nguyễn Trần Hữu Nguyên
3 PGS.TS Phan Công Vinh
Trang 3ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
NHIỆM VỤ LUẬN VĂN THẠC SĨ
• • • •
Ngày, tháng, năm sinh: 10/09/1987
TÊN ĐỀ TÀI: Thiết kế bộ nhớ đệm lệnh cho vi xử lý RISC-V
NHIỆM VỤ VÀ NỘI DUNG:
• Nghiên cứu tổng quát yêu cầu của một hệ thống vi điểu khiển IoT
• Nghiên cứu kiến trúc tập lệnh RISC-V, vi kiến trúc của một CPU sử dụng kiến trúc tập lệnh này Nghiên cứu chi tiết về vi điều khiển IoT Pulpino sử dụng CPU RISC-V
• Thiết kế, hiện thực và tích họp bộ nhớ đệm lệnh vào vi điều khiển IoT Pulpino Xây dựng nền tảng để mô phỏng, tổng hợp, đo lường năng lượng tiêu thụ nhằm đánh giá thiết kế của hệ thống
NGÀY GIAO NHIỆM VỤ : 11/02/2019
NGÀY HOÀN THÀNH NHIỆM VỤ : 02/06/2019
CÁN Bộ HƯỚNG DẪN : TS Phạm Quốc Cường
Trang 4LỜI CẢM ƠN
Lời đầu tiên tôi xin chân thành cảm ơn tói Thầy hướng dẫn, TS Phạm Quốc Cường đã tin tưởng giao đề tài, hỗ trợ công cụ và hướng dẫn tôi tận tình trong suốt quá trình thực hiện luận văn này
Tôi cũng xin cảm ơn các anh em kĩ sư tại công ty Marvell, trưởng nhóm Nguyễn Văn Quang Ánh, các đồng nghiệp Phạm Quang Huy, Trần Tấn Đức đã giúp đỡ, hỗ trợ công việc trong lúc tôi thực hiện luận văn này, và có những góp
ý quý báu đối với kiến trúc của thiết kế mới
Cuối cùng xin cám ơn gia đình và vợ tôi đã luôn ủng hộ và động viên tôi trong suốt thời gian qua
Trang 5TÓM TẮT LUẬN VĂN
Những dự án nghiên cứu IoT dự báo sẽ có hon 20 tỷ thiết bị sử dụng trong mạng này trong thập kỷ tới Những thiết bị này có những đặc điểm riêng như yêu cầu khắt khe về mức tiêu thụ năng lượng thấp, đa dạng về các mức độ ứng dụng nên cần hiệu năng xử lý cũng đa dạng từ đơn giản đến phức tạp Ngoài ra, với nhu cầu về số lượng lớn các thiết bị cho nên yêu cầu giá thành cần rẻ Tù những yêu cầu đó, luận văn đặt mục tiêu đi nghiên cứu và tìm giải pháp cải tiến cho những vi điều khiển sử dụng cho lĩnh vực IoT này
Vi kiến trúc thường gặp của các vi điều khiển nói chung, đặc biệt là các vi điều khiển sử dụng CPU ARM là sử dụng những bộ nhớ SRAM lớn mà CPU có thể truy cập trực tiếp gọi là những bộ nhớ “tightly-coupled” Mặc dù dữ liệu được truy cập nhanh, nhưng SRAM có giá thành cao và phải luôn duy trì nguồn cấp
để lưu trữ dữ liệu Việc sử dụng kiến trúc bộ nhớ như vậy thường không phù họp với những ứng dụng IoT, đặc biệt là khi cần tăng hoặc giảm kích thước bộ nhớ cho những ứng dụng phức tạp hơn hoặc đơn giản hơn Vi điểu khiển IoT Pulpino cũng là một vi điều khiển của kiến trúc bộ nhớ như vậy
Trong luận văn này, tác giả đề xuất một vi kiến trúc mới cho vi điều khiển IoT Pulpino và hiện thực một phần vi kiến trúc mới đó thông qua thiết kế và hiện thực phần cứng bộ nhớ đệm lệnh Sau đó, thiết kế này được tích họp vào vi điều khiển IoT Pulpino và được đánh giá toàn diện qua các môi trường mô phỏng, tổng hợp và đo lường năng lượng tiêu thụ Ket quả thực nghiệm cho thấy việc thay thế bộ nhớ “tightly-coupled” bằng bộ nhớ đệm lệnh với % kích thước SRAM nhỏ hơn có thể cho hiệu suất tương đương với điểm CoreMark không thay đổi so với thiết kế gốc Ket quả thời gian truy cập bộ nhớ trung bình AMAT chỉ khoảng từ 1.01 đên 1.13 chu kì clock, nhưng giúp cho tống khối lượng cống
và năng lượng tiêu thụ của vi điều khiển Pulpino giảm lên đến 27%
Trang 6ABSTRACT
IoT research projects are expected to have more than 20 billion devices used in this network in the next decade These devices have their own characteristics such as stringent requirements for low energy consumption, variety of application levels, so the processing performance varies from simple
to complex In addition, with the demand for a large number of devices, the price needs to be low From those requirements, the thesis aims to research and find innovative solutions for microcontrollers used for this IoT field
Common micro architectures of microcontrollers in general, especially microcontrollers using ARM CPUs, use large SRAM memories that CPU can access directly called "tightly-coupled" memory Although the data is quickly accessed, SRAM has a high cost and must maintain the power source to retain data Using such memory architecture is not suitable for IoT applications, especially when it is necessary to increase or reduce the memory size for more complex or simpler applications Pulpino is also an IoT microcontroller of such memory architecture
In this thesis, the author proposes a new microarchitecture for IoT Pulpino microcontroller and implements a part of that new microarchitecture through the design and implementation of an instruction cache hardware Then, this design
is integrated into the Pulpino IoT microcontroller and is comprehensively evaluated through simulation, synthesis and power consumption estimation environments Experimental results show that, with % SRAM smaller, instruction cache design can give equivalent performance as "tightly-coupled" memory with same benchmark score from CoreMark The average memory access time AMAT only ranges from 1.01 to 1.13 clock cycles but help the Pulpino microcontroller's total gate size reduction of and power consumption reduction of up to 27%
Trang 7LỜI CAM ĐOAN
Tôi cam đoan rằng, ngoại trù các kết quả tham khảo tù các công trình khác như đã ghi rõ trong luận văn, các công việc trình bày trong luận văn là do chính tôi thực hiện và chưa có phần nội dung nào của luận văn này được nộp để lấy một bằng cấp ở trường này hoặc trường khác
Ngày 02 tháng 6 năm 2019
Nguyễn Văn Linh
Trang 8Danh sách các từ viêt tăt
CPU Central Processing Unit
RISC-V Reduced Instruction Set Computer - Five SRAM Static Random Access Memory
FRAM Ferroelectric Random Access Memory AMAT Average Memory Access Time
RTL Register Transfer Level
WRU Way Replacement Unit
FSM Finite State Machine
MCU Microcontroller Unit
IoT Internet of Things
FPU Internet of Things
PULP Parallel Ultra Low Power
LSU Load Store Unit
ALU Arithmetic Logic Unit
MAC Multiply-Accumulate operation
SIMD Single Instruction Multiple Data
DMA Direct Memory Access
Trang 9Danh sách hình vẽ
Hình 2.1: Định dạng lệnh của RISC-V 18
Hình 2.2: Sơ đồ khơi của CPU RI5CY 22
Hình 2.3: kiến trúc pipe-line của CPU RI5CY 23
Hình 2.4: Minh họa giao thức truy cập bộ nhớ (cơ bản) 25
Hình 2.5: Minh họa giao thức truy cập bộ nhớ (Back-to-back) 25
Hình 2.6: Minh họa giao thức truy cập bộ nhớ (đáp ứngchậm) 25
Hình 2.7: Sơ đồ khối của vi điều khiển Pulpino 26
Hình 2.8: Bản đồ truy cập bộ nhớ của vi điều khiển Pulpino 27
Hình 2.9: Mô hình bộ vi xử lý với 3 cấp bộ nhớ đệm 28
Hình 2.10: Sơ đồ khối của vi điều khiển MSP430FR5739 35
Hình 2.11: Sơ đồ khối của FRAM controller của MCU MSP430 36
Hình 3.1: Vi kiến trúc mới được đề xuất cho Pulpino 38
Hình 3.2: Kiến trúc thiết kế của bộ nhớ đệm lệnh 39
Hình 3.3: Sơ đồ khối tổng quát của khối cache controller 40
Hình 3.4: Khối HiƯmiss judgement 41
Hình 3.5: Khối WRU hiện thực bằng LFSR 8 bit 42
Hình 3.6: Khối CTRL FSM 42
Hình 3.7: Khối Performance stat 44
Hình 3.8: Khối AXI Double Buffer 44
Hình 3.9: Bộ nhớ SRAM single port 45
Hình 3.10: cổng inpuưoutput của cache top module 46
Hình 3.11: cổng inpuưoutput của cache controller 47
Hình 3.12: Verdi schematic của top cache module 48
Hình 4.1: Kiến trúc môi trường mô phỏng của Pulpino 49
Hình 4.2: Các bước chạy của môi trường mô phỏng Pulpino 51
Hình 4.3: Debug trực quan bang Verdi 52
Hình 4.4: Biểu đồ kết quả AMAT 55
Hình 4.5: Biểu đồ phân tích năng lượng của Pulpino gốc 57
Hình 4.6: Biểu đồ so sánh năng lượng giữa các cấu hình cache 58
Trang 10Danh sách bảng
Bảng 1.1: Những CPU RISC-V tiêu biểu 14
Bảng 2.1: Bảng các tập lệnh cơ sở và mở rộng của RISC-V 16
Bảng 2.2: Phân loại các nhóm lệnh của tập lệnh RV32I 17
Bảng 2.3: Những thanh ghi điều khiển HW Loop 20
Bảng 2.4: Bảng các inpuưoutput của bộ phát lệnh 24
Bảng 2.5: Bảng so sánh FRAM vói các bộ nhớ khác 34
Bảng 4.1: Bảng kết quả đo tỉ lệ cache miss của bộ nhớ đệm lệnh 53
Bảng 4.2: Bảng so sánh tài nguyên cổng tiêu tốn 54
Bảng 4.3: Bảng so sánh kết quả Benchmark tù CoreMark 56
Bảng 4.4: Bảng so sánh kết quả đo năng lượng bang SpyGlass Power 58
Trang 11Mục lục
Danh sách các tù viết tắt 7
Danh sách hình vẽ 8
Danh sách bảng 9
CHƯƠNG 1 GIỚI THIỆU LUẬN VĂN 12
1.1 Tổng quan về đề tài 12
1.2 Mục tiêu của đề tài 14
1.3 Giới hạn của đề tài 15
1.4 Bố cục của luận văn 15
Chương 2 Cơ sở lý thuyết 16
2.1 Sơ lược về kiến trúc tập lệnh RISC-V 16
2.1.1 Tổng quát 16
2.1.2 Kiến trúc tập lệnh cơ sở 17
2.1.3 Kiến trúc tập lệnh mở rộng 18
2.2 Vi xử lý RI5CY 19
2.2.1 Giới thiệu vi xử lý RI5CY 19
2.2.2 Kiến trúc tập lệnh mở rộng 20
2.2.3 Vi kiến trúc 22
2.3 Sơ lược về vi điều khiển Pulpino 26
2.3.1 Giới thiệu 26
2.3.2 Kiến trúc hệ thống 26
2.3.3 Bản đồ truy cập bộ nhớ 27
2.4 Bộ nhớ đệm lệnh 27
2.4.1 Giới thiệu 27
2.4.2 Kiến trúc của bộ nhớ lệnh 28
2.2.3 Hiệu suất của bộ nhớ lệnh 30
2.5 Sử dụng systemverilog để thiết kế phần cứng 30
2.5.1 Kiểu dữ liệu logic 30
2.5.2 always_comb, always_latch, always_ff 31
2.5.3 Kiểu dữ liệu người dùng tự định nghĩa 31
2.5.4 Interface 31
Trang 122.5.5 Package 32
2.6 Đánh giá hiệu suất vi xử lý bằng Core Mark 32
2.6.1 Giới thiệu về Core Mark 32
2.6.2 Chạy và đọc kết quả từ Core Mark 33
2.7 Bộ nhớ FRAM 33
2.7.1 Giới thiệu về FRAM 33
2.7.2 So sánh FRAM với các loại bộ nhớ khác 34
2.8 Các nghiên cứu liên quan 35
Chương 3 Thiết kế và hiện thực 37
3.1 Vi kiến trúc của MCU Pulpino 37
3.2 Kiến trúc tổng quát của bộ nhớ đệm lệnh 38
3.3 Hiện thực bộ nhớ đệm lệnh 40
3.3.1 Chi tiết hiện thực khối cache controller 40
3.1.2 Chi tiết hiện thực khối AXI double buffer 44
3.1.3 Chi tiết hiện thực khối memory array 45
3.1.4 Kết quả hiện thực bằng SystemVerilog 45
Chương 4 Mô phỏng, tổng họp và thực nghiệm 49
4.1 Môi trường mô phỏng 49
4.1.1 Giới thiệu môi trường mô phỏng 49
4.1.2 Cách chạy mô phỏng 51
4.1.3 Debug bằng giao diện Verdi 52
4.2 Kết quả mô phỏng 53
4.3 Kết quả tổng hợp 54
4.4 Kết quả tính AMAT 55
4.5 Kết quả chạy Benchmark bằng CoreMark 56
4.6 Kết quả so sánh năng lượng tiêu thụ 57
Chương 5 Kết luận 59
5.1 Kết luận 59
5.2 Hướng phát triển 60
Tài liệu tham khảo 62
Trang 13CHƯƠNG 1 GIỚI THIỆU LUẬN VĂN
1.1 Tổng quan về đề tài
Ngày nay, thuật ngữ Internet of Things (IoT) không còn xa lạ mà đã trở thành xu hướng phát triển nóng ở quy mô công nghiệp Xu hướng này sẽ ảnh hưởng đến mọi mặt của đời sống con người, tù các vấn đề cá nhân (thông qua Smart Wearable-các thiết bị thông minh cá nhân, Smart Home - ngôi nhà thông minh, eHealth-các thiết bị chăm sóc sức khỏe ) cho đến các vấn đề xã hội và doanh nghiệp (thông qua Smart City - thành phố thông minh, Smart environment
- môi trường thông minh, Smart Enterprise - doanh nghiệp thông minh, Industrial control - điều khiển công nghiệp ) Đe phục vụ cho sự phát triển của IoT, một
số lượng lớn các thiết bị đang và sẽ được tạo ra, kết nối với nhau Theo những nghiên cứu mới nhất, số lượng thiết bị IoT toàn cầu đã lên tới hơn 7 tỷ thiết bị, con số này đã vượt qua số thiết bị di động sử dụng trên toàn cầu Cụ thể, theo IoT Analytics, số lượng thiết bị IoT trên toàn cầu là hơn 7 tỷ thiết bị vào năm
2018 và ước tính sẽ có 22 tỷ thiết bị vào năm 2025 Trong khi đó, theo Gartner,
số lượng thiết bị IoT trên toàn cầu là 14.2 tỷ thiết bị vào năm 2019 và ước tính
sẽ có 25 tỷ thiết bị vào năm 2021
Các thiết bị dùng trong mạng IoT hầu hết đều tích họp ít nhất một bộ vi
xử lý để phục vụ cho việc kết nối, thu thập, xử lý, điều khiển, lưu trữ và truyền tải dữ liệu, cũng như đưa các quyết định tương tác ngược lại vói bên ngoài Do
đó nhu cầu số lượng vi xử lý còn cao hơn số lượng thiết bị IoT Cộng thêm là các thiết bị dùng trong mạng IoT yêu cầu vi xử lý cần có hiệu năng đa dạng tù thấp đến cao nhưng với chi phí thấp và đặc biệt là phải tiết kiệm năng lượng Điều đó đặt ra những thách thức mới cho các nhà sản xuất thiết bị khi lựa chọn các bộ vi xử lý cho thiết kế của mình
Thứ nhất, hiện tại những công ty thành công với kiến trúc tập lệnh của mình đang thống trị thị trường vi xử lý như Intel, ARM, IBM, đều có những bằng sáng chế trên kiến trúc tập lệnh mà họ đang sở hữu, do đó các công ty này đều tính phí bản quyền đối với việc sử dụng kiến trúc tập lệnh của các công ty này đồng thời ngăn cấm việc thiết kế các bộ vi xử lý sử dụng kiến trúc tập lệnh của họ nếu không được họ cấp phép Bất kì một thỏa thuận nào liên quan đến bản quyền sử dụng kiến trúc tập lệnh đều phải tốn từ 6-24 tháng trao đối và chi phí phải tốn chừng từ một đến mười triệu đô la Mỹ, và tất nhiên thỏa thuận với trường đại học hay những công ty có quy mô nhỏ lẻ thường bị loại trừ Việc độc quyền đã cản trở sự cạnh tranh và đối mới bằng việc ngăn không cho nhiều người thiết kế và chia sẻ những vi xử lý có những kiến trúc tập lệnh tương thích với nhau [1]
Trang 14Thứ hai, các sản phẩm vi xử lý được thiết kế mang tính chất tổng quát cho mỗi phân khúc sản phẩm nhất định, không tùy chỉnh được thiết kế để tối ưu về hiệu năng xử lý, mức tiêu thụ năng lượng và giá cả cho tùng dòng sản phẩm IoT
Thứ ba, mỗi kiến trúc tập lệnh của mỗi hãng sử dụng một hệ sinh thái phần mềm riêng, làm tăng chi phí phát triển Thậm chí trên cùng một thiết bị lại
sử dụng nhiều phần mềm khác nhau của những kiến trúc tập lệnh khác nhau
Những thách thức đó là tiền đề, là động lực để cho ra đời những vi xử lý
mã nguồn mở đi cùng là những kiến trúc tập lệnh miễn phí nhưng thống nhất Một trong số đó là RISC-V (phát âm là "risk-five", RISC viết tắt tù Reduced Instruction Set Computer), là một kiến trúc tập lệnh mở, được xây dựng dựa trên những nguyên tắc của kiến trúc tập lệnh RISC, đã và đang thu hút được sự phát triển và ứng dụng tù các nhà khoa học cũng như các công ty sử dụng vi xử lý trên thế giới Trái ngược với hầu hết các kiến trúc tập lệnh khác, RISC-V hoàn toàn miễn phí cho bất kỳ mục đích sử dụng nào Nó cho phép bất kỳ ai có thể thiết kế, sản xuất và bán các sản phẩm phần cứng và phần mềm sử dụng RISC-
V Điều đó sẽ đem đến rất nhiều lợi ích quan trọng cho nền công nghiệp máy tính nói chung và sự phát triển của IoT nói riêng, như lôi kéo được nhiều ý tưởng sáng tạo thiết kế hơn, các thiết kế bộ vi xử lý có thể được trao đổi, tái sử dụng,
dễ tối ưu hơn làm cho chi phí của bộ vi xử lý trở nên rẻ và phù họp với các ứng dụng kiểu như IoT [1]
Ngoài ra RISC-V còn có những mong muốn khác là tạo ra một kiến trúc tập lệnh tiêu chuẩn chung để có thể thống nhất và tái sử dụng phần mềm trên nhiều hệ thống khác nhau và ổn định trong vài chục năm thay vì sử dụng nhiều kiến trúc tập lệnh khác nhau trên cùng một hệ thống System on Chip (SOC) như trước đây Đe hiện thực điều đó, RISC-V cho phép mở rộng tập lệnh theo hướng phù hợp cho từng ứng dụng cụ thể, thông qua phần tập lệnh mở rộng (tiêu chuẩn hoặc do người thiết kế CPU tự định nghĩa)
RISC-V được phát triển lần đầu tiên bởi Đại học California, Berkeley vào năm 2010 Cho đến nay đã có hàng chục bộ vi xử lý được phát triển dựa trên kiến trúc tập lệnh này nhắm vào nhiều mục đích ứng dụng và phân khúc khác nhau Dưới đây là một số sản phẩm CPU RISC-V tiêu biểu:
Trang 15RISC-V CPU Nhà phát triển KT tập lệnh Sản phẩm mục tiêu
nhân
Bologna
Bảng 1.1: Những CPURISC-Vtiêu biểu Việc đề xuất và hiện
thực một kiến trúc tập lệnh mới để có thể sử dụng được là rất tốn kém Bởi vì những người thiết kế máy tính thường không đủ khả năng tài chính để làm việc miễn phí và việc phát triển vi xử lý dựa trên kiến trúc tập lệnh mới còn đòi hỏi chuyên môn, kinh nghiệm thiết kế rất cao của nhiều chuyên ngành như điện tử
kỹ thuật số, trình biên dịch, hệ điều hành, kỹ thuật phần mềm Ngoài ra, cần
có các công cụ để mô phỏng, kiểm tra chất lượng, kiểm thử chức năng, tổng họp
ra mạch điện tử và đo lường các thông số về tiêu tốn năng lượng của thiết kế Các công cụ này cần phải mua bản quyền và cũng rất tốn kém Vì vậy, khó kiếm được một đội thiết kế độc lập nào bên ngoài các công ty thiết kế vi xử lý chuyên nghiệp (như ARM, Intel, IBM, MIPS ) để đứng ra xây dựng kiến trúc tập lệnh mới như RISC-V Do đó, việc đóng góp tù rất nhiều thành viên đến tù cộng đồng
sử dụng RISC-V mang ý nghĩa quyết định đến sự thành công của kiến trúc tập lệnh mới này Đó cũng là một trong những ý nghĩa mà luận văn này muốn hướng đến, đó là tham gia vào tìm hiểu, sử dụng, thiết kế, kiểm định và đánh giá sản phẩm liên quan đến kiến trúc tập lệnh RISC-V
Ngoài ra, như đề cập ở phía trên, nhu cầu của các sản phẩm IoT rất đa dạng về hiệu năng xử lý cũng như hiệu quả trong sử dụng năng lượng, và giá cả phải rẻ [5], cho nên cần có nhiều giải pháp thiết kế linh hoạt đáp ứng từng dòng sản phẩm IoT cụ thể Do đó, luận văn này cũng hướng đến việc đề xuất một thay đối thiết kế đóng góp thêm giải pháp cho các sản phẩm IoT
1.2 Muc tiêu của đề tài
Mục tiêu của đề tài cụ thể như sau:
• Tìm hiểu về kiến trúc tập lệnh mới RISC-V và về một vi xử lý điển hình hiện thực kiến trúc tập lệnh này
Trang 16• Tìm hiểu về vi điều khiển Pulpino là một vi điều khiển sử dụng vi xử lý RISC-V được phát triển hướng đến các sản phẩm IoT
• Đề xuất và hiện thực một bộ nhớ đệm lệnh, tích họp vào vi điều khiển Pulpino nhằm giúp cho vi điều khiển này có thiết kế linh hoạt hơn, tốn ít tài nguyên và năng lượng hơn
• Thiết lập một nền tảng hỗ trợ cho việc học tập, nghiên cứu kiến trúc máy tính cũng như thiết kế phần cứng tại trường Đại học Bách Khoa TPHCM
1.3 Giói hạn của đề tài
Đề tài sẽ tập trung nghiên cứu kiến trúc vi xử lý RI5CY và thiết kế của vi điều khiển Pulpino nằm trong dự án PULP, cùng với môi trường mô phỏng sử dụng ModelSim của vi điều khiển này Ngoài ra, đề tài sẽ tìm hiểu và xây dựng những môi trường khác để có thể đánh giá thiết kế trước và sau khi sửa đổi như môi trường tổng họp bằng công cụ Genus, môi trường đo hiệu suất CPU bằng ứng dụng CoreMark hay môi trường đo năng lượng tiêu thụ bằng công cụ SpyGlass Power
1.4 Bố cuc của luân văn
• •
Luận văn được chia thành 5 chương sắp xếp theo bố cục sau:
Chương 2: Trình bày những cơ sở lý thuyết được sử dụng có liên quan đến đến những nội dung nghiên cứu của đề tài như giới thiệu tổng quan kiến trúc tập lệnh mở RISC-V, về thiết kế hệ thống của vi điều khiển Pulpino và vi xử lý được sử dụng trong vi điều khiển này là vi xử lý RI5CY, kiến thức tóm tắt bộ nhớ đệm lệnh cũng như các nghiên cứu liên quan đến đề tài của luận văn
Chương 3: Đây là chương trọng tâm của luận văn Chương này phân tích
và đề xuất thay đối vi kiến trúc của vi điều khiển Pulpino cùng với kiến trúc thiết
kế tống quát cho bộ nhớ đệm lệnh Đồng thời, phần sau của chương này sẽ trình bày chi tiết về cách hiện thực thiết kế của bộ nhớ đệm lệnh
Chương 4: Chương này trình bày về môi trường mô phỏng, cách thức tiến hành thực nghiệm, báo cáo và phân tích kết quả thực nghiệm
Chương 5: Đây là chương để đúc kết lại luận văn và đưa ra đề xuất cho hướng phát triển tiếp theo của đề tài
Trang 17Chương 2 Cơ sở lý thuyết 2.1 Sơ lược về kiến trúc tập lệnh RISC-V
2.1.1 Tổng quát
Kiến trúc tập lệnh RISC-V được thiết kế theo kiểu module nhằm cho phép các nhà phát triển vi xử lý RISC-V có thể linh hoạt lựa chọn được kiến trúc phù hợp nhất cho ứng dụng của họ RISC-V định nghĩa kiến trúc tập lệnh số nguyên 32-bit RV32I là kiến trúc tập lệnh cơ bản nhất Với kiến trúc tập lệnh cơ sở này,
vi xử lý RISC-V đã có tất cả những lệnh cơ bản, những lệnh điều khiển luồng,
bộ thanh ghi, bộ nhớ, cách đánh địa chỉ bộ nhớ .w đủ để hiện thực một vi xử
lý đơn giản dạng tổng quát hỗ trợ đầy đủ cho phần mềm và trình biên dịch
Tù kiến trúc tập lệnh cơ sở này, nhà phát triển vi xử lý RISC-V có thể linh hoạt chọn kết họp với một hay nhiều tập lệnh mở rộng tùy chọn khác cho các ứng dụng mục tiêu Tập lệnh mở rộng có thể là tập lệnh mở rộng chuẩn của nhà sáng lập RISC-V hoặc tập lệnh mở rộng phi tiêu chuẩn của nhà phát triển vi
xử lý RISC-V cho một sản phẩm mục tiêu nhất định
Tên viết tắt
của tập lệnh
Bảng 2.1: Bảng các tập lệnh cơ sở và mở rộng của RISC-V
Đe hỗ trợ tốt hơn cho việc phát triển hệ sinh thái phần mềm của vi xử lý RISC-V, nhà sáng lập RISC-V đã cung cấp sẵn một tập các tập lệnh mở rộng tiêu chuẩn, bao gồm phép nhân chia số nguyên (tập M), các toán tử nguyên tử (tập A), phép toán với số thực dấu phay động độ chính xác đơn (tập F), phép toán với số thực dấu phay động độ chính xác kép (tập D) Một kiến trúc tập lệnh
hỗ trợ tập lệnh cơ bản I cùng với tất cả các tập lệnh vừa nêu (M, A, F, D) gọi là kiến trúc tập lệnh đa mục đích, viết tắt là tập G, ví dụ như RV32G Ngoài ra, nhà sáng lập RISC-V còn cung cấp một tập lệnh mở rộng tiêu chuẩn hữu ích nữa là tập lệnh nén để giảm kích thước của mã máy (tập C)
Trang 182.1.2 Kỉến trúc tập lệnh cơ sở
Kiến trúc tập lệnh cơ sở đầu tiên và cơ bản nhất được RISC-V định nghĩa
là kiến trúc tập lệnh RV32I, bao gồm 47 lệnh có thể được phân chia dựa trên chức nầng và opcode thành 8 nhóm như sau:
Branch Inst 11_00G_11 BEQ, BNE, BLT = BGE : BLTLỊ, BGEU
ADD, SUB SLL, SLT SLTU XOR, SRL SRA s
OR AND MUL, MULH* MULHSỤ MULHỤ DIV, DF.U REM
SCALL, SBREAK, RDCYCLE, RDCYCLEH
RDTIME RDT1MEEL RDINSFKET, RDINSTRETH, FRCSR, FRRM, FRFLA' GS, FSCSR, FSRMFS FLAGS, FSRME, FSFLSGSI
00 oil 11
LUL AUIPC
JAL JALR FENCE, FENCE.!
Bảng 2.2: Phân loại cảc nhỏm lệnh của tập lệnh RV32I
Nếu xét về định dạng của lệnh thì RV32I được chia thành sáu nhóm: R~ type, I-type, S-type, B-type, Ư-type, J-type Trong đó R, I, s, u là bốn nhóm chính, hai nhóm B và J giống hoàn toàn nhóm s và u ngoại trừ khác nhau về phần toán tử “immediate”
Trang 1931 30 25 24 21 20 19 15 14 12 11
funct7 rs2 rsl funct3 rd opcode R-type
I-type S-type B-type
U-type J-type
Ngoài ra RV32I có nghĩa là không gian địa chỉ là 32-bit và sử dụng little endian
Tuơng ứng, RV64I có nghĩa là không gian địa chỉ là 64-bit và RV128I có không gian địa chỉ là 128-bit RV64I và RV128I cũng đuợc xem là những kiến trúc tập lệnh cơ sở Bên cạnh đó, còn một kiến trúc tập lệnh cơ sở nữa là RV32E định nghĩa cho những hệ thống nhúng RV32E chỉ có 16 thanh ghi 32-bit registers và những bộ đếm của RV32I đuợc tùy chọn có hay không
2.1.3 Kiến trúc tập lệnh mở rộng
Nhu danh sách các kiến trúc tập lệnh cơ bản và mở rộng của RISC-V đề cập
ở trên, RISC-V định nghĩa rất nhiều tùy chọn tập lệnh mở rộng Trong số đó, một
số đã hoàn thiện về đặc tả kĩ thuật, còn lại vẫn còn đang phát triển Duới đây là những mở rộng đã đóng băng về đặc tả:
• M: tập những lệnh nhân chia số nguyên
• A: tập những lệnh nguyên tử Atomic
• F: Single-precision floating point (tuân thủ IEEE 754-2008)
• D: Double-precision floating point (tuân thủ IEEE 754-2008)
• Q: Quad-precision floating point (tuân thủ IEEE 754-2008)
• C: tập những lệnh nén (16-bit) để giảm kích thuớc của mã lệnh
Những tập lệnh mở rộng đang đuợc phát triển và sẽ đóng băng đặc tả trong tuơng lai gần là tập L (decimal float), B (bit manipulation), J (dynamically translated languages), T (transactional memory), p (packed SIMD), V (vector operations), N (user-level interrupts)
Trang 202.2 Vi xử lý RI5CY
2.2.1 Giới thiệu vi xử lý RI5CY
RI5CY là vi xử lý có thiết kế tương đối hoàn thiện dựa trên kiến trúc tập lệnh RISC-V nằm trong dự án PULP, là một dự án ngay từ ban đầu hướng đến phát triển các thiết kế tối ưu về năng lượng tiêu thụ phục vụ cho các sản phẩm IoT
PULP là dự án hợp tác giữa phòng thí nghiệm các hệ thống tích hợp (IIS) của viện công nghệ liên bang Thụy Sĩ (ETH Zurich) và phòng thí nghiệm các hệ thống nhúng hiệu quả năng lượng của Đại học Bologna (Ý) nhằm phát triển một nền tảng nghiên cứu phần cứng và phần mềm với tiêu chí tối ưu năng lượng nhất Hiện tại PULP đang phát triển 3 dòng vi xử lý dùng cho 3 phân khúc khác nhau bao gồm:
• Lõi giá thành thấp: gồm hai vi xử lý 2 tang pipeline Zero-riscy (hỗ trợ kiến trúc tập lệnh RV32IMC) và Micro-riscy (hỗ trợ kiến trúc tập lệnh RV32EC) là những vi xử lý được tối ưu ở mức cao nhất hướng đến những ứng dụng vi điều khiển đơn thuần hoặc có kết hợp với tính toán số học đơn giản Hai vi xử lý này có kiến trúc khá tương đồng với hai lõi CPU ARM Cortex M0/M0+
• Vi xử lý RI5CY 4 tầng pipeline hỗ trợ kiến trúc tập lệnh RV32IMC[F]X cùng với một số mở rộng thêm của riêng vi xử lý này như vòng lặp phần cứng (HW loops), một số phép tính trên kiểu bit (bits manipulation), những lệnh LOAD-STORE có địa chỉ tự động tăng hướng đến những ứng dụng cần tính toán trên dữ liệu Bộ vi xử lý này có kiến trúc khá tương đồng với hai lõi CPU ARM Cortex M4/M4F
• Vi xử lý 64-bit Ariane 6 tang pipeline hỗ trợ kiến trúc tập lệnh RV64IMC,
có thể hỗ trợ hệ điều hành Linux Bộ vi xử lý này được phát triển để so sánh và cạnh tranh với CPU ARM Cortex M7
Cụ thể, vi xử lý RI5CY có kiến trúc tập lệnh được mô tả chi tiết như dưới đây:
• Hỗ trợ đầy đủ cho tập lệnh cơ bản RV32I
• Hỗ trợ đầy đủ cho phần mở rộng tiêu chuẩn RV32C cho lệnh nén (những lệnh có định dạngló-bit)
• Hỗ trợ đầy đủ cho phần mở rộng phép nhân và chia RV32M
• Tùy chọn hỗ trợ đầy đủ cho dấu chấm phay động độ chính xác đơn RV32F (khối FPU được tùy chọn hỗ trợ hay không)
• Ngoài ra, RI5CY còn có các phần mở rộng riêng của dự án PULP không thuộc kiến trúc tập lệnh tiêu chuẩn (hay còn gọi là RV32X) Phần kiến trúc tập lệnh mở rộng này sẽ được đề cập ở mục tiếp theo
Trang 212.2.2 Kiến trúc tập lệnh mở rộng
Bên cạnh tập trung xây dựng vi kiến trúc của RI5CY dựa trên kiến trúc tập lệnh chuẩn RV32IMFC của RISC-V nhằm đạt đuợc hiệu suất và code density tuơng đuong với những vi xử lý cùng phân khúc sử dụng kiến trúc tập lệnh bản quyền nhu dòng ARM Cortex-M, nhóm PULP đã cố gắng nghiên cứu mở rộng tập lệnh và tối ưu vi kiến trúc của RI5CY để tăng cường hiệu xuất xử lý đồng thời tối ưu về năng lượng tiêu thụ khi vi xử lý này hướng đến sản phẩm IoT
• Lệnh Load và Store có địa chỉ bộ nhớ tự động tăng:
Trong lúc RI5CY đang thực hiện lệnh truy cập bộ nhớ với địa chỉ hiện tại thì nó cũng tự động tính địa chỉ cho lệnh Load và Store tiếp theo dựa vào địa chỉ hiện tại và tham so offset có sẵn Mục đích của lệnh mở rộng này
là giảm thiểu số lượng lệnh cần cho việc thực thi đọc ghi vào một vùng nhớ có địa chỉ tăng dần thường được tìm thấy trong các vòng lặp Lệnh
mở rộng này có thể tăng tốc vi xử lý lên tói 20% nếu việc truy cập vùng nhớ có địa chỉ tăng dần là thường xuyên, ví dụ như trong phép nhân ma trận
• Vòng lặp phần cứng:
Tương tự như mở rộng phía trên là lệnh Load và Store có địa chỉ bộ nhớ
tự động tăng, vòng lặp phần cứng được thêm vào nhằm giảm chi phí phát lệnh của vi xử lý Ngoài ra, nó còn giúp cho không tốn bất kỳ chu kì nào (zero stall cycles) cho việc thực hiện lệnh jump về đầu vòng lặp mỗi khi kết thúc vòng lặp
Một vòng lặp phần cứng được xác định bằng địa chỉ bắt đầu (trỏ vào lệnh đầu tiên trong vòng lặp), địa chỉ kết thúc (trỏ vào lệnh cuối cùng trong vòng lặp) và một bộ đếm giảm dần khi mỗi lần vòng lặp thực thi xong Vi
xử lý có sẵn hai tập thanh ghi dành cho vòng lặp phần cứng nên nó hỗ trợ được hai vòng lặp lồng nhau Đe sử dụng vòng lặp phần cứng thì phần mềm cần thiết lập nội dung những thanh ghi trong bảng sau:
Bảng 2.3: Những thanh ghi điều khiến HW Loop
Trang 22• Phép nhân tích lũy:
Để hỗ trợ tốt hơn cho các tính toán xử lý tín hiệu số, RI5CY hiện thực bốn
mô đun: một bộ nhân 32bitx32bit, một bộ nhân phân số, và hai bộ nhân tích vô hướng Ket họp những mô đun này giúp cho RI5CY có khả năng
hỗ trợ được phép nhân 2 véc tơ, phép nhân tích lũy (MAC) và phép nhân dấu chấm tĩnh
- Hỗ trợ lệnh clip giúp cho các phép số học dấu chấm tĩnh hiệu quả hơn
- Các phép tính toán trên dữ liệu kiểu bit
Trang 23Là một kiến trúc pipeline in-order nên có nhược điểm là nếu một lệnh chỉ cần tới tầng EX là hoàn thành vẫn phải đợi lệnh trước hoàn thành ở tầng WB Như thể hiện ở hình 2.3, tín hiệu điều khiển ex_ready bị chi phối bởi tín hiệu rvalid từ bộ nhớ dữ liệu từ bên ngoài
Hình 2.3 (phía dưới) thể hiện những tín hiệu điều khiển liên quan đến hoạt động của pipeline Tín hiệu điều khiển chính là *_ready thể hiện sự sẵn sàng của từng tang pipeline được truyền từ phải sang trái Và mỗi tang pipeline có hai tín hiệu điều khiển đi vào: E(enable) và c (Clear) Tín hiệu E tích cực cho tang pipeline chuyển tới lệnh tiếp theo còn tín hiệu c xóa bỏ lệnh hiện tại ra khỏi tang pipeline vì nó đã hoàn thành
Mỗi tầng pipeline phụ thuộc vào tầng kế tiếp nhưng độc lập với tầng phía trước, có nghĩa là nó có thể hoàn thành công việc của nó không phụ thuộc vào việc tầng phía trước có đang bị stall hay không Ở mặt khác, một lệnh chỉ có thể được chuyển qua tầng kế tiếp khi tầng kế tiếp sẵn sàng nhận lệnh tiếp theo (bằng cách đặt *_ready lên 1)
Trang 24Hình 2.3: kiến trúc pipe-line của CPU RI5CY
❖ Khối phát lệnh Khối phát lệnh IF sử dụng một Prefetch buffer Bộ đệm này được sử dụng
để tối ưu hiệu suất, đặc biệt là đối với phần mở rộng “vòng lặp phần cứng” sẽ cần 4-8 lệnh có sẵn để thực thi vòng lặp, ngoài ra nó còn mang ý nghĩa cân bang timing (timing closure) Prefetch buffer này có hai cấu hình để lựa chọn:
• Một FIFO gồm 3 entry, mỗi entry là 32 bit
• Một cache line 128-bit Cache line này có thể chứa tối thiểu 4 lệnh 32- bit hoặc 8 lệnh 16-bit
Bộ đệm tìm nạp trước này phát lệnh tù bộ nhớ bên ngoài hay bộ nhớ đệm lệnh thông qua interface và giao thức tương tự như khối Load-Store Unit (LSU) của tang WB, chỉ khác là phần phát lệnh là chỉ đọc nên ít tín hiệu giao tiếp hơn Bảng sau sẽ mô tả những tín hiệu mà bộ Prefetch buffer sử dụng:
Trang 25Tín hiêu
giữ giá trị một cho đến khi instr_gnt_i lên 1 được ít nhất một chu kỳ
Dữ liệu lệnh instr_rdata_i sẵn sàng tín hiệu instr_rvalid_i này là 1 Tín hiệu này chỉ lên 1 chỉ trong đúng 1 chu kỳ đối với mỗi lần đọc
Bảng 2.4: Bảng các input/output của bộ phát lệnh
về giao thức mà bộ prefetch buffer sử dụng để giao tiếp với bộ nhớ chứa lệnh bên ngoài (cũng cùng là giao thức mà khối LSU dùng để đọc ghi dữ liệu xuống bộ nhớ dữ liệu) được đặc tả như dưới đây:
Khi LSU bắt đầu một lần truy cập bộ nhớ, nó sẽ cung cấp địa chỉ họp lệ thông qua tín hiệu bus data_addr_o và đặt data_req_o lên 1 Bộ nhớ sau đó sẽ chấp nhận yêu cầu bằng cách đặt data_gnt_i lên 1 ngay khi nó sẵn sàng Việc chấp nhận yêu cầu này có thể xảy ra ngay trong chu kỳ mà LSU đưa ra yêu cầu hoặc có thể là một vài chu kỳ sau đó Sau khi LSU nhận được trả lời chấp nhận yêu cầu tù bộ nhớ, nó có thể tiếp tục bắt đầu một yêu cầu truy cập bộ nhớ mới, tiếp theo Khi đó, những tín hiệu như data addr o, data wdata o, data we o, data_be_o có thể chuyển sang giá trị mới Đồng thời, bộ nhớ có thể trả kết quả truy cập về bằng cách đặt data_rvalid_i lên 1 và giá trị của tín hiệu bus data_rdata_i khi đó có giá trị hợp lệ nếu là yêu cầu là đọc bộ nhớ (nếu yêu cầu là ghi vào bộ nhớ thì data_rvalid_i vẫn lên 1 nhưng giá trị của bus data_rdata_i không cần được quan tâm) Việc trả lời này xảy ra sau một hoặc nhiều chu kỳ từ lúc LSU nhận được tín hiệu chấp nhận
Trang 26^ ^
Ví dụ minh họa vê biêu đô thòi gian của giao thức:
clk data addr_o
Trang 272.3 Sơ lược về vi điều khiển Pulpino
2.3.2 Kiến trúc hệ thống
Hình 2.7 dưới đây thể hiện sơ đồ khối của Pulpino
Hình 2.7: Sơ đồ khối của vi điều khiển Pulpino
Vi xử lý RI5CY sử dụng 2 port riêng biệt cho đọc lệnh và đọc ghi dữ liệu
Mã lệnh được tải vào Instr RAM có kích thước 32KB, trong khi đó dữ liệu được đọc ghi vào Data RAM cũng có kích thước 32KB
Bus giao tiếp chính trong vi điều khiển này là AXI4 có độ rộng dữ liệu là 32 bit Các thành phần ngoại vi kết nối vào bus AXI4 này thông qua bus APB và một cầu AXI4-APB, tất cả đều có độ rộng dữ liệu là 32 bit
Pulpino sử dụng khối Adv Debug Unit cho mục đích Debug Khối này có thể truy cập được vào tất cả thanh ghi của vi xử lý và 2 bộ nhớ SRAM thông qua cổng JTAG
Trang 282.3.3 Bản đồ truy cập bộ nhớ
Bản đồ để truy cập bộ nhớ của Pulpino được phân bố như hình 2.8 dưới đây về cơ bản được chia thành 4 vùng: vùng bộ nhớ lệnh, vùng bộ nhớ Boot ROM, vùng bộ nhớ dữ liệu và vùng bộ nhớ truy cập các module ngoại vi và Debug
OxOOOO 0000
0x0000 8000
0x0008 0000 0x0008 0200
SPI Master
Timer Event/Interrupt Unit
I2C
FLL SoC Control Debug Port
Trang 29nhanh nhất, cố chỉ phí đắt nhất nên thường có kích thước hạn chế Bộ nhớ đệm
LI này thường được sử dụng để lưu trữ những dữ liệu mà CPU truy cập gần nhất hay dữ liệu tiếp theo mà CPU cần xử lý ngay lập tức Bộ nhớ đệm này thường được chia thành hai bộ nhớ đệm liêng có chức năng khác nhau, một dành cho mã lệnh (instruction cache) và một là dảnh cho dữ liệu mà chương trình cần xử lý (data cache) Hai bộ nhớ đệm này có thể truy cập vào cùng bộ nhớ đệm cấp lớn hơn là L2 cache Kiến trúc điển hình này được mô tả như mô hình dưới đây:
MEMORY BUS
Hình 2.9: Mô hình bộ vi xử ỉý vởi 3 cắp bộ nhớ đệm
Do tính chất đặc trưng của dữ liệu là mã lệnh đã được trình biên dịch xử
lý nên so với bộ nhớ đệm dữ liệu, bộ nhớ đệm lệnh ít phức tạp hơn Luồng của
mã nguồn cỏ thể dễ dự đoán hơn để prefetch và mã nguồn có thể lặp đỉ lặp lại (ví
dụ như vòng lặp) hay đơn gỉản là địa chỉ chứa những lệnh tiếp theo tăng tuyến tính Tóm lại, bộ nhớ đệm lệnh rất tốt về tính cục bộ không gian lẫn thời gian (temporal locality & spatial locality)
28
Trang 30Mỗi bộ nhớ nhỏ lại được chia nhiều khối dữ liệu có kích cỡ nhỏ hơn, gọi
là cache block Lệnh được chuyển tù bộ nhớ chính lên bộ nhớ đệm cache này theo từng khối có kích thước bang cache block Khi CPU cần đọc lệnh ở một vị trí trong bộ nhớ chính, nó sẽ tìm trong cache đầu tiên, cache sẽ kiểm tra vị trí dữ liệu yêu cầu đã được lưu sẵn trong bất cứ cache block nào hay không Neu có, là cache hit Còn ngược lại, nếu không tìm thấy được vị trí dữ liệu trong cache, thì
là cache miss Trong trường hợp cache hit, CPU đọc lệnh tù cache block lên ngay lập tức Còn nếu là cache miss, cache sẽ tạo một entry mới và sao chép dữ liệu
tù bộ nhớ chính lên cache block tương ứng, sau đó đáp ứng yêu cầu đọc lệnh của CPU
❖ Tag array
Để kiểm tra có cache block nào chứa sẵn lệnh cần đọc hay không (cache hit hay cache miss), một phần của địa chỉ truy cập bộ nhớ gửi tù CPU (gọi là tag field) sẽ được so sánh với những dữ liệu tag đã lưu trước trong Tag array khi nạp
dữ liệu lên cache ở những lần truy cập trước
Ví dụ:
CPU truy cập bộ nhớ để đọc lệnh bằng địa chỉ có độ rộng 24 bit
Cache có kích thước 8KB tổ chức thanh 8-ways Mỗi way có kích thước lkB chia thành 256 cache block, mỗi cache block có kích thước 4 byte
Khi đó, cache dùng 2 bit thấp nhất làm địa chỉ offset cho 4 byte trong mỗi cache block, 8 bit thấp tiếp theo làm tag index để truy cập vào memory array và dùng 24-10=14 bit cao còn lại cho tag field
❖ Bit valid array
Mỗi cache block sử dụng 1-bit đại diện cho trạng thái của nó Khi valid bit này bằng 1 có nghĩa là cache block này đã được sử dụng và đang lưu trữ dữ liệu Neu valid bit này bằng 0, có nghĩa là cache block chưa có dữ liệu Khi cache block chưa có dữ liệu, khi cache miss, cache đọc dữ liệu từ bộ nhớ chính lên lưu vào cache block và đặt valid bit của cache block này lên 1
❖ Cache controller
Khi CPU khởi tạo yêu cầu đọc lệnh, cache controller sẽ so sánh tag field
từ địa chỉ đọc lệnh của CPU với tất cả dữ liệu tag tương ứng từ các cache way để xác định cache hit hay cache miss Đối với cache hit, cache controller đọc lệnh
từ memory array và trả về cho CPU ngay để thực thi Đối với Cache miss, cache controller sẽ đi đọc lệnh từ bộ nhớ cấp trên và tìm cache block để lưu dữ liệu mới vào đồng thời trả lệnh được yêu cầu về cho CPU thực thi
Trang 31Neu cache có nhiều way, nhưng khi so sánh tag field tù địa chỉ đọc lệnh của CPU với tất cả dữ liệu tag tương ứng tù các cache way đều không trùng khớp,
có nghĩa là dữ liệu lệnh cần đọc không có trong bất kì cache block nào của bất kì way nào, gọi là way miss, một dạng khác của cache miss Trong trường hợp này, WRU sẽ tìm ra một way sẽ bị flush và thay thế bằng dữ liệu mới WRU thường được hiện thực bằng một thuật toán như LRU (Least Recently Used) hoặc LFSR (Linear Feedback Shift Register)
2.2.3 Hiệu suất của bộ nhớ lệnh
❖ Average Memory Access Time (AMAT)
Thời gian truy cập bộ nhớ trung bình là chỉ số phổ biến để phân tích hiệu suất hệ thống bộ nhớ Chỉ số này càng thấp thì hệ thống bộ nhớ càng tốt AMAT được cấu thành tù ba yếu tố là hit time, miss rate và miss penalty Cụ the nó được định nghĩa như sau:
AMAT = Hit time + (Miss Rate X Miss Penalty)
2.5 Sử dụng systemverilog để thiết kế phần cứng
Với sự phát triển gần đây của các công cụ tổng hợp, SystemVerilog (gọi tắt là SV) tù chỗ là một ngôn ngữ lập trình được sử dụng chủ yếu để tạo ra môi trường mô phỏng để kiểm định thiết kế phần cứng đã dần trở thành ngôn ngữ thiết kế phần cứng Việc sử dụng sv trong thiết kế phần cứng đã mang đến nhiều mặt tích cực cho thiết kế Ví dụ như mã RTL được trình bày ngắn gọn, dễ đọc hơn (sử dụng interface thay vì dùng module ports) hay giải quyết được những lỗi của Verilog mà chỉ được tìm thấy ở giai đoạn sau tống hợp (sử dụng alwayscomb, always ff, always latch thay vì dung always như Verilog trước đây)
Sau đây, một số thành phần hay phương pháp thiết kế mới mà sv mà mang lại
sẽ được trình bày:
2.5.1 Kiểu dữ liệu logic
Verilog sử dụng 2 kiểu dữ liệu là wire và reg để khai báo các tín hiệu Và việc dùng 2 kiểu dữ liệu này cần phù họp với ngữ cảnh nơi mà tín hiệu được khai báo sử dụng Ví dụ như biến được khai báo với kiểu reg không thể sử dụng bên ngoài khối always hay biến được khai báo với kiểu wire không thể sử dụng bên trong khối always vv sv giải quyết rắc rối thông qua việc thống nhất
30
Trang 322 kiểu dữ liệu đó thành kiểu logic Với sv, nguời viết RTL không còn lúng túng với việc chọn lựa khai báo cho từng port của module là reg hay wire Ví dụ:
module sv_example ( input logic[ 1:0] a, b, output logic c
);
always @(a,b) begin if (a[0]==b[0] && a[l]==b[l])c = 1; else c = 0; end
endmodule
2.5.2 always_comb, always_latch, always_ff
Verilog cung cap một định nghĩa always duy nhất để nguời lập trình tạo
ra các thành phần combination logic, flipflop hay latch Dựa vào cách viết RTL, công cụ tổng hợp tự suy luận ra logic mà nguời viết RTL mong muốn Do đó, không có cách nào để kiểm tra khối always đó viết đúng hay sai cho đến khi qua giai đoạn tổng họp
sv đã giải quyêt vấn đề thông qua việc đua ra những định nghĩa mới always_comb, always_latch hay always_ff để viết ra các thành phần combination logic, flipflop hay latch một cách tuờng minh Và các thành phần đuợc kiểm tra đúng sai ngay lúc chạy mô phỏng
Khối always ở ví dụ trên có thể viết lại nhu sau:
always_comb begin if (a[0]==b[0] && a[l]==b[l])c =
1; else c = 0; end
2.5.3 Kiểu dữ liệu ngưòi dùng tự định nghĩa
Kiểu dữ liệu tụ định nghĩa thông qua typedef hay enum giúp cho mã viết
ra đuợc gọn gàng và trực quan nhung verilog không hỗ trợ điều này Tuy vậy, điều may mắn là sv đã hỗ trợ chúng trong thiết kế RTL
Ví dụ:
typedef logic [31:0] arm_bus; arm_bus axi4_bus, apb_bus, ahb_bus;
enum logic [1:0] [IDLE, ACTIVE, CHECK, ANSWER} en_state;
2.5.4 Interface
Một trong những nhuợc điểm lớn của Verilog truớc đây chính là việc khai báo cống (input, output, inout) của module và kết nối những module thông qua việc kết nối từng tín hiệu ra vào này Việc khai báo và kết nối này tạo ra những đoạn mã RTL trùng lắp ở nhiều noi và tạo ra nguy co sai sót sv đã khắc