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 regvariabel hanya dapat ditugaskan dalam paling banyak satu alwayspernyataan. Dengan kata lain, regs memiliki afinitas terhadap alwaysbalok.
Jenis alwaysblok 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, regs yang memiliki afinitas terhadap alwaysblok kombinasional diimplementasikan sebagai sinyal yang dihitung dari sinyal lain menggunakan logika kombinasional, yaitu gerbang.
Register yang memiliki afinitas dengan alwaysblok dari tipe yang terakhir, di sisi lain, adalah output dari D flip-flop yang di-clock pada tepi naik clk(edge jatuh jika negedgedigunakan). 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_ndikaitkan dengan alwaysblok pertama , outdengan yang kedua. out_nakan diimplementasikan dengan satu gerbang BUKAN tunggal yang akan out_ndigerakkan dan diusir out(perhatikan bahwa itu adalah logika kombinasional murni). Di sisi lain, outakan 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 codeadalah ..