Menu
CoddyTech

Tham số

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 11 trên 90.

Bạn có thể tạo nhiều bản sao của cùng một module và dùng chúng ở nhiều nơi khác nhau. Đây gọi là **nhiều instance**. Thay vì viết đi viết lại cùng một đoạn code, bạn chỉ cần viết một lần rồi tái sử dụng bao nhiêu lần tùy ý. Mỗi instance là một bản sao riêng của phần cứng đó trên chip.

Nhưng nếu bạn cần mỗi bản sao khác nhau thì sao? Ví dụ: một bộ đếm 8 bit, một bộ đếm 16 bit và một bộ đếm 32 bit. Nếu không có tham số, bạn sẽ phải viết ba module riêng biệt.

Tham số giải quyết vấn đề này.

Tham số là một giá trị hằng số mà bạn có thể đặt khi tạo một instance. Tham số cho phép bạn cấu hình mỗi bản sao của module theo cách khác nhau.

Khai báo tham số

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

#(parameter WIDTH = 8) định nghĩa một tham số tên là WIDTH có giá trị mặc định là 8.

Khi khai báo tham số (parameter), ta dùng ký hiệu # ngay sau tên module và trước danh sách cổng. Ký hiệu # cho Verilog biết phần tiếp theo là danh sách các tham số dùng để cấu hình module. Nếu module không có tham số, bạn chỉ cần bỏ hẳn #.

Sử dụng tham số

Có thể dùng tham số ở bất cứ đâu cần đến một hằng số:

reg [WIDTH-1:0] data;        // Kích thước vectơ
count <= count + 1;           // Hoạt động với mọi độ rộng
assign out = data[WIDTH-1];   // Vị trí bit có trọng số cao nhất (MSB)

Ghi đè tham số

Khi sử dụng module, bạn có thể thay đổi giá trị tham số:

// Độ rộng mặc định (8 bit)
counter u1 (.clk(clk), .count(count1));

// Đặt lại độ rộng thành 16 bit
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Nhiều tham số

Bạn có thể có nhiều tham số:

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Localparam

localparam cũng tương tự, nhưng không thể bị ghi đè từ bên ngoài:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

Dùng localparam cho các hằng số không nên thay đổi.

challenge icon

Thử thách

Thêm một tham số có tên WIDTH với giá trị mặc định là 4.

Cần làm:

  1. Thêm một tham số có tên WIDTH
  2. Đặt giá trị mặc định của tham số thành 4
  3. Tham số nằm bên trong #( ), sau tên module

Tự làm thử

module counter #(
  // Thêm tham số WIDTH ở đây với giá trị mặc định là 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online