ורילוג
מתוך ויקיפדיה, האנציקלופדיה החופשית
ורילוג או Verilog הינה שפת תכנות, המאפשרת תכנון של מעגלים חשמליים דיגיטליים, בצורה המזכירה קידוד בשפת C.
הצורך בשפה לתיאור החומרה התפתח עם המעבר לתכנון שבבים (צ'יפים) המכילים מאות אלפי טרנזיסטורים. תכנון בסדר גודל כזה נקרא: VLSI (ראשי תיבות: Very Large Scale Integration). בשלב הזה אי אפשר היה עוד להסתפק בתכנון המסורתי הסכמטי, ונוצר צורך אצל מתכנני המעגלים הדיגיטליים בשפה שתאפשר תכנון מהיר של מעגלים, על ידי תאור מעגלים מורכבים ברמה אבסטרקטית, במונחים של פונקציונליות וזרימת נתונים. השפות הקיימות בעת פיתוח השפה, כמו C ו־Pascal, לא איפשרו בנייה של מעגלים חשמליים בצורה נוחה, כיון שהן אינן מותאמות לתיאור של חומרה.
שפת הורילוג מותאמת לתיאור חומרה ומאפשרת כתיבה ברמות שונות של אבסטרקציה: מהרמה החשמלית (switch level) שהיא הקרובה ביותר לחומרה, דרך השערים הלוגים (gate level), רמת זרימת הנתונים (RTL) ועד לרמת האלגוריתם (behavioural) שהיא רמת האבסטרקציה הגבוהה ביותר המתארת את הפונקציונליות ודומה בצורת הקידוד לשפות כמו C.
ורילוג היא שפה קלה ללימוד ולשימוש, ונתמכת על ידי כלים רבים המשמשים בתהליך התכנון של השבב- כלי הסימולציה וכלי הסינתזה.
השפה התפתחה בשנת 1983.
קיימות שפות מתחרות לורילוג, בהן VHDL.
להלן דוגמה לקוד פשוט בשפת ורילוג, המתאר מימוש של "ממספר אוטומטי" (קאונטר):
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 connections to input clk; // 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 rst or posedge clk) begin if (rst) // This simulates a reset of the counter count <= 5'b0; else if (cet && cep) // This simulates the enables both being true begin if (count == length-1) begin count <= 5'b0; end else count <= count + 5'b1; // 5'b1 is 5 bits wide and end // equal to the value 1. end // the value of tc is continuously assigned the value of the expression assign tc = (cet && (count == length-1)); endmodule