You are on page 1of 15

SYSTEM VERILOG TUTORIAL

I. Giới thiệu
- Ngôn ngữ mô tả phần cứng (HDL) giống như verilog hay VHDL được sử dụng để
mô tả hành vi của phần cứng để nó có thể chuyển đổi thành các khối kỹ thuật số được
tạo thành từ các cổng tổ hợp hay phần tử tuần tự. Để xác minh rằng mô tả phần cứng
trong HDL là chính xác, cần có một ngôn ngữ có nhiều tính năng hơn trong OOP
(Object Oriented Programming) sẽ hỗ trợ các quy trình kiểm tra phức tạp thường gọi
là ngôn ngữ xác minh phần cứng.
- Vấn đề verilog không được sử dụng rộng rãi: verilog là ngôn ngữ chính để xác minh
chức năng của các thiết kế nhỏ, không quá phức tạp và có ít tính năng hơn. Khi độ
phức tạp của thiết kế tăng lên, thì yêu cầu về các công cụ tốt hơn để thiết kế và xác
minh nó cũng tăng theo. System verilog vượt trội hơn nhiều so với verilog vì khả
năng thực hiện các kích thích ngẫu nhiên bị hạn chế, sử dụng các tính năng OOP
trong xây dựng testbench, phạm vi chức năng, xác nhận trong số nhiều tính năng
khác.
- Xác minh (verification): là quá trình đảm bảo rằng một thiết kế hoạt động như mong
đợi. Thiết kế chip là một quá trình rất rộng rãi, tốn nhiều thời gian và tiền bạc để chế
tạo. Các lỗi chức năng trong thiết kế nếu được phát hiện ở giai đoạn sớm hơn trong
quá trình thiết kế sẽ giúp tiết kiệm chi phí hơn. Nếu một lỗi được tìm thấy sau đó
trong quy trình thiết kế, thì tất các các bước thiết kế phải thực hiện lại một lần nữa.
- System verilog có thể coi là một phần mở rộng của verilog. System verilog hỗ trợ
OOP giúp xác minh các thiết kế ở mức độ trừu trượng cao hơn.
- Sử dụng system verilog trong xác minh (verification): một thiết kế phần cứng hầu hết
bao gồm một số tệp verilog (.v or .sv) với một module trên cùng, trong đó tất cả các
module phụ khác được khởi tạo để đạt được hành vi và chức năng mong muốn. Cần
có một môi trường gọi là testbench để xác minh một thiết kế verilog nhất định và
ngày nay thường được viết bằng system verilog. Ý tưởng là điều khiển thiết kế bằng
các tác nhân kích thích khác nhau để quan sát kết quả đầu ra và so sánh với các giá trị
dự kiến để xem liệu thiết kế có hoạt động theo cách nó nên làm hay không. Để thực
hiện điều này, module thiết kế cấp cao nhất được khởi tạo trong môi trường testbench
và các cổng đầu vào/đầu ra của thiết kế được kết nối với các tín hiệu thành phần
testbench thích hợp. Đầu vào của thiết kế được định hướng với các giá trị nhất định
mà chúng ta biết thiết kế sẽ hoạt động như nào. Các kết quả đầu ra được phân tích và
so sánh với các giá trị dự kiến để xem hành vi thiết kế có đúng hay không.
Ví dụ về thiết kế đơn giản của Delay-flip flop: Ngõ ra Q được chốt vào giá trị trong
chân ngõ vào D ở mọi cạnh xung nhịp dương (sườn lên).

Xây dựng môi trường testbench và thiết lập một số giá trị cho ngõ vào. Quan sát và
phân tích kết quả ngõ ra để xem hành vi của thiết kế.
Tb_top đại diện cho một testbench đơn giản, trong đó bạn đã tạo ra một đối tượng
của thiết kế d_ff0 và kết nối các cổng của nó với các tín hiệu trong testbench. Sau đó
chúng ta chỉ cần gán hoặc điều khiển tín hiệu trong testbench và chúng sẽ được
chuyển đổi sang thiết kế.
II. Testbench
1. Mục đích

Testbench cho phép chúng ta xác minh chức năng của một thiết kế thông qua mô phỏng.
Nó là một thùng chứa nơi thiết kế được đặt và điều khiển với các tác nhân kích thích đầu
vào khác nhau.

- Tạo ra các kích thích đầu vào khác nhau.


- Thúc đẩy đầu vào thiết kế với kích thích được tạo.
- Cho phép thiết kế xử lý đầu vào và cung cấp đầu ra.
- Kiểm tra đầu ra với hành vi dự kiến để tìm lỗi chức năng.
- Nếu phát hiện lỗi chức năng thì thay đổi thiết kế để sửa chữa.
- Thực hiện các bước trên cho đến khi không còn lỗi chức năng nào nưa.
2. Các thành phần của một testbench

Component Description
Tạo ra các kích thích đầu vào khác nhau
Generator
và được chuyển đến DUT
Thúc đẩy sự kích thích được tạo ra cho
Driver
thiết kế
Chứa các tín hiệu thiết kế có thể được
Interface
điều khiển hoặc giám sát
Giám sát các cổng đầu vào/đầu ra của
Monitor
thiết kế để nắm bắt hoạt động của thiết kế
Kiểm tra đầu vào từ thiết kiết với hành vi
Scoreboard
dự kiến
Chứa tất cả các thành phần xác minh
Environment
được đề cập ở trên
Chứa môi trường có thể được điều chỉnh
Test
với các cài đặt cấu hình khác nhau
3. DUT (Design Under Test)

DUT là thiết kế phần cứng được viết bằng system verilog. DUT là một thuật ngữ thường
được sử dụng để xác nhận sau khi chip được chế tạo.

4. Interface

Nếu thiết kế chứa hằng trăm tín hiệu cổng thì việc kết nối, duy trì và sử dụng lại các tín
hiệu đó sẽ trở nên cồng kềnh. Thay vào đó, chúng ta đặt tất cả các cổng đầu vào/đầu ra
được thiết kế vào một thùng chứa sẽ trở thành Interface cho DUT. Sau đó, thiết kế có thể
định hướng với các giá trị thông qua giao diện này.

5. Driver

Driver là thành phần xác minh (verification) thực hiện các thao tác vặn chốt của DUT
thông qua một tác vụ được xác định trong giao diện. Khi trình điều khiển phải điều khiển
một số giá trị đầu vào cho thiết kế, nó chỉ cần gọi các giá trị này được xác định trước
task trong giao diện mà không thực sự biết mối quan hệ thời gian giữa các tín hiệu này.
Thông tin thời gian được xác định trong task giao diện được cung cấp. Đây là mức độ
trừu tượng cần thiết để làm cho testbench linh hoạt hơn và có thể mở rộng.

6. Generator

Generator là một thành phần xác minh (verification) có thể tạo ra các giao dịch dữ liệu
hợp lệ và gửi chúng đến driver. Sau đó, Driver có thể chỉ cần điều khiển dữ liệu cho
generator cung cấp cho nó thông qua Interface. Các giao dịch dữ liệu được triển khai
dưới dạng các đối tượng lớp (màu xanh lam). Công việc của driver là lấy đối tượng dữ
liệu và dịch nó thành thứ gì đó và DUT có thể hiểu được.

7. Monitor

DUT xử lý dữ liệu đầu vào và gửi kết quả đến các chân đầu ra. Monitor chọn dữ liệu đã
xử lý và chuyển đổi nó thành một đối tượng dữ liệu và gửi nó Scoreboard.

8. Scoreboard.

Scoreboard là một mô hình tham chiếu, hoạt động giống như DUT. Mô hình này phản
ánh hành vi dự kiến của DUT. Đầu vào của DUT cũng được gửi đến mô hình tham chiếu
này. Vì vậy, nếu DUT có vấn đề chức năng, thì đầu ra từ DUT sẽ không khớp với đầu ra
từ mô hình tham chiếu. Vì vậy, việc so sánh kết quả đầu ra từ thiết kế và mô hình tham
chiếu sẽ cho chúng tôi biết liệu có khiếm khuyết về chức năng trong thiết kế hay không.

9. Environment

Environment giúp cho việc xác minh (verification) trở nên linh hoạt và có thể mở rộng
hơn vì có thể cắm nhiều thành phần hơn vào cùng một môi trường cho một dự án.

10. Test

Test sẽ khởi tạo một đối tượng của môi trường và định cấu hình nó theo cách thử nghiệm
muốn.

Tín hiệu riêng lẻ

Tín hiệu được đặt trong một tác vụ (task) và thành phần này có thể được sử dụng lại và
ẩn chi tiết về tín hiệu nào và trong khoảng thời gian nào.

III. Kiểu dữ liệu


1. Giới thiệu
System Verilog là một phần mở rộng của Verilog cũng được sử dụng như một HDL.
Verilog có kiểu dữ liệu reg và wire để mô tả hành vi của phần cứng. Vì việc xác minh
phần cứng có thể trở nên phức tạp và đòi hỏi khắc khe hơn, nên các kiểu dữ liệu trong
Verilog không đủ để phát triển các trường hợp thử nghiệm hiệu quả. Do đó, System
Verilog đã mở rộng Verilog bằng các thêm nhiều kiểu dữ liệu giống C hơn để đóng gói
tốt và nhỏ họn hơn.

Các lệnh Comment:

Có 2 lệnh comment chủ yếu:

+ //<write> : Comment trên 1 dòng

+ /*<write>*/ : Comment trên nhiều dòng hoặc 1 dòng.

Các giá trị biến System Verilog có thể giữ:

0 Logic state 0 – variable/net is at 0 volts


1 Logic state 1 – variable/net is at some value > 0.7 volts
X or x Logic state X – variable/net has either 0/1 – we just don’t know
Z or z Logic state Z – net has high impedence – maybe the wire is not connected
and is floating
Dấu phẩy động (floating point) và số mũ (exponential):

String trong System Verilog:

Structure trong System Verilog:

Structure đại diện cho một tập hợp các kiểu dữ liệu được lưu trữ cùng nhau và được
tham chiếu thông qua biến cấu trúc.
Fixed size array trong System Verilog:

Mảng là một biến dùng để lưu trữ các giá trị khác nhau ở các vị trí liền kề nhau.
Kiểu dữ liệu void:

Kiểu dữ liệu void đại diện cho dữ liệu không tồn tại và có thể được chỉ định làm kiểu dữ
liệu trả về cho functions hoặc task để biểu thị không có giá trị trả về.

Chuyển đổi kiểu dữ liệu real sang int.

2. Kiểu dữ liệu mới: Logic và bit


a) Kiểu dữ liệu 4 trạng thái. (X, Z, 0, 1)
- Reg chỉ có thể được điều khiển trong các khối thủ tục như always và initial trong khi
wire chỉ có thể được điều khiển trong các câu lệnh assign. Nhưng System Verilog đã
giới thiệu một kiểu dữ liệu 4 trạng thái mới là logic có thể được điều khiển trong các
khối thủ tục (always, initial) hay câu lệnh assign.

b) Kiểu dữ liệu 2 trạng thái

Trong testbench xác minh điền hình, có nhiều trường hợp không cần thực sự 4 giá trị (x,
z, 0, 1). System Verilog bổ sung nhiều loại dữ liệu 2 trạng thái có thể được lưu trữ và có
giá trị 0 hoặc 1. Điều này sẽ hỗ trợ mô nhanh hơn, chiếm ít bộ nhớ hơn. Loại dữ liệu 2
trạng thái quan trọng nhất bit được sử dụng thường xuyên nhất trong testbench. Một biến
loại bit có thể là 0 hoặc 1 đại diện cho 1 bit. Một phạm vi từ MSB đến LSB phải được
cung cấp để làm cho nó đại diện và lưu trữ nhiều bit.
3. Kiểu dữ liệu integer và byte

System verilog có nhiều kiểu dữ liệu 2 trạng thái khác nhau ngoài tất cả các loại dữ liệu
được verilog hỗ trợ. Các loại dữ liệu được sử dụng phổ biến nhất trong testbench là bit,
int và logic, byte.

a) Integer

Integer là số không có phần phân số hay nói cách khác là số nguyên. System verilog có 3
kiểu dữ liệu có dấu để giữ các giá trị số nguyên, mỗi kiểu có kích thước khác nhau. Giá
trị nhỏ nhất là shortint (-32768 đến 32767) và giá trị lớn nhất là longint. Dấu có thể được
xác định bằng các từ khóa signed và unsigned. Ngoài ra, chúng có thể chuyển đổi thành
nhau bằng cách truyền.
+ signed (có dấu): Theo mặc định, các kiểu số nguyên có dấu có thể chứa cả giá trị
âm và dương.

+ unsigned (không dấu): mặc định các biến số nguyên sẽ là số nguyên có dấu. Để
khai báo chúng thành số nguyên không dấu, chúng ta sử dụng từ khóa unsigned.
b) byte

byte là phiên bản của số nguyên có dấu và nó ngắn hơn một số nguyên có kích
thước 8 bit.

4. Kiểu dữ liệu string.

5. Kiểu dữ liệu Enumeration

You might also like