Theo mặc định, phần mềm Quartus® II phiên bản 6.1 và 7.0 không suy ra các cấu trúc bộ nhớ được nhắm mục tiêu cho các khối Stratix® III MLAB từ mã HDL. Bạn phải sử dụng một ramstyle
thuộc tính với giá trị MLAB để phần mềm Quartus II có thể suy ra một khối RAM nhỏ và đặt nó trong MLAB.
Ngoài ra, một số khối RAM không đồng bộ có thể được mã hóa với hành vi đọc trong khi ghi không khớp với kiến trúc Stratix III. Do đó, hành vi thiết bị sẽ không chính xác phù hợp với hành vi được mô tả trong mã. Nếu sự khác biệt về hành vi là chấp nhận được trong thiết kế của bạn, ramstyle
no_rw_check
hãy sử dụng thuộc tính có giá trị để chỉ định rằng phần mềm không nên kiểm tra hành vi đọc trong khi ghi khi suy luận RAM. Khi thuộc tính này được thiết lập, tổng hợp tích hợp Quartus II cho phép hành vi của đầu ra trở nên khác biệt khi đọc không đồng bộ xảy ra trên một địa chỉ có ghi trên cạnh đồng hồ gần đây nhất. Nghĩa là, các kết quả mô phỏng HDL chức năng sẽ không phù hợp với hành vi phần cứng nếu bạn ghi vào một địa chỉ đang được đọc.
Để bao gồm cả hai thuộc tính, hãy đặt giá trị của thuộc ramstyle
tính thành "MLAB, no_rw_check"
. Để biết thông tin về cú pháp để thiết lập các thuộc tính tổng hợp, hãy tham khảo chương Tổng hợp Tích hợp Quartus II (PDF) trong tập 1 của Sổ tay Quartus II.
Dưới đây là một ví dụ của Verilog-2001 về một khối RAM không đồng bộ nhỏ, ramstyle
với bộ thuộc tính tổng hợp để bộ nhớ có thể được triển khai trong khối bộ nhớ MLAB và hành vi đọc trong khi ghi không quan trọng. Nếu không có thuộc tính, thiết kế này yêu cầu thanh ghi 512 và 240 ALUTs. Với thuộc tính, thiết kế yêu cầu 8 ALUT bộ nhớ và chỉ 15 thanh ghi.
module async_ram (
input [5:0] addr,
input [7:0] data_in,
input clk,
input write,
output [7:0] data_out );
(* ramstyle = "MLAB, no_rw_check" *) reg [7:0] mem[0:63];
assign data_out = mem[addr];
always @ (posedge clk)
begin
if (write)
mem[addr] = data_in;
end
endmodule