Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

Tìm hiểu về mảng đóng gói và mảng không đóng gói (Packed array và unpacked array)

E-mail Print PDF

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 packedunpacked 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

Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

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)

 

Last Updated ( Friday, 06 September 2019 18:56 )  

Related Articles

Chat Zalo