زبان برنامه نویسی Verilog

زبان ورلاگ

مروری بر ورلاگ

ورلاگ یک زبان توصیف سخت‌افزار (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های محبوب

توسعه ورلاگ از طریق مجموعه‌ای از ابزارها و 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 برای کمک به تبدیل کد ورلاگ به فرمت‌های مختلف یا بهینه‌سازی آن توسعه یافته‌اند و قابلیت‌هایی برای سنتز و شبیه‌سازی ارائه می‌دهند. این ابزارها به‌ویژه برای ادغام طراحی‌های ورلاگ در محیط‌های مبتنی بر جریان مفید هستند.