2010-06-10 42 views

Trả lời

46

Verilog nghĩ theo bit, vì vậy reg [7:0] a[0:3] sẽ cung cấp cho bạn một mảng 4x8 bit (= 4x1 mảng byte). Bạn nhận được byte đầu tiên trong số này với a[0]. Bit thứ ba của byte thứ hai là a[1][2].

Đối với mảng byte 2D, trước tiên hãy kiểm tra trình mô phỏng/trình biên dịch của bạn. Các phiên bản cũ hơn (trước '01, tôi tin) sẽ không hỗ trợ điều này. Sau đó, reg [7:0] a [0:3] [0:3] sẽ cung cấp cho bạn một mảng 2D byte. Một bit duy nhất có thể được truy cập với ví dụ a[2][0][7].

reg [7:0] a [0:3]; 
reg [7:0] b [0:3] [0:3]; 

reg [7:0] c; 
reg d; 

initial begin 

    for (int i=0; i<=3; i++) begin 
     a[i] = i[7:0]; 
    end 

    c = a[0]; 
    d = a[1][2]; 


    // using 2D 
    for (int i=0; i<=3; i++) 
     for (int j=0; j<=3; j++) 
      b[i][j] = i*j; // watch this if you're building hardware 

end 
+1

Không cho vòng lặp <= 3 chứ không phải <3? –

+1

@RossAiken khai báo mảng kiểu [a: b] là phạm vi bao gồm. Vì vậy, <= là chính xác. – siu

+0

@siu - Ban đầu tôi đã sai - ross-aiken phát hiện ra lỗi và tôi đã chỉnh sửa câu trả lời ... – Marty

8

Ngoài Câu trả lời xuất sắc của Marty, đặc điểm SystemVerilog cung cấp loại dữ liệu byte. Sau đây khai báo một biến 4x8-bit (4 byte), gán cho mỗi byte một giá trị, sau đó hiển thị tất cả các giá trị:

module tb; 

byte b [4]; 

initial begin 
    foreach (b[i]) b[i] = 1 << i; 
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]); 
    $finish; 
end 

endmodule 

này in ra:

Address = 0, Data = 00000001 
Address = 1, Data = 00000010 
Address = 2, Data = 00000100 
Address = 3, Data = 00001000 

này cũng tương tự như trong khái niệm để Marty reg [7:0] a [0:3]; . Tuy nhiên, byte là kiểu dữ liệu 2 trạng thái (0 và 1), nhưng reg là 4 trạng thái (01xz). Sử dụng byte cũng yêu cầu chuỗi công cụ của bạn (trình mô phỏng, bộ tổng hợp, v.v.) để hỗ trợ cú pháp SystemVerilog này. Cũng lưu ý cú pháp vòng lặp foreach (b[i]) nhỏ gọn hơn.

Đặc tả SystemVerilog hỗ trợ nhiều loại mảng đa chiều khác nhau. LRM có thể giải thích chúng tốt hơn tôi có thể; tham khảo IEEE Std 1800-2005, chương 5.

3

Thật đơn giản, như lập trình C bạn chỉ cần chuyển các chỉ mục mảng ở bên tay phải trong khi khai báo. Nhưng vâng cú pháp sẽ giống như [0: 3] cho 4 phần tử.

reg a[0:3]; 

Điều này sẽ tạo 1D mảng bit đơn. Tương tự như vậy mảng 2D có thể được tạo ra như thế này:

reg [0:3][0:2]; 

Bây giờ trong C giả sử bạn tạo một mảng 2D của int, sau đó nó sẽ trong nội bộ tạo ra một mảng 2D của 32 bit. Nhưng tiếc là Verilog là một HDL, vì vậy nó nghĩ theo bit chứ không phải bó bit (mặc dù kiểu dữ liệu int có trong Verilog), nó có thể cho phép bạn tạo bất kỳ số bit nào được lưu trữ bên trong một phần tử mảng (không phải là trường hợp với C, bạn không thể lưu trữ 5 bit trong mỗi phần tử của mảng 2D trong C). Vì vậy, để tạo một mảng 2D, trong đó mỗi phần tử riêng lẻ có thể chứa giá trị 5 bit, bạn nên viết điều này:

reg [0:4] a [0:3][0:2]; 
Các vấn đề liên quan