در زبان توصیف سخت‌افزار Verilog، دو نوع عملگر برای تخصیص مقادیر به سیگنال‌ها در بلوک‌های رفتاری (always) وجود دارد: تخصیص مسدودکننده (=) و تخصیص غیرمسدودکننده (<=). درک تمایز بین این دو برای سنتز موفقیت‌آمیز در FPGA بسیار حیاتی است، زیرا هر کدام به ساختارهای سخت‌افزاری کاملاً متفاوتی نگاشت می‌شوند.

ویژگی تخصیص مسدودکننده (Blocking) - = تخصیص غیرمسدودکننده (Non-Blocking) - <=
نماد علامت مساوی (=) علامت کوچک‌تر مساوی (<=)
نگاشت سخت‌افزاری متداول منطق ترکیبی (Combinational Logic) منطق ترتیبی (Sequential Logic) و فلیپ‌فلاپ‌ها
نحوه اجرا دستورات به صورت ترتیبی اجرا می‌شوند؛ دستور بعدی تا پایان اجرای دستور قبلی مسدود می‌ماند. دستورات به صورت موازی اجرا می‌شوند؛ تخصیص‌ها تا انتهای بلوک always به تعویق می‌افتند.
زمان به‌روزرسانی متغیر بلافاصله به‌روز می‌شود و این مقدار جدید می‌تواند در همان بلوک برای تخصیص‌های بعدی استفاده شود. مقدار جدید متغیر تا پایان اجرای بلوک always، یا دقیق‌تر، تا لبه ساعت بعدی، به‌روزرسانی نخواهد شد.
کاربرد استاندارد بلوک‌های always @* یا always_comb برای توصیف مدارهای ترکیبی. بلوک‌های always @(posedge clk) برای توصیف مدارهای ترتیبی و رجیسترها.
ریسک اصلی ریسک بالا در ایجاد تله‌های رقابتی (Race Conditions) و عدم تطابق شبیه‌سازی و سنتز. تضمین رفتار صحیح برای منطق ترتیبی و پیشگیری از تله‌های رقابتی در فلیپ‌فلاپ‌ها.

1. تخصیص مسدودکننده (=) – منطق ترکیبی

عملگر تخصیص مسدودکننده (=) در Verilog، یک عملیات شبیه به زبان‌های برنامه‌نویسی نرم‌افزاری ایجاد می‌کند.

مفهوم اجرا:

هنگامی که چندین تخصیص مسدودکننده در یک بلوک always وجود دارد، آن‌ها به ترتیب نگارش اجرا می‌شوند. هر تخصیص، اجرای تخصیص‌های بعدی را تا زمانی که خود تکمیل شود، مسدود می‌کند. به محض اینکه یک متغیر با = به‌روزرسانی شود، مقدار جدید آن بلافاصله در خطوط بعدی همان بلوک در دسترس خواهد بود.

نگاشت سخت‌افزاری:

این نوع تخصیص برای توصیف منطق ترکیبی (Combinational Logic) ایده‌آل است. برای مثال، اگر از آن در یک بلوک always @* یا always_comb استفاده کنید، ابزارهای سنتز آن را به شبکه‌ای از گیت‌های منطقی (مانند LUTها در FPGA) که هیچ عنصر ذخیره‌سازی (فلیپ‌فلاپ) ندارند، تبدیل می‌کنند.

خطر بزرگ:

استفاده از تخصیص مسدودکننده (=) در منطق ترتیبی (بلوک‌های کلاک‌شده) به شدت توصیه نمی‌شود. این کار می‌تواند منجر به ایجاد تله‌های رقابتی (Race Conditions) شود، زیرا ترتیب اجرای تخصیص‌ها در شبیه‌سازی ممکن است با ساختار موازی نهایی در سخت‌افزار واقعی FPGA متفاوت باشد.

2. تخصیص غیرمسدودکننده (<=) – منطق ترتیبی

عملگر تخصیص غیرمسدودکننده (<=) کلید طراحی منطق ترتیبی (Sequential Logic) در Verilog است و رفتار سخت‌افزار موازی را مدل می‌کند.

مفهوم اجرا:

وقتی چندین تخصیص غیرمسدودکننده در یک بلوک always وجود دارد، تمام تخصیص‌های سمت راست (مقدار جدیدی که باید به متغیر اختصاص یابد) در ابتدای اجرای بلوک ارزیابی می‌شوند. اما به‌روزرسانی واقعی متغیرهای سمت چپ، تا انتهای بلوک به تعویق می‌افتد.

به عبارت دیگر، تمام تخصیص‌ها به صورت موازی اتفاق می‌افتند، همانند عملکرد فلیپ‌فلاپ‌ها که ورودی‌ها را در لبه ساعت مشاهده کرده و خروجی را در همان لبه یا کمی بعد به‌روزرسانی می‌کنند.

نگاشت سخت‌افزاری:

این نوع تخصیص به طور استاندارد برای توصیف منطق ترتیبی و عناصر حافظه‌ای مانند فلیپ‌فلاپ‌ها (Flip-Flops) و رجیسترها استفاده می‌شود. هر سیگنالی که با <= در یک بلوک کلاک‌شده (always @(posedge clk)) مقداردهی شود، به یک فلیپ‌فلاپ در FPGA سنتز می‌شود.

مزیت بزرگ:

استفاده از <= در منطق ترتیبی، تضمین می‌کند که خروجی هر فلیپ‌فلاپ در یک مرحله کلاک، صرفاً به مقادیر ورودی‌ها در مرحله کلاک قبلی وابسته باشد. این امر رفتار دقیق و قابل پیش‌بینی سخت‌افزار را در شبیه‌سازی و سنتز تضمین می‌کند و از مشکلات رقابتی جلوگیری می‌کند.

قانون طلایی در طراحی FPGA

قانون استاندارد صنعتی (و بهترین رویکرد برای اجتناب از خطاهای شبیه‌سازی/سنتز) در طراحی FPGA با Verilog به شرح زیر است:

  1. برای توصیف منطق ترتیبی (Sequential Logic): از بلوک‌های کلاک‌شده (always @(posedge clk)) استفاده کنید و همیشه از عملگر غیرمسدودکننده (<=) استفاده نمایید. این کار فلیپ‌فلاپ‌ها را مدل می‌کند.
  2. برای توصیف منطق ترکیبی (Combinational Logic): از بلوک‌های حساس به ورودی (always @* یا always_comb) استفاده کنید و همیشه از عملگر مسدودکننده (=) استفاده نمایید. این کار شبکه‌ای از گیت‌های منطقی (LUTs) را مدل می‌کند.

نادیده گرفتن این تمایز در پروژه‌های پیچیده می‌تواند منجر به عدم تطابق رفتاری بین شبیه‌سازی (Simulation) و سخت‌افزار سنتز شده (Synthesized Hardware) شود که ردیابی و رفع آن بسیار دشوار است.

کلیدواژه ها : Verilog-Blocking-Non-Blocking-تخصیص مسدودکننده-تخصیص غیرمسدودکننده-FPGA-سنتز سخت‌افزار-Synthesis-منطق ترتیبی-Sequential Logic-منطق ترکیبی-Combinational Logic-فلیپ‌فلاپ-Flip-Flop-رجیستر-Register-تله‌های رقابتی-Race Conditions-HDL-always_comb-always block-LUTs-طراحی دیجیتال