اليوم ، هناك اثنتان من أكثر لغات وصف الأجهزة شيوعًا: Verilog / SystemVerilog و VHDL. لغات وصف الأجهزة نفسها هي وسائل عالمية تمامًا ، ولكن هل هذا هو الحال دائمًا؟ وما الذي لا يمكن أن تعتمد عليه "لا عالمية" لغة وصف الأجهزة؟
نشأت فكرة كتابة هذه المقالة أثناء توليف مشروع واحد في بيئات تطوير مختلفة ، ونتيجة لذلك تم الحصول على نتائج مختلفة. نظرًا لأن وحدة المصدر ضخمة جدًا ، فقد تمت كتابة وحدة اختبار أصغر لإظهار النتائج ، ولكن تركيبها تسبب في نفس التحذيرات / الأخطاء. تم استخدام تسجيل 4 بت مع إعادة تعيين غير متزامن كوحدة اختبار ، وتم اختيار Libero SoC 18.1 و Quartus Prime 17.1 و Vivado 2017.4.1 كبيئات تطوير.
أولاً ، يتم تقديم متغير لوصف هذه الوحدة في لغة فيريلوج ، والتي يتم فهم نصها بشكل صحيح من خلال بيئات التطوير المحددة:
module test1 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= 4'h0 ; end else begin q <= data ; end end endmodule
نتيجة لتجميع هذه الوحدة ، تم الحصول على المخططات التالية:
- Libero SoC v11.8
- كوارتوس برايم 17.1
- Vivado 2017.4.1
في جميع الدوائر المركبة لـ test1 ، تم استخدام مشغلات D إما مع إدخال إعادة تعيين عكسي (Quartus Prime) أو مع إضافة عاكس (VERIFIC_INV في حالة Libero SoC و LUT1 في حالة Vivado).
هل ستكون الدائرة المركبة مختلفة إذا تم تغيير فحص الحالة لإعادة الضبط غير المتزامن؟ للقيام بذلك ، قم بتغيير نص الوحدة النمطية test1 إلى وصف الوحدة النمطية test2:
module test2 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=data; end else begin q<=4'h0; end end endmodule
يمكن الافتراض أن تركيب الوحدة test2 لا يجب أن يختلف عن تركيب الوحدة test1 ، لأن منطق وصف كل من الوحدات لا يتعارض مع بعضها البعض. ومع ذلك ، أدى توليف وحدة test2 إلى النتائج التالية:
- Libero SoC v11.8
تم تصنيع الدائرة ، ولكن ظهرت رسالة التحذير التالية "عدم تطابق الحافة والحالة (CG136)" في الرسائل. يشير هذا التحذير إلى عدم تطابق قائمة الحساسية والتحقق من حالة إعادة الضبط. ومع ذلك ، لا تختلف الدائرة المركبة عن الوحدة test1.
- كوارتوس برايم 17.1
فشل تكوين الدائرة مع الخطأ:
"خطأ (10200): خطأ بيان شرطي فيريلوج إتش دي إل في test2.v (10): لا يمكن أن تطابق المعامل (المعاملات) في الحالة مع الحواف المقابلة في عنصر تحكم الحدث المتضمن للبناء الدائم." نص الخطأ مشابه للتحذير الصادر عن Libero SoC. - Vivado 2017.4.1
تم توليف الدائرة مع التحذير:
"[Synth 8-5788] تسجيل q_reg في اختبار الوحدة النمطية له مجموعة وإعادة تعيين بنفس الأولوية. قد يتسبب هذا في عدم تطابق المحاكاة. فكّر في إعادة كتابة الرمز ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10]." على غرار Libero SoC و Quartus Prime ، تم إصدار تحذير مماثل. بالإضافة إلى ذلك ، قال التحذير حول التباين المحتمل بين نتائج النمذجة والعمل في الأجهزة ، ونتيجة لذلك تم اقتراح إعادة كتابة رمز الوحدة النمطية.
بعد وصف الوحدات النمطية test1 و test2 ، ظهرت الفكرة للتحقق مما سيحدث إذا قمنا بتجميع الكود التالي:
module test3 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=4'h0; end else begin q<=data; end end endmodule
وصف هذا السجل ليس منطقيًا ، نظرًا لأن إعادة تعيين المشغلات في هذه الحالة تحدث عندما يكون خط إعادة التعيين غير نشط.
كانت نتائج التوليف على النحو التالي:
- Libero SoC v11.8
لم يتم تنفيذ توليف الدائرة مع الخطأ: "المنطق لـ q [3: 0] لا يتطابق مع flip-flop قياسي (CL123)" ، وبالتالي رفض توليف الدائرة ، مشيرًا إلى غياب نوع المشغلات اللازمة للتوليف. - كوارتوس برايم 17.1
لم يتم تصنيع الدائرة مع الخطأ التالي: "خطأ (10200): خطأ عبارة شرطية HDL من Verilog عند test3.v (9): لا يمكن مطابقة المعامل (المعاملات) في الحالة مع الحواف المقابلة في التحكم في حدث التضمين للبناء دائمًا" . لا يختلف نص هذا الخطأ عن نص الخطأ للوحدة النمطية test2. - Vivado 2017.4.1
تم تجميع المخطط دون أخطاء:
ومع ذلك ، ماذا سيحدث إذا وصفنا وحدة نمطية لا تتعارض فيها قائمة الحساسية مع التحقق من حالة إعادة التعيين ، ولكن يتم إعادة تعيين المشغلات عندما يكون خط إعادة التعيين غير نشط ، كما هو الحال في وصف وحدة test3. وصف الوحدة النمطية test4 هو كما يلي:
module test4 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= data ; end else begin q <= 4'h0 ; end end endmodule
خلال التوليف ، تم الحصول على النتائج التالية:
- Libero SoC v11.8
تم توليف الدائرة مع التحذير:
"تم العثور على إشارة تم العثور عليها على أنها ساعة النظام والتي تتحكم في 4 عناصر متسلسلة بما في ذلك q_1 [3]. يمكن أن يؤثر استخدام هذه الساعة ، التي ليس لها قيود توقيت محددة ، بشكل سلبي على أداء التصميم. (MT532) ".
- كوارتوس برايم 17.1
نتيجة لتوليف الدائرة ، تم تلقي تحذيرات:
«Warning (13004): Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
Warning (13310): Register "q[0]~reg0" is converted into an equivalent circuit using register "q[0]~reg0_emulated" and latch "q[0]~1"
Warning (13310): Register "q[1]~reg0" is converted into an equivalent circuit using register "q[1]~reg0_emulated" and latch "q[1]~1"
Warning (13310): Register "q[2]~reg0" is converted into an equivalent circuit using register "q[2]~reg0_emulated" and latch "q[2]~1"
Warning (13310): Register "q[3]~reg0" is converted into an equivalent circuit using register "q[3]~reg0_emulated" and latch "q[3]~1"»
تتوافق جميع التحذيرات الموضحة أعلاه مع حقيقة استخدام المزالج بدلاً من المشغلات.
- Vivado 2017.4.1
تم تصنيع الدائرة بتحذير واحد:
"[Synth 8-5788] تسجيل q_reg في اختبار الوحدة النمطية له مجموعة وإعادة تعيين بنفس الأولوية. قد يتسبب هذا في عدم تطابق المحاكاة. ضع في اعتبارك إعادة كتابة الرمز ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11]." يكرر نص هذا الخطأ نص الخطأ للوحدة النمطية test2.
من جميع التجارب الموصوفة ، يمكن استخلاص الاستنتاجات التالية:
- لغة Verilog هي لغة وصف الأجهزة العالمية ، والتي تكون قيودها هي قدرات بيئات التطوير نفسها ؛
- للحصول على الوصف الصحيح للمعدات ، من الضروري معرفة بنية اللغة ، وكذلك تحليل قوائم التحذيرات والأخطاء التي تحدث في كل مرحلة من مراحل إنشاء المشروع.