Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
Menempatkan nilai pada jaringan (net) dan variabel disebut penugasan. Terdapat tiga bentuk dasar:
- Prosedural
- Berkelanjutan (Continuous)
- Prosedural berkelanjutan
Nilai LHS yang Valid
Sebuah penugasan terdiri dari dua bagian: sisi kanan (RHS) dan sisi kiri (LHS), yang dipisahkan oleh simbol sama dengan (=) atau simbol kurang dari-sama dengan (<=).
| Jenis penugasan | Sisi kiri |
|---|
| Prosedural | - Variabel (vektor/skalar)
- Bit-select atau part-select dari vektor reg, integer, atau variabel waktu
- Kata memori
- Konkatenasi dari salah satu di atas
|
| Berkelanjutan | - Jaringan (vektor/skalar)
- Bit-select atau part-select dari jaringan vektor
- Konkatenasi bit-select dan part-select
|
| Prosedural Berkelanjutan | - Jaringan atau variabel (vektor/skalar)
- Bit-select atau part-select dari jaringan vektor
|
RHS dapat berisi ekspresi apa pun yang mengevaluasi ke nilai akhir, sedangkan LHS menunjukkan jaringan atau variabel yang nilai RHS ditugaskan padanya.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk berada di LHS dan not clk membentuk RHS
always #10 clk = ~clk;
// y adalah LHS dan konstanta 1 adalah RHS
assign y = 1;
// f adalah LHS, dan ekspresi a,b,d,e membentuk RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z adalah LHS, dan ekspresi a,b,c,d membentuk RHS
z <= a + b + c + d;
end
initial begin
// Nama variabel di kiri membentuk LHS sementara 0 adalah RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0; clk <= 0;
end
endmodule
Penugasan Prosedural
Penugasan prosedural terjadi dalam prosedur seperti always, initial, task, dan fungsi, dan digunakan untuk menempatkan nilai pada variabel. Variabel akan memegang nilai tersebut hingga penugasan berikutnya pada variabel yang sama.
Nilai akan ditempatkan pada variabel saat simulasi mengeksekusi pernyataan ini pada titik tertentu selama waktu simulasi. Ini dapat dikontrol dan dimodifikasi sesuai keinginan dengan menggunakan pernyataan aliran kontrol seperti if-else-if, pernyataan case, dan mekanisme perulangan.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk) count++;
Penugasan Deklarasi Variabel
Nilai awal dapat ditempatkan pada variabel pada saat deklarasinya seperti yang ditunjukkan berikutnya. Penugasan ini tidak memiliki durasi dan memegang nilai hingga penugasan berikutnya pada variabel yang sama terjadi. Perhatikan bahwa penugasan deklarasi variabel pada array tidak diperbolehkan.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678;
// data akan memiliki dead_cafe dari waktu 0 hingga waktu 20
// Pada waktu 20, data akan mendapatkan 12345678
end
endmodule
reg [3:0] a = 4'b4;
// ekuivalen dengan
reg [3:0] a;
initial a = 4'b4;
Jika variabel diinisialisasi selama deklarasi dan pada waktu 0 dalam blok initial seperti yang ditunjukkan di bawah ini, urutan evaluasi tidak dijamin, dan oleh karena itu dapat memiliki 8'h05 atau 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // ilegal
integer i = 0, j; // mendeklarasikan dua integer i,j dan i ditugaskan 0
real r2 = 4.5, r3 = 8; // mendeklarasikan dua bilangan real r2,r3 dan ditugaskan 4.5, 8 masing-masing
time startTime = 40; // mendeklarasikan variabel waktu dengan nilai awal 40
Blok dan penugasan prosedural akan dibahas lebih detail di bagian selanjutnya.
Penugasan Berkelanjutan
Klik di sini untuk contoh simulasi langkah demi langkah !
Ini digunakan untuk menugaskan nilai pada jaringan skalar dan vektor dan terjadi setiap kali ada perubahan pada RHS. Ini menyediakan cara untuk memodelkan logika kombinatorial tanpa menentukan konektivitas gerbang dan memudahkan untuk mendorong jaringan dengan ekspresi logis.
// Contoh model gerbang AND
wire a, b, c;
assign a = b & c;
Setiap kali b atau c mengubah nilainya, maka seluruh ekspresi di RHS akan dievaluasi dan a akan diperbarui dengan nilai baru.
Penugasan Deklarasi Jaringan
Ini memungkinkan kita untuk menempatkan penugasan berkelanjutan pada pernyataan yang sama yang mendeklarasikan jaringan. Perhatikan bahwa karena jaringan hanya dapat dideklarasikan sekali, hanya satu penugasan deklarasi yang mungkin untuk sebuah jaringan.
wire penable = 1;
Penugasan Prosedural Berkelanjutan
Ini adalah pernyataan prosedural yang memungkinkan ekspresi untuk ditugaskan secara berkelanjutan pada jaringan atau variabel dan ada dua jenis:
assign ... deassignforce ... release
assign deassign
Ini akan menggantikan semua penugasan prosedural pada variabel dan dinonaktifkan dengan menggunakan sinyal yang sama dengan deassign. Nilai variabel akan tetap sama hingga variabel mendapatkan nilai baru melalui penugasan prosedural atau prosedural berkelanjutan. LHS dari pernyataan assign tidak dapat menjadi bit-select, part-select, atau referensi array, tetapi dapat menjadi variabel atau konkatenasi variabel.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
force release
Ini mirip dengan pernyataan assign - deassign tetapi juga dapat diterapkan pada jaringan dan variabel. LHS dapat menjadi bit-select dari jaringan, part-select dari jaringan, variabel atau jaringan, tetapi tidak dapat menjadi referensi ke array dan bit/part select dari variabel. Pernyataan force akan menggantikan semua penugasan lainnya yang dibuat pada variabel hingga dilepaskan menggunakan kata kunci release.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end