Thiết kế VLSI - Giới thiệu Verilog

Verilog là một NGÔN NGỮ MÔ TẢ PHẦN CỨNG (HDL). Nó là một ngôn ngữ được sử dụng để mô tả một hệ thống kỹ thuật số như một bộ chuyển mạch mạng hoặc một bộ vi xử lý hoặc một bộ nhớ hoặc một flip-flop. Có nghĩa là, bằng cách sử dụng HDL, chúng ta có thể mô tả bất kỳ phần cứng kỹ thuật số nào ở bất kỳ cấp độ nào. Các thiết kế, được mô tả trong HDL độc lập với công nghệ, rất dễ thiết kế và gỡ lỗi, và thường hữu ích hơn so với sơ đồ, đặc biệt là đối với các mạch lớn.

Verilog hỗ trợ một thiết kế ở nhiều cấp độ trừu tượng. Ba chính là -

  • Mức độ hành vi
  • Đăng ký-chuyển cấp
  • Cấp cổng

Mức độ hành vi

Mức này mô tả một hệ thống bằng các thuật toán đồng thời (Behavioral). Mọi thuật toán đều tuần tự, có nghĩa là nó bao gồm một tập hợp các lệnh được thực hiện từng cái một. Chức năng, nhiệm vụ và khối là các yếu tố chính. Không liên quan đến hiện thực hóa cấu trúc của thiết kế.

Đăng ký − Cấp chuyển

Các thiết kế sử dụng thanh ghi − Mức truyền xác định các đặc tính của mạch sử dụng các hoạt động và việc truyền dữ liệu giữa các thanh ghi. Định nghĩa hiện đại về mã RTL là "Bất kỳ mã nào có thể tổng hợp được gọi là mã RTL".

Mức cổng

Trong cấp độ logic, các đặc tính của hệ thống được mô tả bằng các liên kết logic và các thuộc tính thời gian của chúng. Tất cả các tín hiệu đều là tín hiệu rời rạc. Chúng chỉ có thể có các giá trị logic xác định (`` 0 ', `1',` X ', `Z`). Các hoạt động có thể sử dụng là các nguyên thủy logic được xác định trước (các cổng cơ bản). Mô hình hóa mức cổng có thể không phải là một ý tưởng đúng đắn cho thiết kế logic. Mã cấp cổng được tạo bằng các công cụ như công cụ tổng hợp và danh sách mạng của anh ấy được sử dụng để mô phỏng cấp cổng và cho phần phụ trợ.

Lexical Tokens

Các tệp văn bản nguồn ngôn ngữ Verilog là một dòng mã thông báo từ vựng. Mã thông báo bao gồm một hoặc nhiều ký tự và mỗi ký tự đơn lẻ nằm trong chính xác một mã thông báo.

Các mã thông báo từ vựng cơ bản được Verilog HDL sử dụng tương tự như các mã trong Ngôn ngữ lập trình C. Verilog phân biệt chữ hoa chữ thường. Tất cả các từ khóa đều ở dạng chữ thường.

Khoảng trắng

Khoảng trắng có thể chứa các ký tự cho khoảng trắng, tab, dòng mới và nguồn cấp dữ liệu biểu mẫu. Các ký tự này bị bỏ qua ngoại trừ khi chúng dùng để phân tách các mã thông báo.

Các ký tự khoảng trắng là Khoảng trống, Tab, Trả hàng, Dòng mới và Nguồn cấp dữ liệu biểu mẫu.

Bình luận

Có hai hình thức để đại diện cho các nhận xét

  • 1) Nhận xét dòng đơn bắt đầu bằng mã thông báo // và kết thúc bằng ký tự xuống dòng.

Ví dụ: // đây là cú pháp dòng đơn

  • 2) Nhận xét nhiều dòng bắt đầu bằng mã thông báo / * và kết thúc bằng mã thông báo * /

Ví dụ: / * đây là Cú pháp đa dòng * /

Số

Bạn có thể chỉ định một số ở định dạng nhị phân, bát phân, thập phân hoặc thập lục phân. Số âm được thể hiện bằng số khen ngợi của 2. Verilog cho phép số nguyên, số thực và số có dấu & không dấu.

Cú pháp được đưa ra bởi - <size> <radix> <value>

Kích thước hoặc số không có kích thước có thể được xác định trong <Kích thước> và <radix> xác định xem nó là nhị phân, bát phân, thập lục phân hay thập phân.

Định danh

Định danh là tên được sử dụng để xác định đối tượng, chẳng hạn như một chức năng, mô-đun hoặc thanh ghi. Số nhận dạng phải bắt đầu bằng ký tự chữ cái hoặc ký tự gạch dưới. Ví dụ. A_Z, a_z, _

Số nhận dạng là sự kết hợp của các ký tự chữ cái, số, dấu gạch dưới và $. Chúng có thể dài tới 1024 ký tự.

Người điều hành

Toán tử là các ký tự đặc biệt được sử dụng để đặt điều kiện hoặc vận hành các biến. Có một, hai và đôi khi ba ký tự được sử dụng để thực hiện các hoạt động trên các biến.

Ví dụ. >, +, ~, &! =.

Từ khóa Verilog

Các từ có ý nghĩa đặc biệt trong Verilog được gọi là từ khóa Verilog. Ví dụ: gán, trường hợp, trong khi, dây, reg và, hoặc, nand và mô-đun. Chúng không nên được sử dụng làm định danh. Các từ khóa Verilog cũng bao gồm các chỉ thị trình biên dịch, các nhiệm vụ và chức năng của hệ thống.

Mô hình hóa mức cổng

Verilog có các cấu trúc nguyên thủy tích hợp sẵn như cổng logic, cổng truyền dẫn và công tắc. Chúng hiếm khi được sử dụng cho công việc thiết kế nhưng chúng được sử dụng trong thế giới tổng hợp hậu để mô hình hóa các tế bào ASIC / FPGA.

Mô hình hóa mức cổng thể hiện hai thuộc tính:

Drive strength- Độ bền của các cổng ra được xác định bởi độ bền của ổ đĩa. Đầu ra mạnh nhất nếu có kết nối trực tiếp với nguồn. Cường độ giảm nếu kết nối qua bóng bán dẫn dẫn điện và ít nhất khi kết nối qua điện trở kéo lên / xuống. Cường độ ổ đĩa thường không được chỉ định, trong trường hợp này cường độ được mặc định là strong1 và strong0.

Delays- Nếu sự chậm trễ không được chỉ định, thì các cổng không có độ trễ lan truyền; nếu hai độ trễ được chỉ định, thì cái đầu tiên đại diện cho độ trễ tăng và cái thứ hai, độ trễ giảm; nếu chỉ có một độ trễ được chỉ định, thì cả hai, tăng và giảm đều bằng nhau. Sự chậm trễ có thể được bỏ qua trong quá trình tổng hợp.

Cổng nguyên thủy

Các cổng logic cơ bản sử dụng một đầu ra và nhiều đầu vào được sử dụng trong Verilog. GATE sử dụng một trong các từ khóa - and, nand, or, nor, xor, xnor để sử dụng trong Verilog cho N số đầu vào và 1 đầu ra.

Example:  
   Module gate() 
   Wire ot0; 
   Wire ot1; 
   Wire ot2; 
   
   Reg in0,in1,in2,in3; 
   Not U1(ot0,in0); 
   Xor U2(ot1,in1,in2,in3); 
   And U3(ot2, in2,in3,in0)

Cổng truyền dẫn ban đầu

Cổng truyền động nguyên thủy bao gồm cả hai, bộ đệm và bộ biến tần. Chúng có đầu vào duy nhất và một hoặc nhiều đầu ra. Trong cú pháp khởi tạo cổng được hiển thị bên dưới, GATE là viết tắt của từ khóa buf hoặc cổng NOT.

Ví dụ: Not, buf, bufif0, bufif1, notif0, notif1

Biến tần không - n outout

Bộ đệm đầu ra Buf - n

Bufifo - bộ đệm tristate, kích hoạt hoạt động ở mức thấp

Bufif1 - bộ đệm tristate, kích hoạt cao hoạt động

Notifo - biến tần tristate, kích hoạt ở mức thấp

Notif1 - biến tần tristate, kích hoạt cao hoạt động

Example:  
   Module gate() 
   Wire out0; 
   Wire out1; 
   
   Reg in0,in1;
   Not U1(out0,in0); 
   Buf U2(out0,in0);

Loại dữ liệu

Bộ giá trị

Verilog chủ yếu bao gồm bốn giá trị cơ bản. Tất cả các kiểu dữ liệu Verilog, được sử dụng trong Verilog đều lưu trữ các giá trị này -

0 (logic 0 hoặc điều kiện sai)

1 (logic một, hoặc điều kiện đúng)

x (giá trị logic không xác định)

z (trạng thái trở kháng cao)

việc sử dụng x và z rất hạn chế để tổng hợp.

Dây điện

Một dây được sử dụng để biểu thị một dây vật lý trong một mạch và nó được sử dụng để kết nối các cổng hoặc mô-đun. Giá trị của một dây chỉ có thể được đọc và không được gán trong một hàm hoặc khối. Một dây không thể lưu trữ giá trị nhưng luôn được điều khiển bởi câu lệnh gán liên tục hoặc bằng cách kết nối dây với đầu ra của cổng / mô-đun. Các loại dây cụ thể khác là -

Wand (wired-AND) - ở đây giá trị của Wand phụ thuộc vào AND logic của tất cả các trình điều khiển thiết bị được kết nối với nó.

Wor (wired-OR) - ở đây giá trị của Wor phụ thuộc vào OR logic của tất cả các trình điều khiển thiết bị được kết nối với nó.

Tri (three-state) - ở đây tất cả các trình điều khiển được kết nối với tri phải là z, ngoại trừ chỉ một (xác định giá trị của tri).

Example: 
   Wire [msb:lsb] wire_variable_list; 
   Wirec // simple wire 
   Wand d; 
   
   Assign d = a; // value of d is the logical AND of 
   Assign d = b; // a and b 
   Wire [9:0] A; // a cable (vector) of 10 wires. 
   
   Wand [msb:lsb] wand_variable_list; 
   Wor [msb:lsb] wor_variable_list; 
   Tri [msb:lsb] tri_variable_list;

Đăng ký

Một reg (register) là một đối tượng dữ liệu, đang giữ giá trị từ lần gán thủ tục này sang lần gán thủ tục tiếp theo và chỉ được sử dụng trong các hàm và khối thủ tục khác nhau. Reg là một Verilog đơn giản, thanh ghi kiểu biến và không thể ngụ ý một thanh ghi vật lý. Trong thanh ghi nhiều bit, dữ liệu được lưu trữ dưới dạng số không dấu và phần mở rộng dấu không được sử dụng.

Ví dụ -

reg c; // biến thanh ghi 1 bit duy nhất

reg [5: 0] đá quý; // véc tơ 6 bit;

reg [6: 0] d, e; // hai biến 7 bit

Đầu vào, Đầu ra, Inout

Các từ khóa này được sử dụng để khai báo các cổng đầu vào, đầu ra và hai chiều của một tác vụ hoặc mô-đun. Ở đây các cổng đầu vào và cổng kết nối, thuộc loại dây và cổng đầu ra được cấu hình thành loại dây, reg, đũa, lo hoặc tri. Luôn luôn, mặc định là loại dây.

Example

Module sample(a, c, b, d);  
Input c;   // An input where wire is used. 

Output a, b;  // Two outputs where wire is used. 
Output [2:0] d;  /* A three-bit output. One must declare type in a separate statement. */ 
reg [1:0] a;  // The above ‘a’ port is for declaration in reg.

Số nguyên

Số nguyên được sử dụng trong các biến mục đích chung. Chúng được sử dụng chủ yếu trong các chỉ báo vòng lặp, hằng số và tham số. Chúng thuộc kiểu dữ liệu kiểu 'reg'. Chúng lưu trữ dữ liệu dưới dạng số có dấu trong khi các kiểu reg được khai báo rõ ràng lưu trữ chúng dưới dạng dữ liệu không dấu. Nếu số nguyên không được xác định tại thời điểm biên dịch, thì kích thước mặc định sẽ là 32 bit.

Nếu một số nguyên giữ một hằng số, bộ tổng hợp sẽ điều chỉnh chúng theo chiều rộng tối thiểu cần thiết tại thời điểm biên dịch.

Example

Integer c;   // single 32-bit integer 
Assign a = 63;  // 63 defaults to a 7-bit variable.

Cung 0, Cung 1

Supply0 xác định các dây gắn với logic 0 (đất) và cung cấp1 xác định các dây gắn với logic 1 (nguồn).

Example

supply0 logic_0_wires; 
supply0 gnd1;  // equivalent to a wire assigned as 0 

supply1 logic_1_wires; 
supply1 c, s;

Thời gian

Thời gian là một đại lượng 64 bit có thể được sử dụng cùng với nhiệm vụ hệ thống $ time để giữ thời gian mô phỏng. Thời gian không được hỗ trợ để tổng hợp và do đó chỉ được sử dụng cho mục đích mô phỏng.

Example

time time_variable_list; 
time c; 
c = $time;   //c = current simulation time

Tham số

Một tham số đang xác định một hằng số có thể được đặt khi bạn sử dụng một mô-đun, cho phép tùy chỉnh mô-đun trong quá trình khởi tạo.

Example 
Parameter add = 3’b010, sub = 2’b11; 
Parameter n = 3; 
Parameter [2:0] param2 = 3’b110; 

reg [n-1:0] jam; /* A 3-bit register with length of n or above. */ 
always @(z) 
y = {{(add - sub){z}};  

if (z)
begin 
   state = param2[1];
else
   state = param2[2]; 
end

Người điều hành

Toán tử số học

Các toán tử này đang thực hiện các phép toán số học. + Và −are được sử dụng dưới dạng toán tử đơn phân (x) hoặc nhị phân (z − y).

Các toán tử được bao gồm trong phép toán số học là:

+ (cộng), - (trừ), * (nhân), / (chia),% (môđun)

Example -

parameter v = 5;
reg[3:0] b, d, h, i, count; 
h = b + d; 
i = d - v; 
cnt = (cnt +1)%16; //Can count 0 thru 15.

Toán tử quan hệ

Các toán tử này so sánh hai toán hạng và trả về kết quả theo một bit, 1 hoặc 0.

Các biến wire và reg đều dương. Do đó (−3'd001) = = 3'd111 và (−3b001)> 3b110.

Các toán tử được bao gồm trong hoạt động quan hệ là:

  • == (bằng)
  • ! = (không bằng)
  • > (lớn hơn)
  • > = (lớn hơn hoặc bằng)
  • <(nhỏ hơn)
  • <= (nhỏ hơn hoặc bằng)

Example

if (z = = y) c = 1; 
   else c = 0; // Compare in 2’s compliment; d>b 
reg [3:0] d,b; 

if (d[3]= = b[3]) d[2:0] > b[2:0]; 
   else b[3]; 
Equivalent Statement 
e = (z == y);

Các nhà điều hành khôn ngoan

Các toán tử khôn ngoan đang thực hiện so sánh từng bit giữa hai toán hạng.

Các toán tử được bao gồm trong hoạt động khôn ngoan của Bit là:

  • & (bitwise AND)
  • | (bitwiseOR)
  • ~ (bitwise KHÔNG)
  • ^ (bitwise XOR)
  • ~ ^ hoặc ^ ~ (bitwise XNOR)

Example

module and2 (d, b, c); 
input [1:0] d, b; 
output [1:0] c; 
assign c = d & b; 
end module

Toán tử logic

Các toán tử logic là các toán tử khôn ngoan và chỉ được sử dụng cho các toán hạng bit đơn. Chúng trả về một giá trị bit duy nhất, 0 hoặc 1. Chúng có thể hoạt động trên số nguyên hoặc nhóm bit, biểu thức và coi tất cả các giá trị khác 0 là 1. Các toán tử logic nói chung, được sử dụng trong các câu lệnh điều kiện vì chúng hoạt động với các biểu thức.

Các toán tử được bao gồm trong phép toán lôgic là:

  • ! (logic KHÔNG)
  • && (logic AND)
  • || (logic HOẶC)

Example

wire[7:0] a, b, c; // a, b and c are multibit variables. 
reg x; 

if ((a == b) && (c)) x = 1; //x = 1 if a equals b, and c is nonzero. 
   else x = !a; // x =0 if a is anything but zero.

Nhà điều hành Giảm

Các toán tử giảm là dạng đơn nguyên của các toán tử bit và hoạt động trên tất cả các bit của một vectơ toán hạng. Chúng cũng trả về một giá trị bit đơn.

Các toán tử được bao gồm trong hoạt động Giảm là -

  • & (giảm AND)
  • | (giảm HOẶC)
  • ~ & (giảm NAND)
  • ~ | (giảm NOR)
  • ^ (giảm XOR)
  • ~ ^ hoặc ^ ~ (giảm XNOR)

Example

Module chk_zero (x, z); 

Input [2:0] x; 
Output z; 
Assign z = & x; // Reduction AND 
End module

Người điều hành ca

Toán tử Shift, đang dịch toán hạng đầu tiên theo số bit được chỉ định bởi toán hạng thứ hai trong cú pháp. Các vị trí trống được điền các số không cho cả hai chiều, dịch chuyển trái và phải (Không có phần mở rộng biển báo sử dụng).

Các toán tử được bao gồm trong hoạt động Shift là:

  • << (dịch sang trái)
  • >> (sang phải)

Example

Assign z = c << 3; /* z = c shifted left 3 bits;

Các vị trí trống được điền bằng 0 * /

Điều hành nối

Toán tử nối kết hợp hai hoặc nhiều toán hạng để tạo thành một vectơ lớn hơn.

Toán tử được bao gồm trong phép toán Nối là - {} (nối)

Example

wire [1:0] a, h; wire [2:0] x; wire [3;0] y, Z; 
assign x = {1’b0, a}; // x[2] = 0, x[1] = a[1], x[0] = a[0] 
assign b = {a, h}; /* b[3] = a[1], b[2] = a[0], b[1] = h[1], 
b[0] = h[0] */ 
assign {cout, b} = x + Z; // Concatenation of a result

Nhà điều hành nhân rộng

Toán tử sao chép đang tạo nhiều bản sao của một mục.

Toán tử được sử dụng trong hoạt động sao chép là - {n {item}} (sao chép lần thứ n của một mục)

Example

Wire [1:0] a, f; wire [4:0] x; 
Assign x = {2{1’f0}, a}; // Equivalent to x = {0,0,a } 
Assign y = {2{a}, 3{f}}; //Equivalent to y = {a,a,f,f} 
For synthesis, Synopsis did not like a zero replication.

For example:- 
Parameter l = 5, k = 5; 
Assign x = {(l-k){a}}

Điều hành có điều kiện

Toán tử có điều kiện tổng hợp thành một bộ ghép kênh. Nó là loại tương tự như được sử dụng trong C / C ++ và đánh giá một trong hai biểu thức dựa trên điều kiện.

Toán tử được sử dụng trong hoạt động có điều kiện là -

(Tình trạng) ? (Kết quả nếu điều kiện đúng) -

(kết quả nếu điều kiện sai)

Example

Assign x = (g) ? a : b; 
Assign x = (inc = = 2) ? x+1 : x-1; 
/* if (inc), x = x+1, else x = x-1 */

Toán hạng

Chữ viết

Literal là các toán hạng có giá trị không đổi được sử dụng trong biểu thức Verilog. Hai ký tự Verilog thường được sử dụng là:

  • String - Toán hạng theo chuỗi là một mảng một chiều các ký tự, được đặt trong dấu ngoặc kép ("").

  • Numeric - Một toán hạng số không đổi được chỉ định ở dạng Số nhị phân, bát phân, thập phân hoặc thập lục phân.

Example

n - số nguyên đại diện cho số bit

F - một trong bốn định dạng cơ sở có thể có -

b đối với hệ nhị phân, o đối với bát phân, d đối với thập phân, h đối với thập lục phân.

“time is”  // string literal 
267        // 32-bit decimal number 
2’b01      // 2-bit binary 
20’hB36F   // 20-bit hexadecimal number 
‘062       // 32-bit octal number

Dây, Regs và Tham số

Wires, regs và tham số là các kiểu dữ liệu được sử dụng làm toán hạng trong biểu thức Verilog.

Lựa chọn bit “x [2]” và Lựa chọn từng phần “x [4: 2]”

Lựa chọn bit và chọn từng phần được sử dụng để chọn một bit và nhiều bit tương ứng từ một vectơ dây, reg hoặc tham số với việc sử dụng dấu ngoặc vuông “[]”. Các phép chọn bit và chọn một phần cũng được sử dụng như các toán hạng trong biểu thức giống như cách mà các đối tượng dữ liệu chính của chúng được sử dụng.

Example

reg [7:0] x, y; 
reg [3:0] z; 
reg a; 
a = x[7] & y[7];      // bit-selects 
z = x[7:4] + y[3:0];  // part-selects

Gọi hàm

Trong các lệnh gọi Hàm, giá trị trả về của một hàm được sử dụng trực tiếp trong một biểu thức mà không cần gán nó vào một thanh ghi hoặc dây. Nó chỉ đặt lệnh gọi hàm như một trong những kiểu toán hạng. Nó cần thiết để đảm bảo rằng bạn biết độ rộng bit của giá trị trả về của lệnh gọi hàm.

Example  
Assign x = y & z & chk_yz(z, y); // chk_yz is a function 

. . ./* Definition of the function */ 
Function chk_yz; // function definition 
Input z,y; 
chk_yz = y^z; 
End function

Mô-đun

Khai báo mô-đun

Trong Verilog, một mô-đun là thực thể thiết kế chính. Điều này cho biết tên và danh sách cổng (đối số). Một vài dòng tiếp theo chỉ định kiểu đầu vào / đầu ra (đầu vào, đầu ra hoặc inout) và chiều rộng của mỗi cổng. Chiều rộng cổng mặc định chỉ là 1 bit. Các biến cổng phải được khai báo bằng wire, wand,. . ., đăng ký. Biến cổng mặc định là wire. Thông thường, đầu vào là dây vì dữ liệu của chúng được chốt bên ngoài mô-đun. Đầu ra thuộc loại reg nếu tín hiệu của chúng được lưu trữ bên trong.

Example

module sub_add(add, in1, in2, out); 
input add; // defaults to wire 
input [7:0] in1, in2; wire in1, in2; 

output [7:0] out; reg out; 
... statements ... 
End module

Phân công liên tục

Phép gán liên tục trong một Mô-đun được sử dụng để gán giá trị cho một dây, đây là phép gán bình thường được sử dụng ở bên ngoài khối luôn hoặc khối ban đầu. Việc gán này được thực hiện với một câu lệnh gán rõ ràng hoặc gán một giá trị cho một dây trong khi khai báo nó. Phép gán liên tục được thực hiện liên tục tại thời điểm mô phỏng. Thứ tự của các câu lệnh gán không ảnh hưởng đến nó. Nếu bạn thực hiện bất kỳ thay đổi nào trong bất kỳ tín hiệu đầu vào bên phải nào, tín hiệu đó sẽ thay đổi tín hiệu đầu ra bên trái.

Example

Wire [1:0] x = 2’y01;   // assigned on declaration 
Assign y = c | d;       // using assign statement 
Assign d = a & b; 
/* the order of the assign statements does not matter. */

Thuyết minh mô-đun

Khai báo mô-đun là các mẫu để tạo các đối tượng thực tế. Các mô-đun được khởi tạo bên trong các mô-đun khác và mỗi phần khởi tạo đang tạo một đối tượng duy nhất từ ​​mẫu đó. Ngoại lệ là mô-đun cấp cao nhất là phần khởi tạo riêng của nó. Các cổng của mô-đun phải phù hợp với những cổng được xác định trong mẫu. Nó được chỉ định -

  • By name, sử dụng dấu chấm “tên cổng .template (tên dây kết nối với cổng)”. Hoặc là

  • By position, đặt các cổng vào cùng một vị trí trong danh sách cổng của cả mẫu và phiên bản.

Example

MODULE DEFINITION 
Module and4 (x, y, z); 
Input [3:0] x, y; 
Output [3:0] z; 
Assign z = x | y; 
End module