Menu
CoddyTech

الأعداد غير محددة الحجم

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 15 من 90.

العدد غير محدد الحجم هو عدد يُكتب دون تحديد عدد البِتّات التي يتكوّن منها. عندما تكتب عددًا دون بادئة تحدد حجمه، يفترض Verilog افتراضيًا أن حجمه 32 بتًا.

a = 'b1010;        // Unsized: Verilog treats this as 32 bits
a = 32'b1010;    // مثل ما سبق، لكن بشكل صريح

تستخدم الأعداد غير محددة الحجم التنسيق والقيمة فقط: [format][value]

  • format: أساس العدد: b للثنائي، وd للعشري، وh للسداسي عشري، أو o للثماني
  • value: العدد الفعلي (على سبيل المثال، 1010)

لا تزال الفاصلة العليا ' مطلوبة قبل حرف التنسيق، لكن لا يسبقها عدد البتات.

  • 'b1010: عدد ثنائي من 32 بتًا، 1010
  • 'd255: عدد عشري من 32 بتًا، 255
  • 'hFF: عدد ست عشري من 32 بتًا، FF
  • 'b1: عدد ثنائي من 32 بتًا، 1 (مع 31 صفرًا بادئًا)

مثال على التعليمات البرمجية:

reg [7:0] data;

initial begin
  data = 1010;      // غير محدد الحجم: قيمة من 32 بت (قد تتسبب في ظهور تحذير)
  data = 'd255;     // Unsized: 32-bit decimal 255
  data = 'hFF;      // غير محدد الحجم: قيمة سداسية عشرية من 32 بت FF
end

من دون تحديد الحجم مقابل محدد الحجم

 من دون تحديد الحجممحدد الحجم
مثال1010 أو 'd2558'b1010 أو 8'd255
عرض البِتّات32 بِتًّا (افتراضيًا)صريح (كما هو محدد)
الفاصلة العليامطلوبة مع التنسيقمطلوبة
متى تُستخدمشفرة بسيطة لمنضدة الاختبارتعيينات العتاد

مشكلة محتملة

قد تؤدي الأعداد غير محددة الحجم إلى سلوك غير متوقع عند إسنادها إلى سجلات أصغر:

reg [3:0] small_reg;
small_reg = 'b1111;   // 32-bit value, but fits in 4 bits (fine)
small_reg = 'b10000;  // قيمة من 32 بت، لكنها كبيرة جدًا! (تحذير)

يُسنِد المثال الثاني قيمة من 32 بت 10000 إلى مسجل من 4 بت. يُحتفَظ فقط بأقل 4 بت (0000)، وقد لا يكون هذا ما تتوقعه.

متى تستخدم الأعداد غير محددة الحجم

تُعد الأعداد غير محددة الحجم مناسبة لما يلي:

  • الأعداد البسيطة في منصات الاختبار
  • عدادات الحلقات
  • تعليمات $display

في مهام العتاد الفعلية، استخدم أعدادًا محددة العرض لتكون صريحًا وتتجنب التحذيرات.

challenge icon

التحدي

في الشيفرة أدناه، بعض الأعداد غير محددة الحجم. غيّرها إلى أعداد محددة الحجم (8 بتات) لتجنب التحذيرات.

ما المطلوب:

  1. غيّر a إلى عدد ثنائي من 8 بتات يمثّل 1010
  2. غيّر b إلى عدد عشري من 8 بتات يمثّل 255
  3. غيّر c إلى عدد ست عشري من 8 بتات يمثّل FF

جرّب بنفسك

module unsized_challenge;
  reg [7:0] a, b, c;
  
  initial begin
    a = 'b1010;      // Change to sized (8-bit binary)
    b = 'd255;     // غيّرها إلى قيمة محددة الحجم (8-bit بالنظام العشري)
    c = 'hFF;      // Change to sized (8-bit hex)
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("c = %b", c);
    $finish;
  end
endmodule
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت

تحقق من التحويل: محوّل أنظمة الأعداد