1. Module
Mục tiêu:
Nhận dạng các thành phần của định nghĩa module, chẳng hạn như tên module, danh sách port, thơng số, khai báo biến, phát biểu luồng dữ liệu, phát biểu hành vi, thể hiện của module và task hoặc hàm (function).
cách thức định nghĩa danh sách port và khai báo
module and port
module and port
Một định nghĩa module ln bắt đầu bằng từ khố module. Module name,port list,port
declarations và parameter nên đặt trong
định nghĩa module.port list và port
declarations được dùng nếu có 1 số port
tương tác với mơi trường.
Có 5 bộ phận trong module : khai báo biến,phát biểu luồng dữ liệu,sự thể hiên
module lower( con ),hành vi của khối,task và functions
module and port
Từ endmodule luôn luôn ở cuối mỗi sự định nghĩa module. Mọi thành phần (ngoại trừ module, tên module và endmodule) là tùy
chọn, có thể trộn lẫn và tương thích theo nhu cầu thiết kế. Verilog cho phép nhiều module được định nghĩa trong một tập tin duy nhất và không cần thứ tự . Để hiểu rõ về thành phần module đã nêu trên,chúng ta xem xét một ví dụ đơn giản về chốt SR.
module and port
Chốt SR có 2 ngõ vào S và R, 2 ngõ ra là Q và Qbar.
module and port
// ví dụ minh hoạ các thành phần của module // tên module và các port list
// SR_latch module
Module SR_latch( Q,Qbar,Sbar,Rbar ); // khai báo port
output Q,Qbar; input Sbar,Rbar;
// sự thể hiện module thấp hơn và trường hợp này là cổng NAND nand n1( Q, Sbar , Qbar );
nand n2( Q, Rbar, Q ); endmodule
// tên module và port list module Top;
module and port
wire q,qbar; reg set,reset;
// sự thể hiện của module thấp và trong trường hợp này là SR_latch SR_latch m1( q,qbar,-set,~reset );
// hành vi khối,khởi tạo intital
begin
$monitor( $time,”set = %b,reset = %b,q = %b \n “,set, reset,q ); set = 0;reset = 0; #5 reset = 1; #5 reset = 0; #5 reset = 1; end endmodule
module and port
trong chốt SR định nghĩa ở trên, tất cả các thành phần mô tả trên không cần đại diện trong 1 module. Chúng ta khơng cần tìm sự khai báo biến,luồng dữ liệu( assign ), hay là hành vi khối( luôn luôn hoặc khởi tạo ). Nghĩa là trong một module khơng nhất thiết phải có tất cả các phần trên.
tuy nhiên,khối mơ hình của chốt SR chứa đựng module name,wire,reg và sự khai báo biến,sự thể hiện của các khối module thấp,hành vi khối nhưng không bao gồm port lish,sự khai báo port,và data flow-lừơng dữ liệu.
Vì vậy,tất cả các thành phần ngoại trừ tên module và enmodule tuỳ chọn và có thể tương thích theo u cầu nếu cần
PORTS
*Cổng-port cung cấp giao diện bởi 1 module có thể tương thích với mơi trường,và ngược lại là nếu khơng cần tương tác với bên ngồi thì khơng cần port
1.List of Ports
Một sự định nghĩa module chứa đựng 1 danh sách của port tuỳ ý. Nếu module khơng có 1 số sự thay đổi tín hiệu with mơi trường thì sẽ khơng có port.
PORTS
Ta khảo sát một mạch cộng 4-bit được thể hiện bên trong module mức đỉnh Top. Giản đồ các port được cho ở slide kế tiếp. Trong hình này, module Top là module mức đỉnh
PORTS
module Top là 1 top_level module. The
module fulladd4 thể hiện bên trong Top. The module fulladd4 có 3 ngõ vào bật là a,b,c_in và ngõ ra bật là sum và c_out. Vì vậy,module fulladd4 thể hiện sự cộng. module Top là
module mức đỉnh nên trong sự mô phỏng và khơng cần truyền và nhận tín hiệu từ mơi
trường. vì vậy,nó khơng có danh sách các port.
PORTS
Tên của module và danh sách port cho sự
khai báo module trong Verilog thể hiện trong ví dụ( lấy lại ví dụ trên ):
module fulladd4( sum,c_out,a,b,c_in ); // module với danh sách các port
module Top; // khơng có danh sách port,khối mức đỉnh trong sự mô phỏng
PORTS
2. Port Declaration
Tất cả các port trong danh sách port nên được khai báo trong module. Port có thể được khai báo như sau:
PORTS
Mỗi port trong danh sách các port được định nghĩa như
input,output hoặc inout. Vì vậy sự khai báo port sẽ trình bày
dứơi đây: Module fulladd4(sum,c_out,a,b,c_in ); output [3:0] sum; output c_cout; input [3:0] a,b; Input c_in;
// kết thức khai báo port …..
<module internals> ……
PORTS
Nhận thấy rằng tất cả sự khai báo của port hoàn toàn khai báo dưới dạng wire trong Verilog. Vì vậy,if một port là dự định là 1 wire thì nó sẽ cũng đủ để khai báo như output,input, hoặc là inout.
input, inout port thừơng được khai báo như wire. Tuy nhiên, nếu output port giữ địa chỉ giá
trị của họ,thì chúng nên được khai báo là
reg(Kiểu reg lưu giá trị dưới dạng số khơng
dấu.). cho ví dụ,trong sự định nghĩa của
DFF,chúng ta muốn output q giữ lại giá trị của nó cho đến khi có xung clock kế tiếp
PORTS
Sự khai báo của cổng cho DFF được cụ thể hoá:
Module DFF(q,d,clk,reset); output q;
reg q; // output port q giữ địa chỉ,trước đó nó được khai báo như thanh ghi
input d,clk,reset; …
…
PORTS
Port input và inout không thể được khai báo dưới dạng reg do các biến reg lưu giữ giá trị cịn port input sẽ khơng lưu giữ giá trị mà chỉ đơn thuần phản ảnh sự thay đổi của tín hiệu bên ngồi mà port này kết nối đến.
PORTS
Một port có thể có 2 đơn vị, một đơn vị là thành phần của module khác. Thành phần và đơn vị bên ngồi đựơc kết nối. Có luật một số luật kết nối port khi có sự thể hiện của module trong module khác. Sự mô phỏng verilog sẽ đưa ra thông báo nếu luật liên kết vi phạm.
PORTS
inputs
bên trong,input port luôn ln nên là kiểu net. Bên
ngồi,input có thể liên kết với một biến kiểu reg hoặc là net( net khơng phải l từ khố mà nó biểu diễn một lớp kiểu dữ liệu chẳng hạn như wire, wand, wor, triand, trior,
trireg.. ).
Outputs
Bên trong,outputs ports có thể là kiểu net hoặc là reg. bên ngồi,inout và output ln luôn nên kết nối đến net. Chúng không thể liên kết to a reg.
Inouts
Bên trong, outputs ports ln ln nên là kiểu net. Bên ngồi,
PORTS
Độ rộng tương thích
Kết nối các thuộc tính trong và ngồi khi chúng khác kích
thước là hợp lệ. tuy nhiên sẽ có cảnh báo là độ rộng khơng tương thích.
Sự khơng kết nối port
Verilog cho phép port giữ việc khơng kết nối. cho ví dụ như chắc chắn rằng port output có thể chỉ dùng cho debugging, và bạn khơng thể kết nối với tín hiệu bên ngồi bạn có thể cho phép port giữ lại sự không kết nối bằng cách khơng khai báo nó trong danh sách các port.
Ví dụ:
PORTS
giả sử rằng module fulladd4 là sự thể hiện trong khối mơ hình Top ta có code:
Module DFF(q,d,clk,reset); output q;
reg q; // output port q giữ địa chỉ,trước đó nó được khai báo như thanh ghi
input d,clk,reset; …
…
PORTS
Sự kết nối port không hơp pháp: module Top;
// khai báo biến kết nối reg [3:0] A,B;
reg C_IN;
reg [3:0] SUM; wire C_OUT;
// sự thể hiện fulladd4,
fulladd4 fa0( SUM,C_OUT,A,B,C_IN );
// sự liên kết khơng hợp pháp vì output port trong module fulladd4 là liên kết đến một biến register SUM trong module Top
…
PORTS
Sự liên kết porting đến tín hiệu bên ngồi
Có 2 phương pháp tạo nên sự liên kết giữa tín hiệu rõ ràng trong một sự thể hiện module và port trong sự định nghĩa module. 2 phương pháp này không thể pha trộn nhau được:
+ Sự kết nối bởi danh sách thứ tự
PORTS
+Sự kết nối bởi danh sách thứ tự
Sự kết nối này hầu như là phương pháp cho những ngừoi bắt đầu học. tín hiệu từ sự liên kết nên xuất hiện trong sự thể hiện module theo thứ tự port( danh sách các tham số ).
PORTS
Quay trở lại với ví dụ trước, xem xét module fulladd4 được định nghĩa
Module DFF(q,d,clk,reset); output q;
reg q; // output port q giữ địa chỉ,trước đó nó đượckhai báo như thanh ghi
input d,clk,reset; …
…
PORTS
Để liên kết tín hiệu trong module Top, tín hiệu bên ngoài SUM,C_OUT,A,B và C_IN xuất hiện đúng theo thứ tự như port sum,c_out,a,b,c_in:
Module Top;
// Declare connection variables Reg [3:0] A,B;
Reg C_IN;
Wire [3:0] SUM; Wire C_OUT;
// sự thể hiện fulladd4, tín hiệu được kết nối đến port theo thứ tự fulladd4 fa_ordered( SUM.C_OUT,A,B,C_IN );
….
<stimulus> …
PORTS
module fulladd4( sum,c_out,a,b,c_in ); output [3:0] sum; output c_cout; input c_in; … <thành phần module> … endmodule
PORTS
+Sự liên kết port bằng tên
Cho sự thiết kế lớn khoảng 50 port,việc nhớ thứ tự các port là điểu khó khăn và dễ gây lỗi khi
thực hiện như cách trên-> Verilog cung cấp cho chúng ta khả năng để kết nối tín hiệu bên ngồi.
// sự thể hiện module fa_byname and liên kết tín hiệu đến port bởi tên fulladd4 fa_byname( .c_out( C_OUT ), .sum( SUM ), .b( B ),
PORTS
Hệ thống thứ bậc tên
Verilog hỗ trợ 1 phương pháp thiết kế thứ bậc. mỗi
thực thể module, tín hiệu, hoặc là 1 biến được định nghĩa với 1 định danh. Một định danh là duy nhất trong thiết kế thứ bậc. Tên theo thứ bậc
tham chiếu cho phép chúng ta biểu thị mỗi định danh trong thứ bậc thiết kế bằng tn duy nhất. Tn theo hệ thống thứ bậc l danh sách các định danh tách biệt bằng dấu chấm cho mỗi mức của thứ bậc thiết kế ( “.” ). Vì vậy,một định danh có thể được dùng trong thiết kế bằng cách chỉ rõ tên đầy đủ theo thứ bậc của chúng
PORTS
Khối mức đỉnh được gọi là root module bởi vì nó khơng đựoc thể hiên ở mọi nơi. Nó diểm bắt đầu. để gán cho 1 tên duy nhất đến một định danh, ta bắt đầu từ khối mức đỉnh và
theo đường dẫn của thiết kế thứ bậc đến định danh cần lấy
PORTS
Với mô phỏng này, stimulus là module mức đỉnh-module root. Cc định danh định nghĩa trong module ny l q, qbar, set, reset. Module root thể hiện m1, đây là module của mạch chốt SR. Module m1 thể hiện n1 và n2, là các cổng NAND. Q, Qbar, S, R l cc tín hiệu port trong thể hiện m1. Việc tham chiếu tên theo hệ thống thứ bậc sẽ gán tên duy nhất cho mỗi định danh.
PORTS
Để gán tên theo hệ thống thứ bậc,ta sử dụng module của module root và các tên thể hiện cho tất cả thể hiện
module bên dưới root. Lưu ý : mỗi thứ bậc là 1 dấu chấm tương ứng,điều này giống như thao tác với class hoặc là struct trong c. Stimulus stimulus.q Stimulus.qbar stimulus.set Stimulus.reset stimulus.m1 Stimulus.m1.Q stimulus.m1.Qbar Stimulus.m1.S stimulus.m1.R Stimulus.n1 stimulus.n2