
Mảng đóng gói (Hay còn gọi là packed array) và mảng không đóng gói ( Hay còn gọi là unpacked array).
Trong bài này chúng ta sẽ cùng tìm hiểu về mảng packed và mảng unpacked.
Đây là 2 kiểu mảng được sử sụng khá phổ biến nhưng chúng ta có thể chưa nhận ra nó. Tôi lấy ví dụ khi bạn định nghĩa kiểu dữ liệu như bên dưới:
bit [3:0] var;
logic var [3:0];
Bạn đang sử dụng mảng packed và unpacked rồi đấy.
Vậy tại sao ta gọi đó là 1 mảng mà không gọi là 1 biến ?
Đầu tiên bạn có thể xem “logic” hay “bit” là các kiểu dữ liệu 1 bit và như vậy với biến var ta đang có 4 phần tử 1 bit kết hợp lại. Điều này có thể xem xét như là mảng 1 chiều có 4 phần tử, mỗi phần tử 1 bit.
Bây giờ ta sẽ đi vào phân tích hai loại mảng trên để thấy được điểm khác biệt giữa chúng.
1.Mảng đóng gói (Hay còn gọi là packed array).
Kích thước mảng được khai báo trước tên biến. Packed array có thể được xem xét như một vector.
Ví dụ:
bit [7:0] led;
bit [3:0] sw;
Để xác định kích thước của mảng ta dùng hàm $size(tên mảng).
Ta xét một số ví dụ bên dưới:
module tb;
bit [3:0]sw;
initial begin
sw = 4'b1011;
for (int i = 0; i < $size(sw); i++) begin
$display ("sw[%0d] = %b", i, sw[i]);
end
end
endmodule
Ta xem xét ví dụ như bên trên và dưới đây là kết quả:
ncsim> run
sw[0] = 1
sw[1] = 1
sw[2] = 0
sw[3] = 1
Thêm một ví dụ khác về packed array hai chiều:
module tb;
bit [1:0][3:0] sw;
initial begin
sw = 8'hAB;
$display ("sw = 0x%0h", sw);
for (int i = 0; i < $size(sw); i++) begin
$display ("sw[%0d] = %b (0x%0h)", i, sw[i], sw[i]);
end
end
endmodule
Và đây là kết quả:
ncsim> run
sw = 0xab
sw[0] = 1011 (0xb)
sw[1] = 1010 (0xa)
Dưới đây là ví dụ về việc gán từng phần tử trong mảng:
module tb;
bit [1:0][3:0] sw;
initial begin
sw[0] = 4'hB;
sw[1] = 4'hA;
$display ("sw = 0x%0h", sw);
for (int i = 0; i < $size(sw); i++) begin
$display ("sw[%0d] = %b (0x%0h)", i, sw[i], sw[i]);
for (int j = 0; j < $size(sw[i]); j++) begin
$display ("sw[%0d][%0d] = %b (0x%0h)", i ,j , sw[i][j], sw[i][j]);
end
end
end
endmodule
Ta có được kết quả như bên dưới:
ncsim> run
sw = 0xab
sw[0] = 1011 (0xb)
sw[0][0] = 1 (0x1)
sw[0][1] = 1 (0x1)
sw[0][2] = 0 (0x0)
sw[0][3] = 1 (0x1)
sw[1] = 1010 (0xa)
sw[1][0] = 0 (0x0)
sw[1][1] = 1 (0x1)
sw[1][2] = 0 (0x0)
sw[1][3] = 1 (0x1)
2.Mảng không đóng gói (Hay còn gọi là unpacked array)
Bây giờ chúng ta sẽ cùng nhau tìm hiểu về unpacked array.
Khác với packed array, Unpacked array có kích thước được định nghĩa sau tên biến.
Ví dụ:
logic var [3:0];
bit sw [1:0];
Unpacked array có thể là fixed-size arrays, dynamic arrays, associative arrays hoặc là queues.
Ta xét một số ví dụ như bên dưới để có thể thấy rõ sự khác biệt giữa packed array và unpacked array.
module tb;
byte sw [4];
initial begin
foreach (sw[i]) begin
sw[i] = $random;
$display ("Assign 0x%h to index %d", sw[i], i);
end
$display ("sw = %p", sw);
end
endmodule
Ta có kết quả như bên dưới:
ncsim> run
Assign 0x24 to index 0
Assign 0x81 to index 1
Assign 0x09 to index 2
Assign 0x63 to index 3
sw = '{'h24, 'h81, 'h9, 'h63}
Như vậy có thể thấy, unpacked array là một mảng thật sự. Các phần tử tách biệt nhau.
module tb;
byte sw [2][2];
initial begin
foreach (sw[i]) begin
foreach (sw[i][j]) begin
sw[i][j] = $random;
$display ("sw[%d][%d] = 0x%h", i, j, sw[i][j]);
end
end
$display ("sw = %p", sw);
end
endmodule
Kết quả in ra màn hình của chương trình trên:
ncsim> run
sw[ 0][ 0] = 0x24
sw[ 0][ 1] = 0x81
sw[ 1][ 0] = 0x09
sw[ 1][ 1] = 0x63
sw = '{'{'h24, 'h81}, '{'h9, 'h63}}
Nguồn: trongtranrvc.blogspot
Mong Muốn Có Thêm Cơ Hội Trong Công Việc
Và Trở Thành Một Người Có Giá Trị Hơn
Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng
Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON
Hotline: 0972.800.931 - 0938.838.404 (Mr Long)