Menu

Verilog là gì? Ngôn ngữ mô tả phần cứng cho người mới

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.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Một ngôn ngữ để mô tả mạch điện

Phần lớn các ngôn ngữ bạn từng gặp, như Python, JavaScript hay Go, mô tả một chuỗi lệnh để CPU thực thi. Verilog mô tả một mạch điện. Bạn ghi ra những dây dẫn nào tồn tại, những thanh ghi nào tồn tại và tín hiệu chạy giữa chúng ra sao. Sau đó trình mô phỏng có thể phát lại hành vi của mạch, và công cụ tổng hợp có thể biên dịch chính văn bản đó thành các cổng logic và flip-flop của một con chip thật.

Đó là định nghĩa trong một câu. Những hệ quả của nó thì cần nhiều thời gian hơn để thấm.

Đoạn code này trông như một chương trình nhỏ: một module, một khối initial, một system task $display. Nhấn "Chạy" và bạn sẽ thấy hello from verilog. Nhưng bên dưới, trình mô phỏng không thực thi một hàm nào cả: nó giả lập thời gian đang trôi và đưa mạch tiến lên từng bước. Đó là lý do bạn sẽ thấy $finish ở khắp nơi: phải có ai đó bảo trình mô phỏng dừng lại.

"Mô tả phần cứng" thực ra nghĩa là gì

Một dòng C chạy khi bộ đếm chương trình chạm đến nó. Một dòng Verilog mô tả một phần mạch điện tồn tại mọi lúc. Xem ví dụ:

assign y = a & b;

Đó không phải là "tính y một lần." Mà là "có một dây y, và ở mọi thời điểm nó bằng a AND b." Thay đổi a hoặc b thì y thay đổi theo ngay lập tức. Nhiều câu lệnh assign trong một module không phải là một trình tự: chúng là các mô tả song song của những phần mạch riêng biệt.

Đây là đặc điểm cốt lõi của Verilog và là nguồn gốc của mọi bug ở người mới. Phần lớn những gì bạn viết mô tả các thứ diễn ra đồng thời, và số ít cấu trúc trông giống câu lệnh có thứ tự (bên trong các khối initial và always) chỉ trông như vậy vì trình mô phỏng giả lập.

Bạn xây gì với Verilog

Bạn sẽ thấy Verilog được dùng ở mọi tầng của hệ thống số:

  • Logic tổ hợp. Bộ cộng, bộ chọn kênh, bộ giải mã, các lát ALU: mọi thứ mà đầu ra chỉ phụ thuộc vào đầu vào hiện tại.
  • Logic tuần tự. Bộ đếm, thanh ghi dịch, máy trạng thái hữu hạn, mọi thứ chạy theo posedge clk.
  • Lõi bộ xử lý. Từ những CPU làm bài tập trong các khóa học đại học đến các lõi RISC-V mã nguồn mở trên chip thật, RTL thường là Verilog hoặc SystemVerilog.
  • Thiết kế FPGA. Logic được nạp vào FPGA của Xilinx hay Intel (mạng, xử lý ảnh, điều khiển nhúng) phần lớn được viết bằng Verilog.
  • ASIC. Những con chip tùy biến bên trong điện thoại, router, ô tô của bạn: phần thiết kế front-end là HDL, và Verilog là một trong hai lựa chọn thống trị.

Bạn không cần bất kỳ phần cứng nào trong số này để học. Mọi thứ trong bộ tài liệu này đều chạy trong một trình mô phỏng trên trình duyệt.

Mô phỏng và tổng hợp

Có hai cách để "chạy" Verilog, và chúng không giống nhau:

  • Mô phỏng (simulation) phát lại hành vi của mạch bằng phần mềm. Trình mô phỏng (Icarus Verilog, Verilator, ModelSim, các công cụ thương mại) đọc các module của bạn cùng một testbench (code điều khiển các đầu vào) và tạo ra đầu ra: log văn bản, dạng sóng, báo cáo đạt hoặc không đạt.
  • Tổng hợp (synthesis) lấy một tập con của Verilog và biên dịch nó thành netlist gồm các cổng logic thật. Công cụ của các hãng (Vivado, Quartus, các công cụ design compiler ở những công ty lớn) đảm nhận việc ánh xạ này. Verilog dùng để tổng hợp phải tuân theo thêm một số quy tắc: khối initial và lệnh gọi $display không tồn tại trên silicon.

Trình soạn thảo trên trình duyệt ở các trang này thực hiện mô phỏng. Bạn chỉ cần có vậy cho đến khi làm ra một con chip thật hoặc lập trình FPGA.

Verilog và SystemVerilog

Nếu tìm hiểu, bạn sẽ gặp cả hai cái tên. SystemVerilog là tập cha: nó giữ mọi cấu trúc của Verilog và bổ sung các tính năng chủ yếu nhắm đến việc kiểm chứng (lớp, kiểm thử ngẫu nhiên có ràng buộc, assertion, interface, hệ thống kiểu phong phú hơn nhiều). Mọi thứ bạn học ở đây đều là SystemVerilog hợp lệ. Trên thực tế hai cái tên thường lẫn vào nhau; phần lớn công cụ chấp nhận cả hai và phần lớn tệp vẫn có đuôi .v. Trong bộ tài liệu này chúng ta sẽ gọi chung là "Verilog".

Verilog và VHDL

Cả hai đều là ngôn ngữ mô tả phần cứng. Cả hai đều là chuẩn IEEE. Cả hai đều xuất hiện từ những năm 1980. Điểm khác nhau:

  • Cú pháp. Verilog bắt nguồn từ C: dấu ngoặc nhọn, từ khóa ngắn gọn, quy tắc kiểu lỏng hơn. VHDL bắt nguồn từ Ada: dài dòng hơn, chặt chẽ hơn nhiều về kiểu.
  • Khu vực. Verilog chiếm ưu thế trong thiết kế thương mại ở Mỹ. VHDL vẫn phổ biến ở châu Âu, trong lĩnh vực quốc phòng và trong các codebase cũ.
  • Khả năng. Chúng gần như tương đương về những gì có thể diễn đạt. Hãy chọn theo thứ nhóm của bạn đang dùng.

Nếu bạn học HDL lần đầu, Verilog dễ tiếp cận hơn: cú pháp nhỏ hơn, dễ dãi hơn, và kho ví dụ trên mạng lớn hơn.

Bộ tài liệu này chạy Verilog như thế nào

Trình soạn thảo bên dưới dùng Icarus Verilog (iverilog). Nó biên dịch mã nguồn của bạn thành một trình mô phỏng và chạy trong sandbox. Không cần giấy phép Vivado, không cần cài Quartus, không cần bo mạch FPGA. Bạn viết một module cùng một testbench nhỏ, nhấn "Chạy", và bạn thấy đầu ra cùng dạng sóng.

Đó là một bộ đếm 4 bit hoàn chỉnh cùng một testbench. Module counter là thiết kế cần kiểm tra (DUT); module test tạo xung clock, nhả reset và in giá trị ở mỗi chu kỳ. Chạy nó và bạn sẽ thấy count đi từ 0 đến 15 rồi quay vòng. Mở tab Waveform và bạn sẽ thấy cùng điều đó dưới dạng các chuyển mức điện áp.

Tiếp theo là gì

Bạn đã có đủ bối cảnh để bắt đầu viết module. Bài tiếp theo, Phần cứng và phần mềm, dành thêm chút thời gian cho sự thay đổi tư duy, vì đó là vấp ngã lớn nhất với người mới học Verilog. Sau đó là cài trình mô phỏng trên máy (không bắt buộc, trình duyệt là đủ), viết module đầu tiên từ đầu, và phần còn lại của ngôn ngữ.

Hãy đi từ từ. Cú pháp thì nhỏ; thay đổi tư duy mới là việc chính.

Câu hỏi thường gặp

Nói đơn giản, Verilog là gì?

Verilog là một ngôn ngữ mô tả phần cứng (HDL) dùng để mô tả mạch số bằng văn bản. Thay vì viết các lệnh cho CPU thực thi, bạn mô tả dây dẫn, thanh ghi, cổng logic và cách tín hiệu chạy giữa chúng. Sau đó trình mô phỏng chạy bản mô tả để bạn kiểm tra hành vi, và công cụ tổng hợp có thể biến chính bản mô tả đó thành bố cục của một con chip thật.

Verilog dùng để làm gì?

Verilog được dùng để thiết kế và kiểm tra phần cứng số: CPU, GPU, bộ chuyển mạch mạng, bộ điều khiển bộ nhớ, khối xử lý tín hiệu, thiết kế FPGA, tức mọi thứ được xây từ cổng logic và flip-flop. Nó cũng chạy thuần mô phỏng để dạy logic số và làm mẫu thử thiết kế trước khi sản xuất bất kỳ con chip nào.

Verilog có phải là ngôn ngữ lập trình không?

Không theo nghĩa thông thường. Code Verilog mô tả cấu trúc và hành vi của phần cứng (tín hiệu, cổng logic và bộ lưu trữ theo xung clock) chứ không phải một chuỗi lệnh cho CPU. Nhiều dòng bạn viết diễn ra đồng thời trên chip, không phải lần lượt từng dòng. Sự thay đổi tư duy đó là rào cản lớn nhất khi chuyển từ phần mềm sang Verilog.

Verilog và SystemVerilog khác nhau thế nào?

SystemVerilog là tập cha của Verilog. Nó giữ toàn bộ cú pháp Verilog và bổ sung các tính năng chủ yếu cho việc kiểm chứng: lớp, tín hiệu kích thích ngẫu nhiên có ràng buộc, assertion, interface và các kiểu dữ liệu phong phú hơn. Công cụ nào chấp nhận SystemVerilog cũng chấp nhận Verilog thuần. Với phần lớn nội dung nhập môn, hai ngôn ngữ trông giống hệt nhau.

Verilog và VHDL khác nhau thế nào?

Verilog và VHDL đều là ngôn ngữ mô tả phần cứng giải quyết cùng một bài toán. Cú pháp Verilog bắt nguồn từ C và ngắn gọn hơn; cú pháp VHDL bắt nguồn từ Ada, dài dòng hơn và chặt chẽ hơn về kiểu. Mức độ sử dụng trong ngành khác nhau tùy khu vực và nhóm: cả hai đều đang được dùng, cả hai đều đã được chuẩn hóa (IEEE 1364/1800 cho Verilog/SystemVerilog, IEEE 1076 cho VHDL).

Verilog có khó học không?

Cú pháp nhỏ, nhỏ hơn C++. Phần khó là bỏ đi thói quen viết phần mềm. Trong Verilog, phần lớn câu lệnh mô tả những thứ xảy ra cùng lúc, không theo trình tự, và chỉ một phép gán blocking đặt sai chỗ thay cho non-blocking cũng có thể quyết định mạch của bạn có chạy được hay không. Tuần đầu tiên có thể khá bối rối trước khi bạn thật sự hiểu ra.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu