Phép gán giá trị tham số bởi tên

Một phần của tài liệu Thiết kế mạch số với vhdl & verilog pps (Trang 77 - 80)

Chương3 Loại dữ liệu trong Verilog 3.1Khái quát

3.9.2.1.4.2.2 Phép gán giá trị tham số bởi tên

Phép gán giá trị tham số bởi tên bao gồm tên tường minh của tham số và giá trị mới của nó. Tên của tham số sẽ là tên ñược mô tả trong instance của module.

Lâm Đức Khải University of Information Technology Page 78 Ta không cần thiết gán những giá trị ñến tất cả các tham số bên trong module khi sử dụng phương pháp này. Chỉ những tham số nào mà ñược gán giá trị mới thì mới cần ñược chỉ ra.

Biểu thức tham số có thể là một lựa chọn ñể việc gọi instance của module có thể ghi lại việc hiện diện của một tham số mà không cần bất kì một phép gán ñến nó. Những dấu ñóng mở ngoặc ñược ñòi hỏi, và trong trường hợp này tham số sẽ giữ giá trị mặc ñịnh của nó. Khi một tham số ñược gán một giá trị, thì một phép gán khác ñến tên tham số này là không ñược phép.

Xét ví dụ sau, trong ví dụ này cả những tham số của mod_a và chỉ một tham số của mod_c và mod_d bị thay ñổi trong khi gọi instance của module.

module tb2;

wire [9:0] out_a, out_d; wire [4:0] out_b, out_c; reg [9:0] in_a, in_d; reg [4:0] in_b, in_c; reg clk;

// Code tạo testbench clock & stimulus ...

// Bốn instance của moduel vdff với giá trị tham số ñược gán bởi tên // mod_a có giá trị tham số mới là size=10 và delay=15

Lâm Đức Khải University of Information Technology Page 79 // mod_b có giá trị tham số mặc ñịnh là (size=5, delay=1)

// mod_c có một giá trị tham số mặc ñịnh là size=5 và có một giá trị tham số mới là delay=12

// mod_d có một giá trị tham số mới là size=10. // còn tham số delay vẫn giữ giá trị mặc ñịnh

vdff #(.size(10),.delay(15)) mod_a (.out(out_a),.in(in_a),.clk(clk)); vdff mod_b (.out(out_b),.in(in_b),.clk(clk));

vdff #(.delay(12)) mod_c (.out(out_c),.in(in_c),.clk(clk));

vdff #(.delay( ),.size(10) ) mod_d (.out(out_d),.in(in_d),.clk(clk));

endmodule

module vdff (out, in, clk); parameter size=5, delay=1; output [size-1:0] out;

input [size-1:0] in; input clk;

reg [size-1:0] out;

always @(posedge clk) #delay out = in;

Lâm Đức Khải University of Information Technology Page 80

endmodule

Nó thì hợp lệ khi gọi những instance của module dùng những loại ñịnh nghĩa lại tham số trong cùng module ở top-level. Xét ví dụ sau, trong ví dụ này những tham số của mod_a bị thay ñổi bằng cách dùng việc ñịnh nghĩa lại tham số theo thứ tự danh sách và tham số thứ hai của mod_c ñược thay ñổi bằng cách dùng việc ñịnh nghĩa lại tham số bằng tên trong khi gọi instance của module.

module tb3;

// sự pha trộn giữa instance có khai báo tham số theo thứ tự và instance có khai báo tham số theo tên thì hợp lệ

vdff #(10, 15) mod_a (.out(out_a), .in(in_a), .clk(clk)); vdff mod_b (.out(out_b), .in(in_b), .clk(clk));

vdff #(.delay(12)) mod_c (.out(out_c), .in(in_c), .clk(clk)); endmodule

Nó sẽ không hợp lệ khi gọi instace của bất kì module nào dùng lẫn lộn những phép gán lại giá trị tham số bằng thứ tự danh sách tham số và tên giống như trong phép gọi instance của module mod_a ở dưới.

// instance mod_a không hợp lệ do có sự pha trộn giữa các phép gán tham số

vdff #(10, .delay(15)) mod_a (.out(out_a), .in(in_a), .clk(clk));

Một phần của tài liệu Thiết kế mạch số với vhdl & verilog pps (Trang 77 - 80)

Tải bản đầy đủ (PDF)

(86 trang)