Đầu tiên, lưu ý rằng không phải tất cả các thiết kế Verilog đều có thể tổng hợp được. Thông thường, chỉ có một tập hợp con rất cụ thể của các cấu trúc có thể được sử dụng trong một thiết kế sẽ được hiện thực hóa trong phần cứng.
Một hạn chế quan trọng xuất hiện là mọi reg
biến chỉ có thể được gán cho tối đa một always
câu lệnh. Nói cách khác, reg
s có ái lực với always
các khối.
Các loại always
khối sau đây thường có thể được sử dụng.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
Trong trường hợp trước, *
chỉ ra rằng khối nên được thực thi bất cứ khi nào bất kỳ tín hiệu nào được sử dụng trong khối thay đổi hoặc, tương tự, khối phải được thực hiện liên tục. Do đó, reg
các s có ái lực với always
các khối tổ hợp được triển khai dưới dạng các tín hiệu được tính từ các tín hiệu khác sử dụng logic tổ hợp, tức là các cổng.
Các thanh ghi có ái lực với always
các khối của loại thứ hai, mặt khác, là đầu ra của các flip-flop được đặt ở cạnh tăng của clk
(cạnh giảm nếu negedge
được sử dụng). Đầu vào của flip-flop, một lần nữa, được tính toán với logic tổ hợp từ các tín hiệu khác.
Hãy xem xét những điều sau đây, ví dụ hơi khó hiểu.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Ở đây, out_n
được liên kết với always
khối đầu tiên , out
với khối thứ hai. out_n
sẽ được thực hiện với một cổng KHÔNG duy nhất sẽ lái out_n
và được điều khiển từ đó out
(lưu ý rằng đó là logic tổ hợp thuần túy). Mặt khác, out
sẽ được điều khiển bởi một flip-flop đồng hồ từ clk
. Đầu vào của flip-flop sẽ lại được tính bằng cổng KHÔNG từout
(được điều khiển bởi flip-flop đã nói ở trên). Tối ưu hóa tổng hợp sẽ kết hợp hai cổng KHÔNG và sử dụng một cổng KHÔNG và một cổng lật.
Tùy thuộc vào phần cứng bạn có sẵn, các loại cấu trúc khác có thể được sử dụng. Ví dụ: nếu flip-flop có bộ đặt lại không đồng bộ, cấu trúc sau đây cũng có thể được tổng hợp.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of code
..