ماژول و پورتهای جهتدار
پورتها رابط سختافزار را مشخص میکنند.
module and_gate ( input wire a, input wire b, output wire y); assign y = a & b;endmodule
مرجع پایه Verilog برای ماژول، سیگنالها، منطق ترتیبی و تستبنچ. عرض پورتها و رفتار combinational را صریح بنویسید. در Verilog کلاسیک و SystemVerilog نوعهای داده و always blockها تفاوت دارند. منطق ترتیبی را روی لبهٔ clock مدل کنید، در SystemVerilog از always_ff و nonblocking assignment استفاده کنید و قطبیت reset را مستند کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
پورتها رابط سختافزار را مشخص میکنند.
module and_gate ( input wire a, input wire b, output wire y); assign y = a & b;endmoduleمقداردهی پیشفرض همهٔ خروجیها از latch ناخواسته جلوگیری میکند.
always_comb begin result = '0; case (select) 2'b00: result = a; 2'b01: result = b; 2'b10: result = a ^ b; default: result = '0; endcaseendپارامترها عرض را قابلتنظیم میکنند؛ بازهٔ بردار را بررسی کنید.
module register #( parameter int WIDTH = 8) ( input logic [WIDTH-1:0] data_in, output logic [WIDTH-1:0] data_out);endmoduleدر reset همزمان، reset در لبهٔ فعال clock نمونهبرداری میشود.
always_ff @(posedge clk) begin if (reset) begin q <= '0; end else begin q <= data_in; endendreset ناهمزمان در sensitivity list است؛ polarity را با مدار مقصد هماهنگ کنید.
always_ff @(posedge clk or negedge reset_n) begin if (!reset_n) q <= '0; else q <= data_in;endپهنای شمارنده و رفتار wraparound را در طراحی و تست مشخص کنید.
always_ff @(posedge clk or negedge reset_n) begin if (!reset_n) count <= '0; else if (enable) count <= count + 1'b1;endانتساب next-state پیشفرض و default در case طراحی را کامل میکند.
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;state_t state, next_state;always_comb begin next_state = state; case (state) IDLE: if (start) next_state = BUSY; BUSY: if (finished) next_state = DONE; DONE: next_state = IDLE; default: next_state = IDLE; endcaseendclock را با زمانبندی ثابت بسازید و reset را قبل از stimulus اعمال کنید.
initial clk = 1'b0;always #5 clk = ~clk;initial begin reset_n = 1'b0; repeat (2) @(posedge clk); reset_n = 1'b1;endassertion شرط مورد انتظار را در شبیهسازی کنترل میکند.
assert property (@(posedge clk) disable iff (!reset_n) valid |-> !$isunknown(data));طراحی را با module name(...); و پایان endmodule تعریف کنید.
پهنای bus را با بردارهایی مانند logic [7:0] data روشن مشخص کنید.
برای منطق ترکیبی از always_comb و برای ترتیبی از always_ff در SystemVerilog استفاده کنید.
در Verilog کلاسیک، تفاوت wire و reg را با نوع assignment بشناسید.
در بلوک ترتیبی از nonblocking assignment یعنی <= استفاده کنید.
برای منطق ترکیبی همه حالتها را پوشش دهید تا latch ناخواسته ساخته نشود.
پارامترها و عرض سیگنالها را طوری تنظیم کنید که truncate ناخواسته رخ ندهد.
reset همزمان یا ناهمزمان را صریح طراحی و در تست بررسی کنید.
تستبنچ را با clock، ورودیهای مرزی و assertionهای مناسب بسازید.
شبیهسازی و گزارش synthesis را بازبینی کنید؛ نتیجه سنتز با شبیهسازی یکی نیست.
در منطق ترتیبی از nonblocking assignment یعنی <= و در منطق ترکیبی از الگوی کامل و انتساب مناسب استفاده کنید.
برای هر مسیر ترکیبی خروجی را مقداردهی کنید تا latch ناخواسته ساخته نشود؛ testbench را با حالتهای مرزی اجرا کنید.