ورلاگ یک زبان توصیف سختافزار (HDL) است که برای طراحی، شبیهسازی و تأیید سیستمهای الکترونیکی دیجیتال، بهویژه مدارهای مجتمع (ICs) استفاده میشود. این زبان در دهه 1980 ایجاد شد و به مهندسان این امکان را میدهد که رفتار و ساختار سیستمهای الکترونیکی را در سطوح مختلف انتزاع، از الگوریتمهای سطح بالا تا سطح دروازه، توصیف کنند. نقش اصلی آن تسهیل شبیهسازی و سنتز مدارهای منطقی دیجیتال است که طراحی و تأیید مؤثر اجزای سختافزاری پیچیده مانند CPUها، FPGAها (آرایههای دروازه قابل برنامهریزی میدانی) و ASICها (مدارهای مجتمع خاص کاربرد) را ممکن میسازد.
ورلاگ در سال 1984 بهعنوان یک زبان اختصاصی توسط Gateway Design Automation ایجاد شد. هدف اولیه آن ارائه ابزاری برای مدلسازی سیستمهای دیجیتال بود. در سال 1990، این زبان توسط Cadence Design Systems خریداری شد که به پذیرش گستردهتر این زبان در صنعت الکترونیک کمک کرد.
در سال 1995، ورلاگ بهعنوان IEEE 1364 استاندارد شد و بهعنوان یک استاندارد رسمی HDL شناخته شد. این استانداردسازی به محبوبیت ورلاگ کمک شایانی کرد و به آن اجازه داد که با سایر HDLها، بهویژه VHDL که در دهه 1980 بهدلیل استفاده در برنامههای نظامی و فضایی به شهرت رسیده بود، رقابت کند.
در سالهای بعد، ورلاگ بهطور قابل توجهی توسعه یافته و شامل ساختارهایی برای روشهای طراحی مدرن مانند SystemVerilog شده است، که یک گسترش است که ویژگیهایی از ورلاگ و پارادایمهای برنامهنویسی شیءگرا را در بر میگیرد. اکنون، SystemVerilog هم بهعنوان ابزاری برای تأیید و هم بهعنوان ابزاری برای طراحی عمل میکند و قابلیتهای ورلاگ را بیشتر افزایش میدهد.
در حال حاضر، ورلاگ و گسترشهای آن همچنان بهعنوان یک زبان بنیادی در صنعت اتوماسیون طراحی الکترونیک (EDA) باقی ماندهاند و دارای یک اکوسیستم قوی از ابزارها هستند که توسط شرکتهای بزرگ مختلفی مانند Synopsys، Mentor Graphics و Cadence ارائه میشود.
بلوک ساختاری اصلی در ورلاگ ماژول است. ماژولها شامل ورودیها، خروجیها و منطق داخلی هستند.
module my_adder(input a, input b, output sum);
assign sum = a + b;
endmodule
ورلاگ از بلوکهای رویهای مانند always
و initial
پشتیبانی میکند که اجازه میدهند منطق ترتیبی و مقداردهی اولیه انجام شود.
always @(posedge clk) begin
q <= d; // در لبه صعودی clk، d را به q اختصاص دهید
end
تخصیصهای مداوم میتوانند با استفاده از بیانیه assign
انجام شوند که اطمینان میدهد خروجی بلافاصله تغییرات ورودیها را منعکس میکند.
wire out;
assign out = a & b; // دروازه AND
ورلاگ اجازه میدهد تا مدلسازی مستقیم با استفاده از ابتداییهای داخلی مانند AND، OR و NOT انجام شود.
and my_and(out, a, b); // یک دروازه AND را ایجاد میکند
تست بنچها در ورلاگ برای شبیهسازی و تأیید عملکرد یک طراحی استفاده میشوند.
module tb_my_adder;
reg a, b;
wire sum;
my_adder dut (.a(a), .b(b), .sum(sum)); // طراحی را ایجاد کنید
initial begin
a = 0; b = 0; #10; // ورودیها را اعمال کنید و منتظر بمانید
a = 1; #10;
b = 1; #10;
end
endmodule
ورلاگ از بیانیههای شرطی مانند if
و case
برای تصمیمگیری در بلوکهای رویهای پشتیبانی میکند.
if (sel) begin
out = a;
end else begin
out = b;
end
حلقهها میتوانند در ورلاگ برای تخصیصها و عملیات تکراری استفاده شوند.
for (i = 0; i < 8; i = i + 1) begin
// انجام عملیات
end
ورلاگ اجازه میدهد تا ماژولهای پارامتری ایجاد شوند که طراحیها را با پیکربندیهای مختلف دوباره استفاده کنند.
module my_multiplier #(parameter WIDTH = 8)(input [WIDTH-1:0] a, input [WIDTH-1:0] b, output [2*WIDTH-1:0] product);
assign product = a * b;
endmodule
ورلاگ قابلیت تعریف وظایف و توابع برای طراحی کد مدولار را فراهم میکند.
function [7:0] add(input [7:0] a, input [7:0] b);
add = a + b;
endfunction
تخصیصهای غیرمسدودکننده با استفاده از عملگر <=
امکان مدلسازی بهتری از طراحیهای همزمان را فراهم میکنند.
always @(posedge clk) begin
q <= d; // برای اجرای بعدی برنامهریزی شده است
end
توسعه ورلاگ از طریق مجموعهای از ابزارها و IDEها تسهیل میشود. نرمافزارهای معمولاً استفاده شده شامل ModelSim، Synopsys VCS و Cadence Incisive هستند که قابلیتهای شبیهسازی، سنتز و اشکالزدایی را فراهم میکنند.
برای ساخت یک پروژه ورلاگ، معمولاً کد ورلاگ خود را در فایلهای .v
مینویسید. سپس میتوانید یک شبیهساز یا ابزار سنتز را از خط فرمان یا درون یک IDE فراخوانی کنید. بهعنوان مثال، یک دستور کامپایل ممکن است به شکل زیر باشد:
vcs my_design.v -o my_sim
پس از کامپایل، میتوانید شبیهسازی را با:
./my_sim
اجرا کنید.
ورلاگ عمدتاً در طراحی و تأیید مدارهای دیجیتال استفاده میشود، از جمله:
قابلیت آن برای مدلسازی سختافزار در سطوح مختلف انتزاع، آن را برای کاربردهای متعدد در صنعت الکترونیک چندمنظوره میسازد.
ورلاگ اغلب با سایر زبانهای HDL مانند VHDL مقایسه میشود. در حالی که هر دو هدف مشابهی دارند، ورلاگ بهطور کلی بهعنوان زبانی آسانتر برای یادگیری بهدلیل نحو سادهترش که مشابه زبان برنامهنویسی C است، شناخته میشود. VHDL برای طراحیهای پرجزئیاتتر که نیاز به بررسی نوع قوی دارند، ترجیح داده میشود و معمولاً در برنامههای دولتی و فضایی استفاده میشود.
هنگام مقایسه با زبانهای برنامهنویسی نرمافزاری مانند C و Java، ورلاگ بر ساختارهای سختافزاری و فرآیندهای همزمان تمرکز دارد، در حالی که زبانهای نرمافزاری منطق ترتیبی و رویهای را مدیریت میکنند. پایتون میتواند برای تست و پردازش دادههای شبیهسازی در سطح بالا استفاده شود، اما روش مستقیمی برای توصیف سختافزار ارائه نمیدهد.
برای کسانی که به دنبال ترجمه طراحیهای ورلاگ به فرمتهای HDL دیگر هستند، ابزارهایی مانند Calyx و سایر نرمافزارهای متنباز وجود دارند که این فرآیند را تسهیل میکنند. با این حال، ویژگیهای خاص ورلاگ میتواند ترجمههای مستقیم را بهدلیل تفاوتهای ذاتی در انتزاع و هدف هر زبان چالشبرانگیز کند.
ابزارهایی مانند Verilator یا Yosys برای کمک به تبدیل کد ورلاگ به فرمتهای مختلف یا بهینهسازی آن توسعه یافتهاند و قابلیتهایی برای سنتز و شبیهسازی ارائه میدهند. این ابزارها بهویژه برای ادغام طراحیهای ورلاگ در محیطهای مبتنی بر جریان مفید هستند.