فيريلوج (برمجة)

لغه فيريلوج الموحدة كـ معهد مهندسي الكهرباء والإلكترونيات 1364 ، هي لغة وصف الأجهزة (HDL) المستخدمة لنمذجة الأنظمة الإلكترونية. كما يتم استخدام هذه اللغة بشكل شائع وكبير في التصميم وأيضا التحقق من الدوائر الرقمية على مستوى نقل التسجيل للتجريد. كما يتم استخدامها أيضًا في التحقق من الدوائر التناظرية ودوائر الإشارة المختلطة، وكذلك في تصميم الدوائر الجينية. في عام 2009، تم دمج معيار Verilog (IEEE 1364-2005) في معيار SystemVerilog ، مما أدى إلى إنشاء معيار IEEE 1800-2009. منذ ذلك الحين، أصبحت لغه فيريلوج رسميًا جزءًا من لغة نظام فيريلوج.وهو الإصدار الحالي هو IEEE القياسي 1800-2017.

الملخص 
في الواقع فإن لغات وصف الأجهزة مثل لغه فيريلوج تشبه لغات برمجة البرامج لأنها تتضمن طرقًا لوصف وقت الانتشار ونقاط قوة الإشارة (الحساسية). كما انه من الجدير بالذكر هناك نوعان من عوامل التخصيص؛ تخصيص حظر (=)، وتخصيص غير معطل (<=). يسمح التعيين غير المحظور للمصممين بوصف تحديث حالة الجهاز دون الحاجة إلى الإعلان عن متغيرات التخزين المؤقتة واستخدامها. نظرًا لأن هذه المفاهيم جزء من دلالات لغة فيريلوج، في الواقع فإنه يمكن للمصممين كتابة أوصاف الدوائر الكبيرة بسرعة في شكل مضغوط ومختصر نسبيًا. في وقت تقديم فيريلوج (1984)، فلقد مثل فيريلوج تحسينًا هائلاً للإنتاجية والتي تصب في مصلحه مصممي الدوائر الذين كانوا يستخدمون بالفعل برنامج التقاط تخطيطي رسومي وبرامج برامج مكتوبة خصيصًا لتوثيق ومحاكاة الدوائر الإلكترونية.

الفكرة من لغه فيريلوج هو ان المصممين ارادوا بناء جملة مشابهة للغة البرمجة C ، وهي لغه البرجمه التي كانت تستخدم على بالفعل على نطاق واسع في تطوير البرمجيات الهندسية. مثل C ، في الواقع فإن لغه فيريلوج تعتبر حساسًا لحالة الأحرف ولديه معالج أولي أساسي (على الرغم من أنه أقل تعقيدًا من معالج ANSI C / C ++). الكلمات الرئيسية لتدفق التحكم (if / else ، for ، while ، case ، إلخ) متكافئة، وأسبقية المشغل متوافقة مع C. تتضمن الاختلافات النحوية: عروض البت المطلوبة للإعلانات المتغيرة، ترسيم الكتل الإجرائية (تبدأ استخدامات Verilog / end بدلاً من الأقواس المتعرجة {})، كما انها تحمل العديد من الاختلافات الطفيفة الأخرى.إنه من الجدير بالذكر ان لغه فيريلوج تتطلب اعطاء المتغيرات حجما محددا. في لغة C ، يُستدل على هذه الأحجام من «نوع» المتغير (على سبيل المثال، قد يكون نوع العدد الصحيح 8 بت).

يتكون تصميم لغه فيريلوج من تسلسل هرمي للوحدات. تقوم الوحدات بتغليف التسلسل الهرمي للتصميم ، وتتواصل مع الوحدات النمطية الأخرى من خلال مجموعة من المدخلات والمخرجات والمنافذ ثنائية الاتجاه المعلنة. داخليًا، كما انه يمكن أن تحتوي الوحدة النمطية على أي مجموعة من العناصر التي سوف اقوم الآن بذكرها: التصريحات الصافية / المتغيرة (الأسلاك، والتسجيل، والعدد الصحيح، وما إلى ذلك)، وكتل العبارات المتزامنة والمتسلسلة، ومثيلات الوحدات النمطية الأخرى (التسلسلات الهرمية الفرعية). يتم وضع التعليمات المتسلسلة داخل كتلة البداية / النهاية ويتم تنفيذها بترتيب تسلسلي داخل الكتلة. ومع ذلك، يتم تنفيذ الكتل ذاتها بشكل متزامن، مما يجعل فيريلوج لغة تدفق بيانات والتي تصب في مصلحه المصممين بشكل خاص أكثر من غيرهم.

مفهوم لغه فيريلوج هو عباره عن «السلك» من قيم الإشارة (4 حالات: «1، 0، عائم، غير محدد») ونقاط قوة الإشارة (قوية، ضعيفة، إلخ.). كما انه في الواقع يسمح هذا النظام بالنمذجة المجردة لخطوط الإشارة المشتركة، بحيث تقود المصادر المتعددة شبكة مشتركة. عندما يحتوي السلك على محركات متعددة، فإنه بهذه الطريقة يتم حل قيمة السلك (المقروءة) من خلال وظيفة محركات المصدر ونقاط قوتها.

وهي عباره عن مجموعة فرعية من العبارات الموجوده في لغة فيريلوجوالتي تكون قابلة للتجميع.كما يمكن تحقيق وحدات فيريلوج التي تتوافق مع أسلوب الترميز القابل للتركيب، والمعروف باسم RTL (مستوى نقل التسجيل)، فعليًا عن طريق برنامج التوليف. يحول برنامج التوليف خوارزميًا مصدر للغة فيريلوج (المجرد) إلى netlist ، وهذا الوصف في الحقيقة يعتبر وصفا مكافئ منطقيًا يتكون فقط من العناصر الأولية المنطقية (AND ، OR ، NOT ، flip-flops ، إلخ) المتوفرة في تقنية FPGA أو VLSI محددة. كما تؤدي المعالجات الإضافية إلى netlist في النهاية إلى مخطط تصنيع الدائرة (على سبيل المثال مجموعة قناع الصورة لـ ASIC أو ملف bitstream لـ FPGA).

التاريخ

في البداية 
تم إنشاء لغة فيريلوج في بدايه الامر بواسطة Prabhu Goel و Phil Moorby و Chi-Lai Huang و Douglas Warmke وقد تم هذا الامر بين أواخر عام 1983 وأوائل عام 1984. عمل Chi-Lai Huang في وقت سابق على وصف الأجهزة LALSD ، وهي لغة طورها الأستاذ SYH Su لعمل الدكتوراهالتي يدرسها في مجال تخصصه. كان صاحب حقوق هذه العملية، في ذلك الوقت مملوكًا، هو "Automated Integrated Design Systems" (أعيدت تسميته لاحقًا إلى Gateway Design Automation في عام 1985). تم شراء Gateway Design Automation بواسطة Cadence Design Systems في عام 1990. يتمتع Cadence الآن بحقوق ملكية كاملة لـ Gateway's Verilog و Verilog-XL ، وهو جهاز محاكاة HDL الذي سيصبح المعيار الفعلي (لمحاكيات فيريلوج المنطقية) للعقد القادم من الزمن. كان المقصد الاصلي والهدف الاساسي من لغة فيريلوج يقتصر فقط على وصف المحاكاة والسماح بها؛ ثم بعد ذلك تم تطوير التوليف الآلي لمجموعات فرعية من اللغة إلى هياكل قابلة للتحقيق فعليًا (بوابات وما إلى ذلك) بعد أن حققت اللغة استخدامًا واسع النطاق لكونهم حظيو بالكثير من الدعم.

فيريلوج عبارة عن حافظة لكلمات «التحقق» و «المنطق».

فيريلوج 95 
مع النجاح المتزايد الذي حظيت به VHDL في ذلك الوقت، قررت شركه Cadence إتاحة اللغة للتوحيد القياسي المفتوح. قامت شركة كادنس بتحويل لغة فيريلوجإلى المجال العام تحت منظمة Open Verilog Internationalوهي تعرف بـ (OVI) (المعروفة الآن باسم Accellera). تم تقديم Verilog لاحقًا إلى IEEE وأصبح معيار IEEE 1364-1995، والذي يشار إليه عادةً باسم فيريلوج 95.

في نفس الإطار الزمني وفي تلك المدة تحديدا، بدأت شركه Cadence في إنشاء Verilog-A لوضع دعم المعايير خلف جهاز المحاكاة التناظرية Specter .كما انه لم يكن القصد من Verilog-A أن تكون لغة قائمة بذاتها وهي مجموعة فرعية من Verilog-AMS والتي تشمل Verilog-95.

فيريلوج 2001 
تم إرسال ملحقات فيريلوج 95 مرة أخرى إلى IEEE لتغطية أوجه القصور التي وجدها المستخدمون في معيار Verilog الأصلي. أصبحت هذه الامتدادات فيما بعد معيار IEEE 1364-2001 المعروف باسم فيريلوج 2001.

تعد فيريلوج 2001 من أهم الترقيات التي حصلت لنظام فيريلوج 95 التي تسبقها. أولاً، تمت اضافه دعمًا صريحًا للشبكات والمتغيرات الموقعة (2).كما انه مما ينبغي عليك معرفته انه في سابق الامر، كان على مؤلفي الكود إجراء عمليات موقعة باستخدام معالجات على مستوى البت (على سبيل المثال، تتطلب قطعة التنفيذ لإضافة 8 بت بسيطة وصفًا واضحًا للجبر المنطقي لتحديد قيمتها الصحيحة). يمكن وصف الوظيفة نفسها ضمن فيريلوج-2001 بشكل أكثر إيجازًا بواسطة أحد المشغلين المدمجين: + ، - ، / ، * ، >>>. يسمح إنشاء: إنشاء / إنشاء نهائي (على غرار إنشاء / إنشاء VHDL) لـ فيريلوج-2001 بالتحكم في مثيل وبيان إنشاء مثيل من خلال مشغلي القرار العاديين (حالة / إذا / آخر). باستخدام إنشاء / إنشاء، يمكن لـ Verilog-2001 إنشاء مثيل لمجموعة من المثيلات، مع التحكم في اتصال الحالات الفردية. تم تحسين إدخال / إخراج الملف من خلال العديد من مهام النظام الجديدة. وأخيرًا وليس اخرا، تم تقديم بعض الإضافات النحوية لتحسين قابلية قراءة الكود في هذا الإصدار من النظام (على سبيل المثال، دائمًا، @ * ، تجاوز المعلمة المسماة، إعلان رأس الوظيفة / المهمة / الوحدة النمطية على غرار C).

فيريلوج 2001 هو إصدار من لغة البرمجة فيريلوج المدعوم بمعظم حزم برامج EDA التجارية.

فيريلوج 2005 
يجب عدم الخلط بينه وبين SystemVerilog (نظام فيريلوج)، تتكون g 2005 (لغه فيريلوج IEEE Standard 1364-2005) من تصحيحات طفيفة وتوضيحات المواصفات وبعض ميزات اللغة الجديدة (مثل الكلمة الأساسية uwire).

يحاول جزء منفصل من معيار لغة فيريلوج للبرمجة، Verilog-AMS ، دمج نمذجة الإشارات التناظرية والمختلطة مع Verilog التقليدي.

النظام الخاص بـ لغة فيريلوج 
ظهور الأجهزة التحقق من اللغات مثل OpenVera ، Verisity لـ e اللغة تشجيع تطوير Superlog لمن شارك في تصميم Automation Inc (التي حصل عليها سينوبسيس). أسس Superlog وفيرا ثم قام بالتبرع بـ Accellera ، الذي أصبح فيما بعد IEEE القياسية لنظام فيريلوج P1800-2005: SystemVerilog.

نظام فيريلوج SystemVerilog وهو يعد مجموعة شاملة من فيريلوج-2005، مع العديد من الميزات والقدرات الجديدة للمساعدة في التحقق من التصميم ونمذجة التصميم. اعتبارًا من عام 2009، تم دمج معايير لغة نظام فيريلوج SystemVerilog وولغه فيريلوج ذاتها في SystemVerilog 2009 (IEEE Standard 1800-2009). الإصدار الحالي هو IEEE القياسي 1800-2017.

مثال 
فيما يلي سيتم ذكر مثال بسيط على flip-flops:module toplevel(clock,reset);
 input clock;
 input reset;

 reg flop1;
 reg flop2;

 always @ (posedge reset or posedge clock)
  if (reset)
   begin
    flop1 <= 0;
    flop2 <= 1;
   end
  else
   begin
    flop1 <= flop2;
    flop2 <= flop1;
   end
endmoduleيعد <= في لغة فيريلوج جانبًا آخر لكونه لغة وظيفتها هي وصف الأجهزة بدلاً من اللغة الإجرائية العادية المتعارف عليها. كما انه يُعرف هذا باسم التخصيص «غير المحظور». لا يتم تسجيل الإجراء الخاص به إلا بعد تنفيذ الكتلة دائمًا. هذا يعني أن ترتيب التخصيصات غير ذي صلة وسوف ينتج نفس النتيجة: flop1 و flop2 سيتبادلان القيم كل ساعة على الدوام.

اما عن = فهو عامل التخصيص الآخر والذي يشار اليه على أنه تخصيص حجب. فإنه عند استخدامك لعامل التخصيص هذا = الإسناد، لأغراض المنطق، يتم تحديث المتغير الهدف على الفور. في المثال الذي رأيته سابقا، لو استخدمت العبارات = blocking بدلاً من <= ، لما تم تبديل flop1 و flop2. بدلاً من ذلك، كما هو الحال في البرمجة التقليدية، سيفهم المترجم ببساطة تعيين flop1 مساويًا لـ flop2 (وبالتالي يتجاهل المنطق الزائد لضبط flop2 مساويًا لـ flop1).

يتبع مثال دارة العداد:module Div20x (rst, clk, cet, cep, count, tc);
// TITLE 'Divide-by-20 Counter with enables'
// enable CEP is a clock enable only
// enable CET is a clock enable and
// enables the TC output
// a counter using the Verilog language

parameter size = 5;
parameter length = 20;

input rst; // These inputs/outputs represent
input clk; // connections to the module.
input cet;
input cep;

output [size-1:0] count;
output tc;

reg [size-1:0] count; // Signals assigned
           // within an always
           // (or initial)block
           // must be of type reg

wire tc; // Other signals are of type wire

// The always statement below is a parallel
// execution statement that
// executes any time the signals
// rst or clk transition from low to high

always @ (posedge clk or posedge rst)
 if (rst) // This causes reset of the cntr
  count <= {size{1'b0}};
 else
 if (cet && cep) // Enables both true
  begin
   if (count == length-1)
    count <= {size{1'b0}};
   else
    count <= count + 1'b1;
  end

// the value of tc is continuously assigned
// the value of the expression
assign tc = (cet && (count == length-1));

endmoduleمثال على التأخيرات:...
reg a, b, c, d;
wire e;
...
always @(b or e)
 begin
  a = b & e;
  b = a | b;
  #5 c = b;
  d = #6 c ^ e;
 endشرط دائما المذكوره في المثال الموضح اعلاه تشير إلى نوع آخر من طرق الاستخدام، أي أنه ينفذ أي من الكيانات في القائمة (ب أو ه) يتغير. عند أحد هذه التغييرات، يتم تعيينه على الفور قيمة جديدة، كما ان ذلك يرجع إلى التنازل حظر، ثم بعد ذلك يتم تعيين ب قيمة جديدة (مع الأخذ في الاعتبار قيمة جديدة ل).

بعد تأخير دام 5 وحدات الوقت، يتم تعيين ج قيمة ب وقيمة ج ^ ه هو مدسوس بعيدا في مخزن غير مرئية. اما الخطوة الاخير فهي: بعد 6 وحدات زمنية أخرى، يتم تعيين القيمة التي تم وضعها بعيدًا عن د.

هناك نقطه يجب التنويه عليها الا وهي انه يجب أن تكون الإشارات التي يتم دفعها من داخل عملية (كتلة أولية أو دائمًا) من النوع reg . أيضا يجب أن تكون الإشارات التي يتم دفعها من خارج العملية من النوع السلكي . الكلمة الأساسية reg لا تعني بالضرورة وجود سجل للأجهزة.

تعريف الثوابت 
ندعم تعريف الثوابت في لغة فيريلوج إضافة معلمة عرض. :

< العرض بالبايت > '< الحرف الأساسي > < رقم > ماسبق عرضه هنا هو الصيغة الاساسيه

أمثلة:

 12'h123 - سداسي عشري 123 (باستخدام 12 بايتًا)
 20'd44 - عشري 44 (باستخدام 20 بت - 0 تمديد تلقائي)
 4'b1010 - ثنائي 1010 (باستخدام 4 بايت)
 6'o77 - أوكتال 77 (باستخدام 6 بايت)

بنيات قابلة للتركيب 
لغه فيريلوج تعتبر على نطاق واسع أن HDL (لغة وصف الأجهزة). كما انه هناك العديد من العبارات في لغة فيريلوج والتي لا تحتوي على تناظرية في الأجهزة الحقيقية، ونأخذ على سبيل المثال $ display. وبالتالي فإنه لا يمكن استخدام الكثير من اللغات لوصف الأجهزة.

في واقع الامر فإنه هذا قد يبدو لك كـ تعريف لـ لغه فيريلوج الذي يكون بشكل عام يحتاج إلى إعادة توصيف بشكل صحيح. ومع ذلك، فإن الأمثلة المقدمة هنا هي المجموعة الفرعية الكلاسيكية (والمحدودة) للغة التي لها تعيين مباشر للبوابات الحقيقية.// Mux examples — Three ways to do the same thing.

// The first example uses continuous assignment
wire out;
assign out = sel ? a : b;

// the second example uses a procedure
// to accomplish the same thing.

reg out;
always @(a or b or sel)
 begin
  case(sel)
   1'b0: out = b;
   1'b1: out = a;
  endcase
 end

// Finally — you can use if/else in a
// procedural structure.
reg out;
always @(a or b or sel)
 if (sel)
  out = a;
 else
  out = b;الهيكل المثير للإهتمام الذي سوف اعرضه لك الآن هو مزلاج شفاف؛ سيمرر المدخلات إلى الخرج عندما يتم ضبط إشارة البوابة على «المرور عبر»، كما انه يلتقط المدخلات ويخزنها عند انتقال إشارة البوابة إلى «الانتظار». سيبقى الإخراج ثابتًا بغض النظر عن إشارة الإدخال أثناء ضبط البوابة على «تعليق». في المثال الذي تراه ادناه، سيكون مستوى «المرور» للبوابة عندما تكون قيمة جملة if صحيحة، أي البوابة = 1. تتم قراءة هذا «إذا كانت البوابة صحيحة، يتم تغذية الدين إلى latch_out بشكل مستمر.» ولكن احذر فإنه بمجرد أن تكون جملة if خاطئة، فإن القيمة الاخير ستبقى في latch_out ومستقلة عن قيمة din.// Transparent latch example

reg latch_out;
always @(gate or din)
 if(gate)
  latch_out = din; // Pass through state
  // Note that the else isn't required here. The variable
  // latch_out will follow the value of din while gate is
  // high. When gate goes low, latch_out will remain constant.flip-flop هو القالب المهم التالي؛ في لغة فيليوج، D-flop هو الأبسط في هذه اللغة، ويمكن تصميمه على النحو التالي:reg q;
always @(posedge clk)
 q <= d;إن الشي الذي يجب ملاحظته في هذا المثال المستخدم والذي يعد مهما أيضا هو استخدام تخصيص عدم الحظر. القاعدة الأساسية الأساسية هي استخدام <= عندما يكون هناك بيان posedge أو Negedge ضمن جملة Always.(دائما)

إن البديل من D-flop هو واحد مع مراعاه إعادة تعيين غير متزامن؛ هناك اصطلاح مايجدر معرفته فيه أن حالة إعادة التعيين ستكون أول عبارة في العبارة.reg q;
always @(posedge clk or posedge reset)
 if(reset)
  
 else
  q <= d;المتغير التالي يتضمن كلاً من الامرين التاليين:

إعادة تعيين غير متزامن وشرط مجموعة غير متزامن مرة أخرى

تدخل الاتفاقية حيز التنفيذ، وهذا المصطلح يعني إعادة التعيين يتبعه المصطلح المحدد.reg q;
always @(posedge clk or posedge reset or posedge set)
 if(reset)
  q <= 0;
 else
 if(set)
  q <= 1;
 else
  q <= d;ملاحظة: إذا تم استخدام هذا النموذج لنمذجة قالب تعيين / إعادة تعيين، فإن هذا قد ينتج عن ذلك أخطاء في المحاكاة ضع في اعتبارك تسلسل الاختبار التالي للأحداث التي سوف تجري .

اولا) إعادة التعيين إلى مستوى عالٍ

ثانيا) يرتفع مستوى clk

ثالثا) يرتفع مستوى clk

رابعا) يرتفع مستوى clk مرة أخرى

خامسا) يتم إعادة التعيين إلى مستوى منخفض متبوعًا بـ

سادسا) مجموعة منخفضة. لا تفترض أي إعداد وتعليق الانتهاكات.

في هذا المثال الذي اسلف ذكره، سيتم تنفيذ العبارة Always @ وهي بمعنى دائما أولاً عند حدوث الحافة الصاعدة لإعادة التعيين والتي ستضع q على القيمة 0.اما في المرة التالية التي يكون فيها تنفيذ الكتلة دائمًا هو الحافة الصاعدة لـ clk والتي ستحافظ مرة أخرى على q عند القيمة 0. يتم بعد ذلك تنفيذ الكتلة دائمًا عند ارتفاع الضبط والذي نظرًا لأن إعادة التعيين هي قوى عالية q للبقاء عند 0. في بعض الاحوال قد تكون هذه الحالة صحيحة وقد لا تكون أيضا ويعتمد هذا الامر كليا على التقليب الفعلي. ومع ذلك فإننا لا نعد هذا الامر المشكله الرئيسيه أو الاساسيه في هذا النموذج. لاحظ أنه عند انخفاض إعادة التعيين، تظل هذه المجموعة عالية. في تقليب حقيقي، سيؤدي هذا إلى انتقال الإخراج إلى 1. كما انه في الواقع في هذا النموذج لن يحدث ذلك لأن الكتلة دائمًا يتم تشغيلها عن طريق ارتفاع حواف المجموعة وإعادة التعيين - وليس المستويات. قد يكون من الامور الضروريه اتباع نهج مختلف لضبط / إعادة ضبط الوجه المتأرجح. [1]

المتغير الأساسي الأخير هو الذي ينفذ D-flop مع تغذية mux لمدخلاته. يحتوي mux على مدخلات d وردود الفعل من التقليب نفسه. هذا يسمح بوظيفة التحميل المسور. لذلك هذه هي طريقه تنفيذه // Basic structure with an EXPLICIT feedback path
always @(posedge clk)
 if(gate)
  q <= d;
 else
  q <= q; // explicit feedback path

// The more common structure ASSUMES the feedback is present
// This is a safe assumption since this is how the
// hardware compiler will interpret it. This structure
// looks much like a latch. The differences are the
// '''@(posedge clk)''' and the non-blocking '''<='''
//
always @(posedge clk)
 if(gate)
  q <= d; // the "else" mux is "implied"لاحظ معي أنه لا توجد كتل للكتابه «أولية» مذكورة في هذا الوصف. بل نلاحظ أن هنالك بين أدوات التوليف FPGA و ASIC في هذا الهيكل. وفي الواقع فإن ادوات FPGA تتيح الكتل الأولية حيث يتم إنشاء قيم reg بدلاً من استخدام إشارة «إعادة تعيين». لا تدعم أدوات تجميع ASIC مثل هذا البيان. والسبب وراء هذا الامر يعود إلى أن الحالة الأولية لـ FPGA هي شيء يتم تنزيله في جداول ذاكرة FPGA. ASIC وهو تطبيق فعلي للأجهزة.

مبدئي ودائم 
في الواقع يوجد هناك طريقتان منفصلتان للإعلان عن عملية فيريلوج. هذه هي الكلمات الرئيسية دائمًا والأولية (.Initial and always) تشير الكلمة الأساسية دائمًا إلى عملية التشغيل الحر. تشير الكلمة الأساسية الأولية إلى تنفيذ العملية لمرة واحدة بالضبط. يبدأ كلا البناءين التنفيذ في وقت المحاكاة 0، كما يتم تنفيذ كلاهما حتى نهاية الكتلة.اما بمجرد وصول الكتلة دائمًا إلى نهايتها، تتم إعادة جدولتها (مرة أخرى). ومن الجدير بالذكر انه من المفاهيم الخاطئة الشائعة: الاعتقاد بأن كتلة أولية سيتم تنفيذها قبل حظر دائمًا. في الواقع أرى أنه من الأفضل التفكير في الكتلة الأولية كحالة خاصة للكتلة دائمًا ، والتي تنتهي بعد إكتمالها لأول مرة.//Examples:
initial
 begin
  a = 1; // Assign a value to reg a at time 0
  #1; // Wait 1 time unit
  b = a; // Assign the value of reg a to reg b
 end

always @(a or b) // Any time a or b CHANGE, run the process
begin
 if (a)
  c = b;
 else
  d = ~b;
end // Done with this block, now return to the top (i.e. the @ event-control)

always @(posedge a)// Run whenever reg a has a low to high change
 a <= b;هذه هي الاستخدامات الكلاسيكية أو الاعتياديه لهاتين الكلمتين الرئيسيتين، ولكن هناك استخدامان إضافيان مهمان يجدر علي التطرق اليهما وذكرهما . الأكثر شيوعًا هو الكلمة الأساسية دائمًا بدون قائمة الحساسية @ (...). من الممكن استخدامها دائمًا كما هو موضح أدناه:always
 begin // Always begins executing at time 0 and NEVER stops
  clk = 0; // Set clk to 0
  #1; // Wait for 1 time unit
  clk = 1; // Set clk to 1
  #1; // Wait 1 time unit
 end // Keeps executing — so continue back at the top of the beginفي الواقع فإن عمل الكلمة الأساسية دائمًا بشكل مشابه لتكوين لغة C بينما (1) {..} بمعنى أنها ستنفذ إلى الأبد.

المثال أدناه مطابق وظيفيًا للمثال أعلاه دائمًا. alwaysinitial forever // Start at time 0 and repeat the begin/end forever
 begin
  clk = 0; // Set clk to 0
  #1; // Wait for 1 time unit
  clk = 1; // Set clk to 1
  #1; // Wait 1 time unit
 end

الانضمام 
يتم استخدام الانضمام بواسطة لغة فيريلوج لإنشاء عمليات متوازية. هل تعلم ان جميع العبارات (أو الكتل) تبدأ بين زوج مفترق / صلة بالتنفيذ في وقت واحد عند وصول تدفق التنفيذ إلى Fork . كما انه يستمر هذا التنفيذ بعد الانضمام عند اكتمال أطول بيان أو كتلة قيد التشغيل بين fork و Join .initial
 fork
  $write("A"); // Print char A
  $write("B"); // Print char B
  begin
   #1; // Wait 1 time unit
   $write("C"); // Print char C
  end
 joinبالطريقة التي تمت بها كتابة ما سبق، من الممكن طباعة التسلسلات "ABC" أو "BAC". يعتمد ترتيب المحاكاة بين أول $ write و $ write الثانية على تنفيذ المحاكي، وقد يتم اختياره عشوائيًا عن طريق المحاكي في لغة فيريلوج .كما ان هذا يسمح للمحاكاة باحتواء كل من ظروف السباق العرضي بالإضافة إلى السلوك المتعمد غير الحتمي في لغه فيريلوج

لاحظ أن VHDL لا يمكن أن تنتج عمليات متعددة ديناميكيًا مثل لغة فيريلوج.

شروط السباق 
كما انه لا يتم ضمان ترتيب التنفيذ دائمًا في لغة فيريلوج. يمكن توضيح ذلك بأفضل شكل من خلال مثال كلاسيكي والذي سوف نعرضه لكم ادناه: initial
 a = 0;

initial
 b = a;

initial
 begin
  #1;
  $display("Value a=%d Value of b=%d",a,b);
 endماهو الامر أو ما الذي سيتم طباعته لقيمتي أ وب؟ في واقع الأمر واعتمادًا على ترتيب تنفيذ الكتل الأولية، فإنه من الممكن أن يكون صفرًا وصفرًا، أو بالتناوب صفر وبعض القيم التعسفية غير المهيأة. سيتم تنفيذ عبارة $ display دائمًا بعد اكتمال مجموعتي التعيين، بسبب التأخير رقم 1.

العاملين 
ملاحظة: (لا تظهر عوامل التشغيل هذه بترتيب الأسبقية.)

المنطق الرباعي القيم 
في الواقع فإنه يحدد معيار IEEE 1364 منطقًا رباعي القيم بأربع حالات وهي كالتالي: 0، 1، Z (مقاومة عالية)، و X (قيمة منطقية غير معروفة). بالنسبة لـ VHDL المتنافس، يوجد معيار مخصص للمنطق وهذا المعيار متعدد القيم مثل IEEE 1164 مع تسعة مستويات.

مهام النظام 
تتوفر مهام النظام للتعامل مع الإدخال أو الإخراج البسيط ووظائف قياس التصميم المختلفة أثناء المحاكاة. تكون جميع مهام النظام مسبوقة بـ $ لتمييزها عن مهام ووظائف المستخدم. يقدم هذا القسم قائمة قصيرة بالمهام الأكثر استخدامًا. عموما فإنها ليست بأي حال من الأحوال قائمة شاملة ولا تعد كذلك .

 عرض - وهي تعني طباعة لشاشة سطر متبوعًا بسطر جديد تلقائي.
 $ write - طباعة لتصفية السطر بدون السطر الجديد.
 swrite $ - طباعة لتغيير سطر بدون السطر الجديد.
 $ sscanf - قراءة سلسلة محددة التنسيق من المتغير. (* فيريلوج 2001)
 $ fopen - فتح مقبض لملف (قراءة أو كتابة)
 $ fdisplay - طباعة سطر من ملف متبوعًا بسطر جديد تلقائي.
 $ fwrite - طباعة لتقديم سطر بدون السطر الجديد.
 $ fscanf - قراءة سلسلة محددة بالتنسيق من الملف. (* فيريلوج 2001)
 fclose $ - أغلق مقبض الملف المفتوح وحرره.
 readmemh $ - قراءة محتوى الملف السداسي في مجموعة ذاكرة.
 readmemb $ - قراءة محتوى الملف الثنائي في مصفوفة الذاكرة.
 شاشة $ - اطبع جميع المتغيرات المدرجة عند حدوث أي تغيير تلاحظه في القيمة.
 $ time - قيمة وقت المحاكاة الحالي.
 $ dumpfile - قم بتعريف اسم ملف إخراج التنسيق VCD (تفريغ تغيير القيمة).
 $ dumpvars - قم بتشغيل المتغيرات وتفريغها.
 $ dumpports - قم بتشغيل المتغيرات وتفريغها أو كتابتها بتنسيق Extended-VCD.
 عشوائي $ - إرجاع القيمة لقيمة عشوائية.

واجهة لغة البرنامج (PLI) 
يوفر PLI للمبرمج آلية لنقل التحكم من لغة فيريلوج إلى وظيفة برنامج مكتوبة بلغة C. تم إهماله رسميًا من قبل IEEE Std 1364-2005 لصالح أحدث واجهة إجرائية Verilog ، والتي تحل محل PLI تمامًا. وهاهي أهم المعلومات عنها:

يُمكِّن PLI (الآن VPI) لغة فيريلوج من التعاون مع البرامج الأخرى المكتوبة بلغة C مثل أدوات الاختبار ومحاكيات مجموعة التعليمات الخاصة بالمتحكم الدقيق والمصححات وغيرها على نفس السياق، على سبيل المثال، يوفر وظائف C tf_putlongp() و tf_getlongp() التي تُستخدم لكتابة وقراءة وسيطة مهمة أو وظيفة لغة فيريلوج الحالية، على التوالي.

برمجيات المحاكاة 
للحصول على معلومات حول المحاكاة في لغة فيريلوج، راجع قائمة محاكيات Verilog .

انظر أيضًا

مواد اضافية 

 قائمة محاكيات فيريلوج
 عارض الموجي
 واجهة البرمجة المباشرة SystemVerilog (DPI)
 واجهة إجرائية فيريلوج (VPI)

لغات مماثلة 

 VHDL
 SystemC - مكتبة C ++ توفر دلالات تستند إلى أحداث HDL
 النظام
 OpenVera
 (لغة التحقق)
 لغة مواصفات الخاصية
 Chisel ، لغة مفتوحة المصدر مبنية على قمة Scala

مولدات فيريلوج

مراجع 
 

 الملاحظات 
 
 
 
 
 
  Cornell ECE576 Course illustrating synthesis constructs
  (The HDL Testbench Bible)

الروابط خارجية

تطوير المعايير 
 IEEE Std 1364-2005 - المعيار الرسمي لـ Verilog 2005 (غير مجاني).
 IEEE P1364 - مجموعة العمل لـ Verilog (غير نشط).
 IEEE P1800 - مجموعة العمل الخاصة بـ SystemVerilog (يستبدل أعلاه).
 بناء جملة Verilog - وصف بناء الجملة في شكل Backus-Naur . هذا يسبق معيار IEEE-1364.
 Verilog-AMS - امتدادات إشارة Accellera المختلطة إلى Verilog

امتدادات اللغة 
 Verilog AUTOs - تعليق تعريف مفتوح المصدر يستخدمه IP الصناعي لتبسيط الحفاظ على كود Verilog.

لغات برمجة أنشئت في 1984
لغات برمجة مخصصة النطاق
لغات برمجة مهيكلة
لغات توصيف العتاد
معايير آي إي سي