ماذا يعني "عامل" في Verilog
العوامل تأخذ تعابير حاملة للإشارات وتُنتج تعابير جديدة حاملة للإشارات. a + b عتاد - تحوّله أداة التركيب إلى جامع. a == b عتاد - يبني مقارنًا. لا شيء من هذا "شيفرة تعمل"؛ كله "دارات يصفها العامل".
قائمة العوامل بأكملها صغيرة كفاية للحفظ. هذا المستند يغطّي العوامل الحسابية والمقارنة والمنطقية والشرطية. Bitwise وReduction يغطّي العوامل على مستوى البتات التي ليس لها مقابلات مباشرة في البرمجيات.
الحساب: + - * / %
ثلاثة أشياء يجب معرفتها:
- القسمة هي قسمة أعداد صحيحة.
7/2هو3، لا3.5. ليس لـ Verilog نوع float (حسنًا،real، لكنه للمحاكاة فقط). - القسمة وmodulo باهظتان في العتاد.
/4لا بأس بها (تحوّلها أداة التركيب إلى إزاحة لليمين)، لكن/nلـnمتغيرة بوقت تشغيل تبني مُقسِّم متعدد الدورات لا تريده غالبًا. - الفيضان يلتفّ. جمع قيمتي unsigned بـ N بت يتجاوزان N بت يُقصّر إلى N بت. إن أردت التقاط الـ carry، أعلن النتيجة أوسع ببت واحدة:
wire [7:0] a, b;
wire [8:0] sum = a + b; // 9-bit sum captures carry out
المقارنة: == != < > <= >=
كل عوامل المقارنة الست تُرجع نتيجة بت واحدة: 1 إن صحيح، 0 إن خاطئ، x إن كان لأي معامل بت x أو z. للتعامل مع حالة x/z، استخدم === و!== (عوامل المساواة الصارمة) المُغطّاة في قيم X وZ.
<= هنا هو عامل المقارنة (أصغر من أو يساوي). نفس الأحرف أيضًا تعني non-blocking assignment في كتلة إجرائية (q <= d). السياق يُميّز بينهما: داخل تعبير هو مقارنة؛ على يسار قيمة تُسند، هو إسناد. التداخل مربك لكنه غير ملتبس على المُحلّل.
المنطقي: && || !
العوامل المنطقية تعامل معاملاتها كـ booleans (أي شيء غير صفر صحيح، صفر خاطئ) وتُنتج نتيجة بت واحدة:
التمييز الحاسم لاستيعابه: && المنطقي ليس & على مستوى البتات.
4'b1100 && 4'b0011 // 1 (both are non-zero, logical AND is true)
4'b1100 & 4'b0011 // 4'b0000 (no bit positions are 1 in both)
نفس الشيء لـ || مقابل |. استخدم المنطقي في شروط if ومُسنَدات ?:؛ استخدم bitwise عندما تريد كل موضع بت أن يعمل AND/OR باستقلال.
&& و|| يستخدمان short-circuit بمعنى C: الطرف الأيمن لا يُقَيَّم إن كانت النتيجة محددة بالفعل من اليسار. هذا يهم لـ testbenches التي تفحص مؤشرات أو استدعاءات دوال؛ نادرًا ما يهم لـ RTL القابل للتركيب حيث كل شيء يحدث بالتوازي على أي حال.
العامل الشرطي: ?:
الثلاثي هو صديقك الأفضل لبناء muxes وتعابير شرطية:
النمط cond ? a : b هو multiplexer 2-إلى-1 بـ 1-bit-select في العتاد. تسلسلها لا بأس به لاختيارات 3- و4-طرق، لكن بعد ذلك جملة case (المُغطّاة في Case Statement) أوضح بشكل كبير.
عامل ?: هو أيضًا الطريقة القياسية لإعطاء register قيمة افتراضية تتجاوزها أحيانًا فقط:
next_value = update ? new_data : next_value;
قواعد العرض: مأزق المبتدئين
قواعد عرض Verilog للعوامل الحسابية مشهورة بكونها مفاجئة. الإصدار القصير:
- عرض النتيجة هو الحد الأقصى لعروض المدخلات.
- إن أُسندت النتيجة إلى شيء أوسع، تُمدّد بالأصفار (أو بالإشارة إن signed).
- عرض الحسابات الوسيطة هو أيضًا عرض النتيجة، وهذا يعني أن الفيضان يحدث في الوسيط.
الضرب الأول يفيض لأن عرضي المعاملين 8 بت، وعرض النتيجة لذلك 8 بت، و40000 لا تتسع. الثاني يعمل لأننا وسّعنا a صراحةً قبل الضرب.
تقنيات الإصلاح:
- استخدم عامل التسلسل
{8'b0, a}للتمديد بالأصفار. - استخدم
$unsigned(a)أو$signed(a)للتأثير على التفسير. - مدّد تعابير وسيطة إلى عروض أوسع عند الشك.
أسبقية العوامل
لن تحفظ الجدول، لكنك ستعتمد على بعض القواعد:
*و/و%ترتبط أوثق من+و-.- المقارنة ترتبط أوثق من المنطقي (
&&،||). - العامل الشرطي
?:له أسبقية منخفضة جدًا - عادةً تحتاج أقواسًا حول فروعه في تعابير أكبر. - عند الشك، استخدم الأقواس. المحاكي لا يحاسبك بالحرف.
out = (mode == 2'd0) ? a + b : a - b; // clearer with parens
ماذا بعد
غطّيت كل عامل يشبه نظيره في البرمجيات. المستند التالي - Bitwise وReduction - يتعامل مع العوامل التي ليس لها مقابلات مباشرة في البرمجيات: bitwise AND/OR/XOR لكل بت، إضافة إلى أشكال reduction التي تختصر vector كاملًا إلى بت واحدة.
الأسئلة الشائعة
ما العوامل التي يدعمها Verilog؟
Verilog لديه أربع عائلات عوامل واسعة: حسابي (+، -، *، /، %)، ومقارنة (==، !=، <، >، <=، >=)، ومنطقي (&&، ||، !)، وbitwise/reduction (&، |، ^، ~، ~&، ~|، ~^). إضافة إلى عوامل الإزاحة (<<، >>، <<<، >>>)، concatenation {}، replication {N{...}}، والشرطي ?:.
ما الفرق بين && و& في Verilog؟
&& هو AND منطقي - يعامل كل معامل كـ boolean (صفر أو غير صفر) ويُرجع نتيجة بت واحدة. & هو AND على مستوى البتات - يطابق البتات موضعًا بموضع. 4'b1100 && 4'b0011 هو 1 (كلاهما غير صفر)؛ 4'b1100 & 4'b0011 هو 4'b0000. استخدم && في الشروط، & للعمليات على مستوى البتات.
كيف تعمل القسمة في Verilog؟
قسمة أعداد صحيحة - الجزء الكسري يُهمل. 7 / 2 هو 3، لا 3.5. عامل % يعطي الباقي: 7 % 2 هو 1. القسمة على صفر تُنتج x (مجهول) في المحاكاة. كلا العاملين قابلان للتركيب تقنيًا لكنهما يُنتجان عتادًا كبيرًا جدًا وبطيئًا على FPGAs وASICs - تجنّبهما في مسارات قابلة للتركيب ما لم يكن المقسوم عليه قوة 2.
ما هو العامل الشرطي في Verilog؟
?: هو العامل الثلاثي أو الشرطي، منسوخ من C. cond ? a : b يُقَيَّم إلى a إن كان cond صحيحًا (غير صفر) وb غير ذلك. إنه أكثر بناء يُستخدم لمنطق شبيه بـ multiplexer: out = sel ? in1 : in0 يبني mux 2-إلى-1. سلاسل ?: تبني muxes أوسع، لكن case عادةً أوضح بعد دخلين.