Pertama, perhatikan bahwa tidak semua desain Verilog dapat disintesis. Biasanya, hanya subset konstruksi yang sangat spesifik yang dapat digunakan dalam desain yang harus direalisasikan dalam perangkat keras.
Satu batasan penting yang muncul adalah bahwa setiap reg
variabel hanya dapat ditugaskan dalam paling banyak satu always
pernyataan. Dengan kata lain, reg
s memiliki afinitas terhadap always
balok.
Jenis always
blok berikut umumnya dapat digunakan.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
Dalam kasus sebelumnya, yang *
menunjukkan bahwa blok harus dieksekusi setiap kali sinyal yang digunakan dalam blok berubah atau, ekuivalen, bahwa blok harus dieksekusi terus menerus. Oleh karena itu, reg
s yang memiliki afinitas terhadap always
blok kombinasional diimplementasikan sebagai sinyal yang dihitung dari sinyal lain menggunakan logika kombinasional, yaitu gerbang.
Register yang memiliki afinitas dengan always
blok dari tipe yang terakhir, di sisi lain, adalah output dari D flip-flop yang di-clock pada tepi naik clk
(edge jatuh jika negedge
digunakan). Input ke sandal jepit, sekali lagi, dihitung dengan logika kombinasional dari sinyal lain.
Pertimbangkan contoh berikut yang agak dibuat-buat.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Di sini, out_n
dikaitkan dengan always
blok pertama , out
dengan yang kedua. out_n
akan diimplementasikan dengan satu gerbang BUKAN tunggal yang akan out_n
digerakkan dan diusir out
(perhatikan bahwa itu adalah logika kombinasional murni). Di sisi lain, out
akan digerakkan oleh flip-flop yang berasal dari clk
. Input ke flip-flop lagi akan dihitung oleh gerbang NOT dari out
(yang digerakkan oleh flip-flop tersebut). Optimalisasi synthesizer akan menggabungkan dua gerbang NOT dan menggunakan satu gerbang NOT dan satu flip-flop.
Bergantung pada perangkat keras yang Anda miliki, jenis konstruksi lainnya dapat digunakan. Misalnya, jika sandal jepit memiliki pengaturan ulang asinkron, konstruk berikut juga dapat disintesis.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of code
adalah ..