الأعداد غير محددة الحجم
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 15 من 90.
الـ unsized number هو عدد يُكتب دون تحديد عدد الـ bits الخاصة به. عندما تكتب عدداً دون تحديد البادئة الحجمية، فإن Verilog يفترض أنه 32 bits افتراضياً.
a = 'b1010; // Unsized: Verilog treats this as 32 bits
a = 32'b1010; // نفس ما سبق، ولكن بشكل صريحتستخدم الأعداد غير المحددة الحجم (Unsized) التنسيق والقيمة فقط: [format][value]
<strong>format</strong>— أساس العدد:bللنظام الثنائي (binary)، وdللنظام العشري (decimal)، وhللنظام الست عشري (hex)، أوoللنظام الثماني<strong>value</strong>— العدد الفعلي (على سبيل المثال،1010)
ما زالت الفاصلة العليا ' مطلوبة بين التنسيق والقيمة، ولكن لا يوجد عدد للـ `bit` قبلها.
'b1010— `binary` بعرض 32-`bit` للقيمة 1010'd255— `decimal` بعرض 32-`bit` للقيمة 255'hFF— `hex` بعرض 32-`bit` للقيمة FF'b1— `binary` بعرض 32-`bit` للقيمة 1 (مع 31 أصفار بادئة)
مثال على الكود:
reg [7:0] data;
initial begin
data = 1010; // غير محدد الحجم: قيمة 32 بت (قد يسبب تحذيرًا)
data = 'd255; // Unsized: 32-bit decimal 255
data = 'hFF; // غير محدد الحجم: ست عشري 32 بت FF
endUnsized مقابل Sized
| Unsized | Sized | |
|---|---|---|
| مثال | 1010 أو 'd255 | 8'b1010 أو 8'd255 |
| عرض الـ bit | 32 bits (افتراضي) | explicit (كما هو محدد) |
| الفاصلة العليا | مطلوبة مع التنسيق | مطلوبة |
| متى يُستخدم | كود testbench بسيط | تعيينات العتاد (Hardware) |
مشكلة محتملة
يمكن أن تتسبب أرقام Unsized في سلوك غير متوقع عند تعيينها إلى مسجلات أصغر:
reg [3:0] small;
small = 'b1111; // 32-bit value, but fits in 4 bits (fine)
small = 'b10000; // قيمة 32 بت، لكنها كبيرة جدًا! (تحذير)المثال الثاني يخصص قيمة 32-bit وهي 10000 لسجل بحجم 4-bit. يتم الاحتفاظ فقط بـ 4 bits السفلى (0000)، وهو ما قد لا يكون ما تتوقعه.
متى تستخدم Unsized Numbers
تعتبر Unsized numbers مريحة بالنسبة لـ:
- الأرقام البسيطة في testbenches
- عدادات الحلقات (Loop counters)
- تعليمات
$display
بالنسبة لعمليات التعيين الفعلية في الأجهزة، استخدم sized numbers لتبدو صريحًا ولتتجنب التحذيرات.
التحدي
في الكود أدناه، بعض الأرقام تكون unsized. قم بتغييرها إلى أرقام sized (8 bits) لتجنب التحذيرات.
ما يجب فعله:
- Change
aإلى رقم binary بحجم 8 bits للقيمة 1010 - Change
bإلى رقم decimal بحجم 8 bits للقيمة 255 - Change
cإلى رقم hex بحجم 8 bits للقيمة FF
جرّب بنفسك
module unsized_challenge;
reg [7:0] a, b, c;
initial begin
a = 'b1010; // Change to sized (8-bit binary)
b = 'd255; // غيّر إلى محدد الحجم (عشري 8 بت)
c = 'hFF; // Change to sized (8-bit hex)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة