Chương này trình bày chỉ tiết các vấn dé triển khai cho bộ phát sinh chương trình kiểm tra ngẫu nhiên cho thiết kế RISC-V. Ngôn ngữ lập trình được sử dụng là C++, một ngôn ngữ lập trình hướng đối tượng (OOP — Object Oriented Programming). Sử dụng những tính chất của ngôn ngữ như tính kế thừa, tính đa hình
để hiện thực khóa luận. Nhóm sử dụng phần mềm Visual Studio để hiện thực khóa luận. Mục 3.1, Mục 3.2 lần lượt trình bày thiết kế hệ thống và thiết kế chỉ tiết của
RISC-V RTG.
3.1. Thiết kế hệ thống
Khóa luận này chỉ dừng lại ở việc tạo ra bộ phát sinh chương trình kiểm tra ngẫu nhiên cho thiết kế RISC-V. Hình 3.1 trình bày kiến trúc hệ thống của RISC-V RTG.
Tép báo cáo Random Test
(.txt files) Generator
Assembly test program
on disk (.S files)
Configuration
file
Assembler
test program on
disk (.elf files)
Hinh 3.1: Thiét ké hé thong Bước đầu tiên RISC-V RTG sé doc tép configuration để nắm được số lượng testcases muốn tạo ra. Sau đó sẽ phát sinh ra số lượng testcases mong muốn. Những testcases này là những chương trình hợp ngữ (.S files) dùng dé xác minh chức năng
bộ vi xử lý và dùng để kiểm tra tính đúng đắn của kiến trúc tập lệnh trong bộ vi xử lý
đó. Tệp testcases này sau khi được tạo ra sẽ đưa qua ISS đề tính độ bao phủ và thử
25
nghiệm chương trình. Hơn nữa, sau khi sau khi chạy bộ phát sinh chương trình kiểm tra ngẫu nhiên sẽ tạo ra những tệp báo cáo tương ứng với những testcases được tạo
ra. Các tệp báo cáo này là những thống kê về số lượng thanh ghi và tên lệnh đã sử dụng trong testcases đó. Bước tiếp theo thông qua Assembler để chuyển những
testcases là các chương trình hợp ngữ thành ngôn ngữ mã máy (.elf files). Những
testcases là những chương trình mã máy sẽ đưa cho các nhóm thiết kế phần cứng để
họ tự kiểm tra.
3.2. Thiết kế chỉ tiết
3.2.1. Random Test Generator
Nhóm dựa vào những cơ sở lý thuyết được tìm hiểu, và những ưu nhược điểm từng phương pháp của RTG. Nhóm quyết định thực hiện khóa luận dựa trên phương pháp “Table Based Generators” [4]: Bộ phát sinh chương trình kiểm tra ngẫu nhiên dựa vào bảng. Ngoài những ưu điểm của phương pháp này như dễ thực hiện, xác xuất thành công cao, hay chỉ phí bảo trì thấp thì những nhược điểm của phương pháp này nhóm sẽ khắc phục bằng phương pháp “Weighted Randomness” [5].
Weighted Randomness: Bộ phát sinh chương trình kiểm tra ngẫu nhiên dựa
vào trọng SỐ. Trong cơ chế này, mỗi lệnh được liên kết với một trọng số, cho biết xác
suất được chọn bởi bộ tạo. Trọng số cao có nghĩa là xác suất cao và do đó sẽ có nhiều
trường hợp của lệnh được tạo ra trong một chương trình. Trọng số thấp có nghĩa là xác suất thấp va do đó dẫn đến một vai trường hợp của lệnh có thé được tạo ra ít hoặc thậm chí là không được tạo. Tất cả các trọng số cùng nhau tạo thành một hàm phân phối xác suất cho tập lệnh. Nếu một chương trình thử nghiệm chỉ chứa một số loại lệnh đã chọn sẽ được tạo, trọng số tương ứng được đặt thành một số lớn hơn 0 và trọng số của tất cả các lệnh khác được đặt thành 0.
Việc thực thi bộ phát sinh chương trình kiểm tra ngẫu nhiên bắt đầu bằng cách phân tích cú pháp các đầu vào do người dùng cung cấp và đọc tệp configuration. Hình 3.2 trình bày sơ đồ thuật toán của RISC-V RTG.
26
“mm
ị Begin `
j
name == "Numsequence"(1) or
inst_ name == “NumWeights”(2)
v Vv
TẾ (1) read the number If (2) read the number
testcases of sequences testcases of weights
Vv Ỷ Random functions to generate (F) Initialize Registers and Data
Memoi
set =0 z
f++
Ỷ Ỷ
Select a Random Instruction Class Random Instruction based on and Pick Random Instruction weights
Class from selected class
No |
Yes
Initialize Registers and Data
Memory
Report
—Y
( eaằ
> ni }
` 7
Hình 3.2: Sơ đồ thuật toán của bộ phát sinh chương trình kiểm tra ngẫu nhiên
27
Tương đương với hai thông số “NumSequences” và “NumWeights” của tệp configuration thì RISC-V RTG sẽ tạo ra hai kiểu đầu ra khác nhau:
- Với thông số “NumSequences” thi đầu ra sẽ là những mẫu thử nghiệm được
dựa trên phương pháp Table Based Generators. Ở những mẫu thử nghiệm này,
RISC-V RTG sẽ được tạo thành từ một chức năng chính và các chức năng
khác được tạo ngẫu nhiên. Các mẫu thử nghiệm được tạo ra có độ dài chuỗi lệnh tùy ý và được đặt ở các vị trí ngẫu nhiên. Dựa vào phương pháp này,
những mẫu thử nghiệm sẽ đảm bảo được việc triển khai ngăn chặn đệ quy và
tránh các vòng lặp vô hạn gây ra bởi các lệnh gọi hàm ngau nhiên. Hon nữa là đảm bảo rằng địa chỉ đích của một lệnh rẽ nhánh luôn là một vị trí chương
trình hợp lệ.
- Với thông số “NumWeights” thì đầu ra sẽ là những mẫu thử nghiệm được dựa
trên phương pháp Weighted Randomness. Ở đầu ra dựa vào phương pháp này thì các RISC-V RTG sẽ tạo ra những mẫu thử nghiệm là các chuỗi lệnh mà
các lệnh được tạo ra sẽ phải phụ thuộc vào trọng số của nhóm lệnh. Những trọng số này sẽ được người dùng định nghĩa tại tệp configuration. Với các
nhóm lệnh có trọng số cao, các lệnh trong nhóm đó sẽ được tạo ra nhiều, ngược
lại nếu nhóm lệnh nào có trọng số thấp thì các lệnh trong nhóm đó sẽ được tạo
ra ít. Mỗi lệnh có thể tạo ra nhiều lần hoặc thậm chí có lệnh sẽ không được tạo
Ta.
Trong khóa luận, dựa vào sơ đồ thuật toán của RTG được mô tả ở Hình 3.2, nhóm đã sử dụng một số cấu trúc dữ liệu và giải thuật, phương thức và hàm trong ngôn ngữ lập C++. Bảng 3.1 trình bày chỉ tiết về cấu trúc dữ liêu, hàm và thư viện
chính được nhóm sử dụng trong khóa luận.
28
Bảng 3.1: Cấu trúc dữ liêu, hàm và thư viện được sử dụng Tên cấu
trúc dữ liệu
và hàm
Thư viện
sử dụng
Mô tả
Con trỏ hàm <iterator> Con trỏ hàm hay còn được gọi là function pointers
thường được sử dụng khi các hàm có cùng kiều trả về
và danh sách tham số hoặc khi cần truyền một hàm
cho hàm khác.
map <map> Có kiểu cấu trúc liên kết. Mỗi phần tử của map là sự
kết hợp của khóa (key value) và ánh xạ của nó
(mapped value). Dữ liệu trong map không chứa các
khóa giống nhau
Vector <vector> Là một class trong thư viện STL của C++. Nó được
sử dụng để lưu trữ tập hợp phan tử cùng kiểu dữ liệu.
Nó tự quản lý việc cấp phát thêm không gian lưu trữ khi thêm một phan tử vào trong vector. Có thể hiểu đơn giản nó có thể sử dụng thay cho mảng nhưng thuận tiện hơn vì không cần quan tâm việc quản lý vùng nhớ thủ công nếu số lượng phan tử vượt quá
kích thước cho phép
Rand) va
Srand()
<cstdlib>
<ctime>
Để tạo ra một số ngau nhiên cstdlib hd trợ ham rand(). Hàm này trả về cho kết quả là một giá trị nguyên có giá trị từ0 đến RAND MAX, với RAND_MAX là một hằng số được định nghĩa
trong thư viện <cstdlib>.
29
Đề mỗi lần chạy cho ra 1 chuỗi kết quả khác nhau,
thay đổi random seed bằng cách sử dụng hàm
srandQ và truyền vào 1 con số có thể thay đổi được.
Để tạo ra một giá trị ngẫu nhiên trong khoảng xác
định, sử dụng công thức rand() % (max — min + 1) +
min để nhận kết quả trong khoảng từ min đến max.
1fstreamQ Sử dụng dé đọc dữ liệu từ tệp. Cụ thé là đọc dữ liệu
từ tép configuration.
ofstream() Sử dụng dé ghi dữ liệu xuống tệp. Cụ thé là ghi dữ
liệu như tên lệnh, thanh ghi, số tức thời, ...
shuffleQ <algorithm>
<random>
Sử dụng ham shuffle() dé xáo trộn những lệnh được tạo ra. Dé sử dụng được hàm shuffle() trước tiên phải
xây dụng một vector có nội dung là danh sách các lệnh sẽ được tạo ra. Sau khi có được danh sách này,
hàm shuffle() sẽ trộn danh sách này lại và sẽ tạo ra
các lệnh ngẫu nhiên không biết trước.
clock() <time.h> Str dung ham clock() trong thu vién time.h dé do thoi
gian thực thi của một chương trình tử lúc bắt đầu cho đến khi kết thúc. Kiểu trả về của chương trình sẽ là unsigned long dựa vào kiểu hàm trả về là clock_t.
Sau khi RISC-V RTG tạo ra được những mẫu thử nghiệm thì ở mỗi một
testcase sẽ có một tệp báo cáo riêng. Việc thiết kế thêm tệp báo cáo này sẽ giúp người dùng có thể dễ dàng trong việc kiểm tra cũng như đánh giá mức độ ngẫu nhiên của chương trình. Ngoài ra tệp báo cáo này sẽ liệt kê các thông số liên quan đến lệnh và thanh ghi. Nhờ vào những dữ liệu này người dùng có thé đánh giá được chương trình
có tạo ra chuỗi lệnh phụ thuộc theo trọng số đã được định nghĩa tại tệp configuration
30
đúng hay không. Ngoài ra, thông qua số liệu của tệp báo cáo người dùng có thé biết được số lần sử dụng của thanh ghi và lệnh trong mỗi một mẫu thử nghiệm. Nội dung
của một tệp báo cáo được minh họa ở Bảng 3.2.
Bảng 3.2: Biểu diễn minh họa cho một nội dung tệp báo cáo
REPORTS
INSTRUCTIONS REGISTERS
Instructions Num_inst was used Registers Num reg was used ADDI 1 X0 41
SLTI 2 XI 5
SLTUI 2 X2 6
XORI 1 X3 7