Tài liệu Verilog
Tài liệu tham khảo Verilog ngắn gọn, đi kèm ví dụ. Đọc khái niệm, xem code, rồi luyện tập trong một hành trình Coddy.
Bắt đầu khóa họcBắt đầu
- Verilog là gì?Giới thiệu Verilog bằng lời dễ hiểu: nó là gì, dùng để làm gì, khác ngôn ngữ lập trình thông thường ra sao, và vì sao kỹ sư thiết kế số vẫn dùng nó sau 40 năm.
- Phần cứng và phần mềmVì sao Verilog dễ khiến bạn bối rối sau khi đã quen ngôn ngữ phần mềm: mặc định chạy đồng thời, thời gian là khái niệm cốt lõi, và các câu lệnh không chạy theo thứ tự.
- Cài đặt VerilogCài Icarus Verilog và GTKWave để biên dịch và mô phỏng Verilog ngay trên máy. Hoặc bỏ qua bước cài đặt và dùng trình soạn thảo trên trình duyệt: cách nào cũng dùng được cho bộ tài liệu này.
- Module đầu tiênViết module Verilog hoàn chỉnh đầu tiên từ con số 0: khai báo, cổng, một đoạn logic tổ hợp và một testbench để điều khiển nó. Chạy được ngay trên trình duyệt.
- Chú thíchCách viết chú thích một dòng và nhiều dòng trong Verilog, cùng các mẫu viết tài liệu mà kỹ sư thiết kế số dùng để giữ module dễ đọc khi chúng lớn dần.
Kiểu dữ liệu và số
- Wire và regHai kiểu dữ liệu chính trong Verilog: `wire` cho kết nối liên tục và `reg` cho lưu trữ trong khối thủ tục, cùng quy tắc giúp bạn luôn chọn đúng giữa hai loại.
- Vector và mảngCách khai báo tín hiệu nhiều bit với `[7:0]`, cắt lát chúng, kết hợp chúng, và sự khác nhau giữa vector packed và mảng bộ nhớ.
- Tham sốCách dùng `parameter` và `localparam` để định nghĩa hằng số lúc biên dịch, tham số hóa độ rộng và độ sâu, và ghi đè giá trị khi khởi tạo module.
- Hằng số dạng sốCách Verilog viết hằng số: có độ rộng và không có độ rộng, các cơ số `'b` `'h` `'d` `'o`, số có dấu, dấu gạch dưới để dễ đọc, và những cái bẫy người mới hay gặp.
- Giá trị x và zTín hiệu Verilog có bốn giá trị có thể có, không phải hai. Đây là ý nghĩa thật của `x` (không xác định) và `z` (trở kháng cao) trong mô phỏng, cùng cách gỡ lỗi chúng.
Toán tử
- Toán tửCác toán tử cốt lõi trong Verilog: số học, so sánh, logic và toán tử điều kiện `?:`, cùng các quy tắc và cái bẫy khi trộn độ rộng và số có dấu.
- Bitwise và reductionCác toán tử cấp bit trong Verilog: AND/OR/XOR theo từng bit, các dạng đảo, và toán tử reduction thu gọn cả một vector thành một bit duy nhất.
- Ghép nối và nhân bảnCách ghép các tín hiệu lại với nhau bằng `{}` và lặp một mẫu bit N lần bằng `{N{...}}`, hai toán tử Verilog không thể thiếu khi dựng bus rộng hơn từ nhiều mảnh.
Module và cấu trúc
- Port của moduleCách khai báo port của module (input, output và inout), danh sách port kiểu ANSI, và khi nào một output nên là `wire` hay `reg`.
- Khởi tạo moduleCách khởi tạo một module bên trong module khác, sự khác nhau giữa kết nối port theo tên và theo vị trí, cùng các mẫu nhiều instance bạn sẽ dùng để xây thiết kế thật.
- Phép gán liên tụcCách `assign` hoạt động: mối quan hệ luôn đúng mà nó mô tả, những gì nó có thể và không thể điều khiển, và các mẫu mà nó làm tốt hơn code thủ tục.
Khối thủ tục
- Khối alwaysCách khối `always` hoạt động, khác biệt giữa `always @(*)` tổ hợp và `always @(posedge clk)` theo clock, cùng các quy tắc quyết định mỗi loại tạo ra phần cứng gì.
- Khối initialKhối `initial` khác `always` ra sao, vì sao nó chỉ tồn tại trong mô phỏng, và các mẫu thường dùng: tạo kích thích, thiết lập dạng sóng, in tiêu đề log.
- Blocking và non-blockingChủ đề gây nhầm lẫn nhiều nhất với người mới học Verilog. `=` và `<=` thực sự có nghĩa gì bên trong khối `always`, và quy tắc giúp tránh hầu hết race condition.
Luồng điều khiển
- If-ElseCách `if`/`else` hoạt động bên trong khối `always`, cái bẫy latch mà người mới hay mắc, và phần cứng mã hóa ưu tiên mà chuỗi `else if` tạo ra.
- Câu lệnh caseCách `case` giúp giải mã nhiều nhánh gọn gàng, nhánh `default` không bao giờ nên bỏ qua, và khác biệt giữa `case`, `casex` và `casez`.
- Vòng lặp forVòng lặp `for` trong Verilog khác vòng lặp trong phần mềm ra sao: công cụ tổng hợp trải phẳng nó thành phần cứng song song, chứ không chạy lặp từng bước lúc thực thi.
Logic tuần tự và FSM
- Logic theo clockCách dựng thanh ghi, bộ đếm, thanh ghi dịch và pipeline từ các khối `always` theo clock, mẫu thiết kế chủ lực của mọi thiết kế số đồng bộ.
- Máy trạng thái hữu hạnCách viết FSM trong Verilog như dân chuyên nghiệp: một thanh ghi trạng thái theo clock, một khối tổ hợp tính trạng thái kế tiếp, và sự tách bạch rõ ràng, dễ đọc, dễ tổng hợp.
Testbench và mô phỏng
- Testbench cơ bảnCách viết testbench Verilog: tạo xung clock, chuỗi reset, tín hiệu kích thích, quan sát kết quả, và bộ khung chuẩn điều khiển mọi lần mô phỏng của bạn.
- Display và monitorCách `$display`, `$write` và `$monitor` hoạt động: các định dạng bạn sẽ dùng, khác biệt giữa chúng và khi nào nên dùng từng lệnh.
- Dumpfile và VCDCách thêm dạng sóng VCD vào testbench: `$dumpfile`, `$dumpvars`, chọn phạm vi ghi, và cách xem tệp kết quả trong GTKWave hoặc trình soạn thảo trên trình duyệt.
- Timescale và độ trễCách chỉ thị `` `timescale `` đặt đơn vị cho `#delay`, quy tắc kết hợp các đơn vị khác nhau giữa các tệp, và cách độ trễ tương tác với logic theo xung clock.