March 14, 2012 Verilog Compiler 1.1 Xây dựng phần mềm biên dịch ngôn ngữ phần cứng Verilog sử dụng trong kiểm chứng vi mạch Hình 1 : Xây dựng trình biên dịch file verilog Ý tưởng thiết
Trang 1Trường Đại Học Bách Khoa Khoa Điện Tử- Viễn Thông
SHSV: 20073221
3/2012
Trang 2March 14, 2012 Verilog Compiler
Mục Lục 2
Mục Lục
Mục Lục 2
Lời Mở Đầu 4
1 5
TỔNG QUAN VỀ HỆ THÔNG 5
1.1 Xây dựng phần mềm biên dịch ngôn ngữ phần cứng Verilog sử dụng trong kiểm chứng vi mạch 5
1.1.1 Lý do xây dựng Verilog Compiler? 6
1.1.2 Các khối chính xây dựng chương trình 7
1.2 Ngôn ngữ mô tả phần cứng –HDL (Hardware Design Language) 7
1.2.1 Ngôn ngữ VHDL 7
1.2.2 Ngôn ngữ Verilog 7
1.3 Khái niệm về trình biên dịch 8
1.4 Open Source 9
1.4.1 ODIN-ii 10
1.4.2 FCK Component 10
2 11
PHÂN TÍCH 11
2.1 Các pha trong quá trình thiết kế trình biên dịch 11
2.1.1 Phân tích từ vựng (Lexical Analysis ) 12
2.1.2 Phân tích cú pháp (Syntax Analysis) 13
2.1.3 Phân tích ngữ nghĩa (Semantic Analysis) 13
2.1.4 Sinh mã trung gian (Intermediate Code Generator) 14
2.1.5 Tối ưu mã (Code Optimizer) 14
2.1.6 Sinh mã (Code generation) 14
2.1.7 Bảng quản lý ký tự ( Symbol table manager) 14
Trang 3March 14, 2012 Verilog Compiler
3
2.1.8 Xử lý lỗi (Error Handing) 15
2.2 Lex Tool 15
2.3 Bison Tool 17
3 19
THIẾT KẾ HỆ THỐNG 19
3.1 VERILOG2AST 19
3.2 AST2NETLIST 21
3.3 AST2FCK 22
3.4 KẾT QUẢ ĐÃ ĐẠT ĐƯỢC 22
Tài Liệu Tham Khảo 23
Trang 4March 14, 2012 Verilog Compiler
Lời Mở Đầu 4
Lời Mở Đầu
Thiết kế trình biên dịch trong những thập niên 50 của thế kỷ trước được coi là một trong những công việc lập trình khó nhất Bởi việc thiết trình biên dịch đòi hỏi phải hiểu biết về nhiều lĩnh vực : Ngôn ngữ lập trình ,kiến trúc máy tính , lý thuyết ngôn ngữ, các thuật toán và các công nghệ phần mềm Nhưng ngày nay thì số lượng trình biên dịch đã nhiều nến nỗi mà việc thiết kế một trình biên dịch trở nên quá thừa và không cần thiết Thiết kế trình biên dịch đã trở nên dễ dàng hơn Những trình biên dịch - trình biên dịch (compiler-compiler) đã hỗ trợ cho công việc biên dịch ngôn ngữ trở nên dễ dàng và thuận tiện hơn
Thiết kế trình biên dịch một ngôn ngữ phần cứng có thể không phải là một ý tưởng mới Đã có rất nhiều công ty cũng như nhiều lập trình viên đã nghĩ đến Nhưng một trình biên dịch thông minh có thể biên dịch một thiết kế bằng ngôn ngữ mô tả phần cứng đưa vào cấu trúc dữ liệu dùng trong lĩnh vực còn khá mới
mẻ Formal Verification lá một ý tưởng thú vị Một thiết kế ghép nối file thiết kế HDL vào một cấu trúc dữ liệu dùng để kiểm chứng sẽ là một bước tiến trong quá trình kiểm chứng một thiết kế lớn phức tạp Chất xúc tác nhỏ thúc đẩy lĩnh vực Formal Verification còn đang khá lá mới mẻ
Trang 5March 14, 2012 Verilog Compiler
1.1 Xây dựng phần mềm biên dịch ngôn ngữ phần cứng Verilog sử dụng trong kiểm chứng vi mạch
Hình 1 : Xây dựng trình biên dịch file verilog
Ý tưởng thiết kế ở đây là xây dựng một trình biên dịch ngôn ngữ phần cứng Verilog Trình biên dịch sẽ có khả năng phân tích được cấu trúc dữ liệu của một file định dạng verilog(.v) Biến đổi cấu trúc của nó thành một định dạng khác netlist và có khả năng đưa vào cấu trúc dữ liệu FCK Component FCK Component
sẽ lưu trữ dưới dạng một mạch điện FCK Component còn có khả năng hỗ trợ việc viết một property để có thể dùng trong kiểm chứng vi mạch
Trang 6March 14, 2012 Verilog Compiler
TỔNG QUAN VỀ HỆ THÔNG 6
1.1.1 Lý do xây dựng Verilog Compiler?
Có rất nhiều hệ thống mã nguồn mở khác cũng đã xây dựng một trình biên dịch ngôn ngữ Verilog hoặc VHDL ODIN-ii là framework như vậy ODIN-ii cho phép các nhà nghiên cứu và thiết kế phần cứng có một môi trường triển khai và tối ưu
hệ thống
Bắt đầu từ thư viện FCK Component có khả năng hỗ trợ mô hình hóa mạch điện dựa trên sự phát triển của Formal Verification Bên cạnh ý tưởng mô hình hóa những cổng logic thành những đối tượng FCK còn hỗ trợ một cách tự động việc phân tích một file cũng như cài đặt thuật toán SAT Solver , OBDD…
FCK Component hoàn toàn được viết dưới dạng các class C++ Đầu vào của FCK vốn là một mạch điện vốn được nhập bằng tay Điều đó có thể thực hiện được với những thiết kế nhỏ ,ít các thành phần Một ý tưởng tự nhiên là thiết kế một phần mềm có khả năng tự động ghép nối một thiết kế phần cứng bằng ngôn ngữ verilog vào cấu trúc dữ liệu mạch điện của FCK đã được hình thành Xem xét những mã nguồn hiện nay thì ODIN-ii giúp biên dịch một thiết kế phần cứng bằng ngôn ngữ verilog Nhưng code Odin-ii hoàn toàn là thuần C , việc ghép nối trở nên khó khăn và thiếu đồng bộ Việc quản lý mã nguồn khó khăn hơn khi mà cần phải thiết kế mở rộng và bố sung nó Đầu ra của Odin-ii còn có định dạng là một file blif Tuy định dạng file blif là một định dạng đơn giản, nhưng Odin-ii đã biên dịch các khối thành mức gate netlist khá nhỏ và chi tiết, khiến cho định dạng blif là một file khá lớn ngay cả với những thiết kế nhỏ Việc giữ lại những khối như bộ MUX,
bộ CỘNG k bít sẽ là một ý tưởng hướng đến trong phần mềm của chúng ta
Trang 7March 14, 2012 Verilog Compiler
TỔNG QUAN VỀ HỆ THÔNG 7
1.1.2 Các khối chính xây dựng chương trình
Khối 1: Front-end (Verilog2AST): Biến code Verilog ở đầu vào, xây dựng nên mô hình cấu trúc dữ liệu cây cú pháp AST (Abstract Syntax Tree)
Khối 2: Backend (AST2FCK): Từ cấu trúc dữ liệu cây cú pháp AST
(Abstract Syntax Tree) xây dựng nên cấu trúc Netlist của mạch
1.2 Ngôn ngữ mô tả phần cứng –HDL (Hardware Design
Language)
Hai ngôn ngữ sử dụng phổ biến việc miêu tả thiết kế một hệ thống phần cứng là Verilog và VHDL Verilog được sử dụng rộng rãi ở Mỹ , còn VHDL lại là chuẩn được sử dụng trong các ngành công nghiệp ở châu Âu
1.2.1 Ngôn ngữ VHDL
Ngôn ngữ VHDL được cung cấp để hổ trợ phát triển các hệ thống phần cứng dựa trên các loại mạch(chip) tích hợp tốc độ cao(VHSIC-Very High Speed Integrated Circuit) Việc sử dụng các loại chíp kiểu này đã thay thế dần các IC logic mà thường được sử dụng trong việc thiết kế mạch số, đem lại nhiều lợi ích và thuần tiện trong việc phát triển các hệ thống số mà phương thức thiết mạch số truyền thống khó hoặc không thể thực hiện được
1.2.2 Ngôn ngữ Verilog
Verilog dễ học và dễ sử dụng hơn VHDL Verilog được chuẩn hoá theo chuẩn IEEE vào năm 1995 và 2001 Verilog rất giống ngôn ngữ C và được giới chuyên môn nghiên cứu, sử dụng nhiều
Trang 8March 14, 2012 Verilog Compiler
TỔNG QUAN VỀ HỆ THÔNG 8
Verilog HDL có thể được sử dụng để thiết kế hệ thống số ở nhiều mức khác nhau, ví dụ ở mức cao như các mô hình đặc trưng đến các mức thấp như mô hình
bố trí dây, điện trở, transistor trên một mạch tích hợp; mô tả các cổng logic,
flip_flop trong hệ thống số; mô tả thanh ghi và sự di chuyển dữ liệu giữa các thanh ghi (RTL - Register Transfer Level)
Tại sao sử dụng Verilog HDL ?
Verilog cho phép các nhà thiết kế logic thiết kế và mô tả hệ thống số ở nhiều mức độ khác nhau và có sự hỗ trợ từ các công cụ thiết kế bằng máy tính để giúp cho việc xử lý thiết kế ở những mức độ khác nhau
1.3 Khái niệm về trình biên dịch
Trình biên dịch (Compiler) còn gọi là phần mềm biên dịch, là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (gọi là ngôn ngữ nguồn hay mã nguồn-source language ) thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ máy tính mới (gọi
là ngôn ngữ đích-target language) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy Chương trình mới được dịch này gọi mã đối tượng
Một phần quan trọng trong quá trình dịch là ghi nhận lại các lỗi có trong chương trình nguồn để thông báo lại cho người viết chương trình
Trang 9March 14, 2012 Verilog Compiler
Chương trình nguồn khung (Skeletal source program)
Chương trình nguồn (Source program)
Chương trình hợp ngữ đích (Target assembly program)
Chương trình hợp ngữ đích (Target assembly program)
Mã máy tuyệt đối (Absolute machine code)
Thư viện/tập tin đối tượng (Library/object files)
Hình 3 : Ngữ cảnh của trình biên dịch trong hệ thống xử lý ngôn ngữ
1.4 Open Source
Mục này sẽ trình bày các framework đã có sẵn dùng trong kiểm chứng vi mạch
Trang 10March 14, 2012 Verilog Compiler
TỔNG QUAN VỀ HỆ THÔNG 10
1.4.1 ODIN-ii
ODIN-ii là một framework đã sẵn , sử dụng 2 tools flex và bison, biên dịch một file định dạng verilog , xuất ra dưới dạng netlist và có khả năng map các thành phần vào trong phần cứng FPGA
Chức năng
Odin II sử dụng trực tiếp thư viện VPR → Cho phép mô tả cấu trúc
Có khả năng đọc file Netlist sinh ra sau thiết kế và lưu vào cấu trúc giữ liệu để phân tích
Phần phân tích cú pháp trong Front-end của Odin II được xây dưng bởi các tool Bison và Flex Việc làm này cung cấp thông tin theo thứ tự cấp bậc theo dạng AST (abstract syntax tree) →Tạo ra một Netlist
AST nhận dạng các cấu trúc theo chức năng
Thông tin từ AST được dung để kết nối các cấu trúc trong thiết lớn, phức tạp
FCK được viết bởi nhóm nghiên cứu của trường đại học Kaiserslautern , Đức
FCK là một thư viện mã nguồn mở có cấu trúc dữ liệu mô hình hóa mạch điện dựa trên sự phát triển của Formal Verification Bên cạnh ý tưởng mô hình hóa những cổng logic thành những đối tượng FCK còn hỗ trợ một cách tự động việc phân tích một file cũng như cài đặt thuật toán SAT Solver , OBDD…
Trang 11March 14, 2012 Verilog Compiler
2.1 Các pha trong quá trình thiết kế trình biên dịch
Phần này sẽ trình bày về các pha trong quá trình thiết kế trình biên dịch , có 6 pha
Quá trình biên dịch được chia thành nhiều giai đoạn
Các giai đoạn biên dịch được minh hoạ trong hình vẽ dưới đây
Trang 12March 14, 2012 Verilog Compiler
PHÂN TÍCH 12
Hình 4 : Các giai đoạn trong quá trình biên dịch
2.1.1 Phân tích từ vựng (Lexical Analysis )
• Giai đoạn phân tích từ vựng sẽ đọc chương trình nguồn từ trái sang phải (linear analysis/scanning) để tách ra thành các mã thông báo (token)
• Nhiệm vụ chính: Đọc từng kí tự vào (input characters) từ chương trình nguồn và nhóm lại thành các token phục vụ cho giai đoạn phân tích cú pháp sau
đó
Trang 13March 14, 2012 Verilog Compiler
PHÂN TÍCH 13
Hình 5 : Phân tích từ vựng
2.1.2 Phân tích cú pháp (Syntax Analysis)
• Giai đoạn phân tích cú pháp thực hiện công việc nhóm các token của
chương trình nguồn thành các cụm từ văn phạm (grammatical phrase)
• Thông thường các cụm từ văn phạm này được biểu diễn bằng cây phân tích
cú pháp (abstract syntax tree) với :
- Ngôn ngữ được định nghĩa bởi các luật sinh (production)
- Phân tích cú pháp dựa vào luật sinh để xây dựng cây phân tích cú pháp
• Cấu trúc phân cấp của một chương trình thường được diễn tả bởi quy luật
đệ qui
2.1.3 Phân tích ngữ nghĩa (Semantic Analysis)
• Giai đoạn phân tích ngữ nghĩa sẽ thực hiện việc kiểm tra xem chương trình nguồn có chứa lỗi về ngữ nghĩa hay không
• Tập hợp thông tin về các kiểu dữ liệu cho giai đoạn sinh mã về sau
Source
program
Lexical analyzer Get next token
Token
Parser
Symbol table
Trang 14March 14, 2012 Verilog Compiler
PHÂN TÍCH 14
2.1.4 Sinh mã trung gian (Intermediate Code Generator)
• Sau khi phân tích cấu trúc và ngữ nghĩa, một số trình biên dịch sẽ tạo ra một dạng biểu diễn trung gian của chương trình nguồn
• Mã trung gian có 2 đặc tính quan trọng: Dễ tạo và dễ dàng chuyển đổi thành chương trình đíc
2.1.5 Tối ưu mã (Code Optimizer)
• Giai đoạn tối ưu mã cố gắng tối ưu mã trung gian để thu được mã máy thực hiện nhanh hơn
2.1.6 Sinh mã (Code generation)
• Giai đoạn cuối cùng của biên dịch là sinh mã đích, thường là mã máy hoặc
mã hợp ngữ
• Vị trí các vùng nhớ gán cho các biến được chương trình sử dụng
2.1.7 Bảng quản lý ký tự ( Symbol table manager)
Một nhiệm vụ quan trọng của trình biên dịch là ghi lại các định danh được sử
dụng trong chương trình nguồn và thu thập các thông tin về các thuộc tính khác
nhau của mỗi định danh
• Các thuộc tính cung cấp thông tin về vị trí bộ nhớ được cấp phát cho một định danh, kiểu và phạm vi của định danh
• Nếu định danh là tên của một thủ tục thì thuộc tính là các thông tin về số lượng và kiểu của các đối số, phương pháp truyền đối số và kiểu trả về của thủ tục (nếu có)
Trang 15March 14, 2012 Verilog Compiler
PHÂN TÍCH 15
2.1.8 Xử lý lỗi (Error Handing)
• Mỗi giai đoạn biên dịch có thể gặp nhiều lỗi, ví dụ:
Giai đoạn phân tích từ vựng gặp lỗi khi các ký tự không thể ghép thành một token
Giai đoạn phân tích cú pháp gặp lỗi khi các token không thể kết hợp với nhau theo đúng cấu trúc ngôn ngữ
Giai đoạn phân tích ngữ nghĩa gặp lỗi khi các toán hạng có kiểu không
đúng yêu cầu của phép toán
Sau khi phát hiện ra lỗi, tùy thuộc vào trình biên dịch mà có các cách xử lý lỗi khác nhau: Quá trình biên dịch có thể dừng lại hoặc tiếp tục
2.2 Lex Tool
Lex Tool là các công cụ có sẵn cho phép xây dựng một bộ phân tích từ vựng dựa trên các biểu thức chính qui Nó bao gồm lex và Flex
Sơ đồ sau chỉ rõ cách tạo một bộ phân tích từ vựng bằng cách sử dụng Lex
Lex là một công cụ để tạo một máy quét Một máy quét sẽ nhận diện các từ hay các mẫu trong một đoạn hay một file văn bản Lex được phát triển bởi M E Lesk
và E Schmidt ở phòng thí nghiệm của hãng truyền thong AT&T Bell Đầu vào của Lex là một file gồm các định nghĩa về các token được sử dụng trong các biểu thức Lex quét qua toàn bộ của văn bản để biên dịch và có thể được liên kết với các module biên dịch khác Khi biên dịch ,Lex tạo ra một file chứa hàm yylex()
Lex source
program lex.l
Lex
Trang 16March 14, 2012 Verilog Compiler
Hình 1 Cấu trúc của một file Flex
Cấu trúc của một file Flex thường bao gồm 4 thành phần cơ bản như trên
C declarations Bao gồm các khai báo về các biến , hoặc các mảng Các định
nghĩa các hàm sẽ được sử dung để thực hiện các hành động trong phần Flex
grammar rules Đối với những chương trình đơn giản, phần này có thể không cần khai báo gì
Flex Declarations
name definition
Trang 17March 14, 2012 Verilog Compiler
PHÂN TÍCH 17
Gồm các định nghĩa để làm cho cấu trúc của máy quét đơn giản Ví dụ DIGIT [a-zA-Z]* được hiểu là DIGIT có thể là các ký từ từ a-z hoặc A-Z Ký tự * thể hiện có thể không hoặc nhiều ký tự như vậy Định nghĩa có thể được sử dụng trong phần Flex Grammar rules bằng cách sử dụng
“{name }” ở đây là {DITGIT}
Flex Grammar rules Bao gồm một hoặc nhiều hành động tương ứng với luật
của cú pháp Flex
pattern action
Một action có thể là một hành động rỗng hay nói một cách khác nó không làm
gì cả
Các action được định nghĩa trong phần Additional C code
Additional C code Đoạn mã C sẽ được đưa đến cuối của một chương trình
Một trong những phiên bản mở rộng của Yacc đó là Bison
Bison là một công cụ để phân tích một tệp văn bản Nó phân tích các dữ liệu đầu vào dựa trên những luật được định nghĩa Đầu vào của Bison là một file có định dạng y Bison sẽ biên dịch file định dạng này thành một file chương trình C hoặc C++
Trang 18March 14, 2012 Verilog Compiler
PHÂN TÍCH 18
Cấu trúc của file đầu vào của bison cũng có 4 thành phần tương tự như flex
C declarations Chứa các hàm , các biến hay các marco sẽ được sử dụng trong
Bison grammar rules
Bison declarations Bao gồm định nghĩa về terminal và non-terminal
Bison grammar rules Bao gồm một hoặc nhiều lời gọi hàm yyparse Hàm yylex sẽ luôn được gọi trong quá trình phân tích file
Hàm yylex ở flex đọc các ký tự dầu vào và sẽ trả về token tương ứng Bison sẽ
sử dụng các token này để phân tích và đưa ra những action tương ứng
Additional C Code Đoạn mã C sẽ được copy xuống cuối của chương trình Hàm yyerror sẽ được gọi khi có lỗi xảy ra trong quá trình phân tích file Dòng đang được phân tích được lưu trong biên yylineno
Để bắt đầu quá trình phân tích file , hàm yyparse cần được gọi Hàm yylex luôn được gọi trong Bison grammar rules Mỗi một quy tắc được thỏa mãn sẽ được trả
về một hành động nằm trong { } Chúng ta có thể thực hiện các hàm C nằm trong các dấu ngoặc nhọn này
Để tạo ra một Bison parser ta sử dụng câu lệnh sau