عکس پیش‌فرض نوشته

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

 
Learning VHDL
 

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

دستور تاکیدی (assertion) با سطح دقت تذکر برای اطلاع رسانی به کاربر درمورد آنچه در مدل اتفاق می افتد مفید است. برای مثال، اگر یک حلقه بزرگ داشته باشید که زمان زیادی برای اجرای کار بگیرد، دستور تاکیدی با سطح دقت تذکر می تواند برای اطلاع رسانی به طراح در مورد تکمیل 10 ، 20 ، 30 ، …. درصد حلقه استفاده شود.

از دستور تاکیدی با سطح دقت هشدار می تواند برای آگاه کردن طراح از شرایطی که می تواند باعث رفتار نادرست (نه فاجعه انگیز) در آینده شود استفاده کرد.

برای نمونه، اگر هنگام اجرای چند پروسس، مدل مقدار مشخصی را برای یک سیگنال انتظار داشته باشد، اما سیگنال مقدار دیگری داشته باشد، ممکن است مانند مثال دستور EXIT خطایی رخ نداده باشد، اما به کاربر هشدار داده می شود که نتایج مورد انتظار نیستند.

دستور تاکیدی با سطح دقت خطا برای آگاه کردن طراح از شرایطی است که سبب کارکرد نامناسب مدل یا در کل کار نکردن آن می شود. اگر حاصل محاسبه مقدار مثبتی فرض شده باشد، اما مقدار برگشتی منفی باشد ممکن است خطا در نظر گرفته شود.

دستور تاکیدی با سطح دقت خرابی برای آگاه کردن طراح از شرایطی در مدل استفاده می شود که می تواند آثار فجیعی به دنبال داشته باشد. در مطلب قبلی مثالی از چنین شرایطی مطرح شد.

تقسیم بر صفر مثالی از یک عملیات است که می تواند باعث خرابی مدل شود.

مثال دیگر آدرس دهی فراتر از پایان یک آرایه است.

در هر دو مورد، طراح با فعال سازی سطح دقت خرابی می تواند از رفتار نادرست مدل مطلع شود.

معمولا ابزار سنتز از دستور ASSERT چشم پوشی می کند، زیرا دستور ASSERT اصولا برای اداره حالت های استثنا در هنگام نوشتن یک مدل استفاده می شود نه ساخت سخت افزار.

 

حال به بررسی دستور تاکیدی BNF می پردازیم:

توصیف BNF دستور ASSERT به صورت زیر است:

 

assert_statement ::=
    ASSERT condition
[REPORT expression]
    [SEVERITY expression];

 

پس از کلید واژه ASSERT یک عبارت با مقدار بولی به نام شرط می آید. شرط خروجی بودن عبارت متنی مشخص شده توسط بخش REPORT بررسی می کند. اگر نادرست باشد، عبارت متنی خروجیست؛ اگر درست باشد، عبارت متنی خروجی نیست.

دستور ASSERT دو بخش اختیاری دارد. نحستین بخش REPORT است. طراح مقدار عبارت متنی خروجی را توسط این بخش مشخص می کند.

دومین بخش SEVERITY است که به طراح امکان می دهد سطح دقت دستور ASSERT را مشخص کند. اگر بخش REPORT مشخص نشده باشد مقدار پیش فرض دستور ASSERT یک پیام تاکیدی با مضمون نقض است. اگر بخش SEVERITY مشخص نشده باشد مقدار پیش فرض خطاست.

طرز کار دستور ASSERT را با یک مثال مرور می کنیم.

در این مثال با بررسی دو سیگنال کنترل کننده یک فلیپ فلاپ D، داده تنظیم می شود. در اغلب فلیپ فلاپ ها لازم است ورودی din (داده) برای مدت زمان مشخص قبل از لبه های ساعت، که زمان نشست نامیده می شود، پایدار باشد.

تامین زمان نشست تضمین می کند که مقدار din با لبه های ساعت در فلیپ فلاپ وارد می شود. این وضعیت در مدل زیر نشان داده شده است. اگر از زمان نشست تخطی شود (دستور ASSERT نادرست ارزیابی شود) یک پیام خطای تاکیدی گزارش می شود.

 

PROCESS(clk, din)
    VARIABLE last_d_change  : TIME :=   ns;
    VARIABLE last_d_value     : std_logic := ‘X’;
    VARIABLE last_clk_value   : std_logic := ‘X’;
BEGIN
    IF (last_d_value /= din) THEN -- /= is
        Last_d_change := NOW;
        Last_d_value := din;
    END IF;

    IF (last_clk_value /= clk) THEN
        Last_clk_value := clk;
        IF (clk = ‘1’) THEN
            ASSERT (NOW – last_d_change >= 20 ns)
            REPORT “setup violation”
            SEVERITY WARNING;
        END IF;
    END IF;
END PROCESS;

 

پروسس از سه متغییر محلی برای ذخیره زمان و آخرین مقدار سیگنال din و نیز مقدار سیگنال clk استفاده می کند. با مرتب کردن آخرین مقدار clk و din می توان تغییرات سیگنال را مشخص کرد. با ذخیره زمان آخرین تغییر din می توان از زمان جاری تا آخرین گذر din را اندازی گیری کرد تا در صورت نقض شرط زمان نشست مشخص شود.

با تغییر din و clk پروسس احضار می شود. در نخستین مرحله پروسس تغییر سیگنال din بررسی می شود. در صورتی که تغییر سیگنال، زمان گذر آن با استفاده از تابع از پیش تعریف شده NOW ذخیره می شود. این تابع زمان شبیه سازی جاری را برمی گرداند. همچنین، آخرین مقدار din برای بررسی های بعدی ذخیره می شود.

در مرحله بعدی گذر گذر سیگنال clk بررسی می شود. اگر متغییر last_d_value با مقدار جاری clk برابر نباشد، وقوع یک گذر را نشان می دهد. اگر سیگنال clk مقدارش ‘1’ باشد، می دانیم که یک لبه بالارونده رخ داده است.

هرگاه یک لبه بالارونده روی سیگنال clk رخ می دهد بایستی نقض زمان نشست را بررسی کنیم. اگر از آخرین گذر سیگنال d کمتر از 20 نانو ثانیه گذشته باشد، عبارت (NOW – last_d_change) مقداری کمتر از 20 نانو ثانیه را برمی گرداند. دستور ASSERT تریگر می شود و پیام تاکیدی نقض شرط نشست را به طراح هشدار می دهد.

اگر از آخرین گذر سیگنال d بیش از 20 نانو ثانیه گذشته باشد، مقدار برگشتی عبارت بیش از 20 نانو ثانیه خواهد بود و دستور ASSERT پیامی چاپ نمی کند.

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

دستور ASSERT مورد استفاده در این مثال یک دستور ASSERT ترتیبی است، زیرا در یک دستور PROCESS آورده شده است. دستور ASSERT همزمان نیز وجود دارد که درست همان قالب دستور ASSERT ترتیبی را دارد و فقط خارج از دستور PROCESS یا یک زیر برنامه قرار می گیرد.

با وقوع رویداد روی یکی از سیگنال های موجود در عبارت شرطی دستور ASSERT همزمان، دستور اجرا می شود. این برخلاف دستور ASSERT ترتیبی است. دستور ASSERT ترتیبی هنگام رسیدن اجرا به آن در PROCESS یا زیر برنامه، اجرا می شود.

این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست به‌روزرسانی‌های سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال می‌شیم به ما اطلاع بدهید.