Monday, April 22, 2019

[System verilog][ Bài 3] Tìm hiểu về mảng đóng gói và mảng không đóng gói (Packed array và unpacked array)


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

No comments:

Post a Comment

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...