ประวัติของ Verilog โดยย่อ

Hardware Description Language หมายถึง รูปแบบการเขียนข้อความ หรือ "ภาษา" ซึ่งสามารถกำหนด หรือบรรยาย โครงสร้าง ทางhardware (เช่น Digital System) 

US Department of Defend (กระทรวงกลาโหมของสหรัฐอเมริกา หรือเรียกย่อๆว่า DOD) ได้บังคับว่า  hardware ที่สร้าง ให้กับ DOD ต้องใช้ HDL ที่เรียกว่า VHDLในการอธิบายการออกแบบ โดย VHDL จะมีรูปแบบมาจากภาษาโปรแกรม ADA (ซึ่งเป็น ภาษาบังคับของDOD ในการเขียนโปรแกรม Software) ดังนั้นบริษัททั้งหลายที่ต้องการจะทำสัญญาออกแบบ hardware ให้กับ DOD จึงฝึกวิศวกรให้ใช้ VHDL

ในปีคศ. 1985 Phil Moorby จาก บริษัท Gateway Design Automation ได้สร้างโปรแกรมที่ช่วยในการออกแบบ digital hardware เรียกว่า Verilog-XL ขึ้น โดยผู้ออกแบบวงจรสารมารถอธิบายวงจรได้โดยใช้ HDL ซึ่งเรียกว่า Verilog ภายหลัง บริษัท Gateway Design Automation ได้กลายเป็นส่วนหนึ่งของ บริษัท Cadence Design System ในปีคศ. 1989 และ บริษัท Cadence ได้ยก Verilog HDL ให้เป็นของสาธารณะ (Public Domain) ทำให้มีผู้นำไปพัฒนาเพิ่มขึ้น และใช้กันอย่างแพร่หลาย จนในที่สุดได้มีการจัดตั้ง IEEE1364 มาตรฐานสำหรับ Verilog HDL ขึ้น และมีองค์กรที่ไม่หวังผลกำไรชื่อ Open Verilog International (OVI) ดูแลให้ Verilog HDL เป็นไปตามมาตรฐานนี้

ในปัจจุบัน จะมี "ภาษา" Verilog HDL เพียงหนึ่งเดียว แต่มีโปรแกรมที่ Simulate ภาษานี้มากมาย ในหลาย Platform ไม่ว่าจะเป็น Unix, PC (DOS & Windows) และ Macintosh  อาจกล่าวได้ว่า ในวงการ EDA (Electronic Design Automation) VerilogHDL เป็นเครื่องมือ ที่มีผู้ใช้มากที่สุด  (ส่วน VHDL นั้นเป็นที่นิยมในยุโรป )
สำหรับ PC มีโปรแกรม Verilog Simulatorอยู่มากมายเช่น VeriBest, Viper, SILOS, Veriwell โปรแกรมเหล่านี้มีความแตกต่างในเรื่องของความเร็วและ Feature ของการใช้งาน แต่จะใช้ Description ของ Verilog HDL เดียวกัน (แน่นอนอาจมีจุดต่างกันบ้างเช่นเดียวกับภาษา C แต่ละบริษัทอาจมี Lib. ต่างกัน)

การออกแบบวงจร และ HDL

HDL เป็นเครื่องมือที่ช่วยในการอกกแบบงวจร โดยผู้ออกแบบจะ "บรรยาย" โครงสร้าง (structure) หรือ การทำงาน (behavior) ของวงจร ด้วย HDL จากนั้นสามารถทดสอบการทำงานของวงจร (Simulate) โดยใส่ input ซึ่งสร้างโดย HDL เช่นกัน และตรวจสอบ output ซึ่งอาจเป็น timing diagram และ/หรือ Text จากนั้น Code ทีได้จาก HDL จะถูกเปลี่ยนให้เป็นวงจรที่ประกอบด้วย Logic device ขั้นตอนนี้เรียกว่า Synthesis ทดสอบการทำงานด้วยวงจรที่ได้จากการ synthesis แล้วนำไปส้รางเป็นวงจร hardware จริงซึ่งขั้นตอนการสร้างนี้ขึ้นอยูกับอุปกรณ์ (target technology) เช่น PAL PLA FPGA หรือ Silicon Waffer เป็นต้น


ขบวนการออกแบบวงจรด้วย HDL

"ภาษา" Verilog

ภาษา Verilog มีลักษณะคล้ายภาษา C ที่มีภาษา Pascal ปนเล็กน้อย การบรรยายวงจรทำได้ 2 แบบคือ
  1. Structural Model : กำหนดการเชื่อมต่อระหว่าง Primitive Element (Gates)
  2. Behavioral Model : กำหนดรูปแบบการทำงาน ความสัมพันธ์ ระหว่าง Input-Output

Structural Model

เป็นการเขียนบรรยายการเชื่อมต่อของ Gates ตามวงจรที่กำหนด
วงจรทางด้านซ้ายมือเป็นวงจรของ negative edge trigger D-flip flop ที่สร้างโดยใช้ NOR gate ต่อกันทั้งหมด 6 gates ในการเขียน Verilog แบบ Structure จะเป็นการบรรยายว่า input ของ NOR2 ต่อกับ output ของ NOR1 และ ต่อกับ input Clk ฯลฯ ดังตัวอย่าง Verilog code

// Negative Edge-Triggered D FF
module dff(Clk,D,Q,Qn);
input Clk,D;
output Q,Qn;
nor #1
N1(O1,O2,O4), N2(O2,O1,Clk),
N3(O3,O2,Clk,O4),
N4(O4,O3,D),
N5(Q,Qn,O2),
N6(Qn,Q,O3);
endmodule
จากตัวอย่าง Verilog code ข้างบน
  1. // ใช้กำหนด Line Comment เหมือนใน C++
  2. Verilog เป็น Case-Sensitive เหมือน C และ Java
  3. Verilog แบ่งออกเป็น module แต่ละ module คือวงจรย่อย วงจรอาจประกอบด้วย module หลาย module
  4. วงเล็บหลังชื่อ module เป็นการกำหนด port ของวงจร
  5. แต่ละ statement จบด้วย ;
  6. input Clk,D; เป็นการประกาศว่า Clk และ D เป็น input ของวงจร (module)
  7. output Q,Qn; เป็นการประกาศว่า Q และ Qn เป็น output ของวงจร (module)
  8. nor #1 เป็นการประกาศว่าใช้ NOR gate ที่มี gate delay 1 time unit โดยมี 6 gates คือ N1, N2,..N6
  9. N1(O1,O2,O4) คือ N1 เป็น NOR gate ที่มี gate delay 1 time unit (จากข้างบน)และ output ต่อกับ wire O1 input ต่อกับ wire O2 และ wire O4
  10. N2(O2,O1,Clk) คือ N2 เป็น NOR gate ที่มี gate delay 1 time unit (จากข้างบน)และ output ต่อกับ wire O2 input ต่อกับ wire O1 (output ของ N1) และ port Clk (Clock)
....ฯลฯ....

Behavioral Model

เป็นการเขียนการทำงานของวงจร โดยมีลักษณะเหมือนการเขียน software แต่ต้องจำไว้เสมอว่า HDL (Verilog หรือภาษาอื่น ก็ตาม) ไม่ใช่การเขียนsoftware เพื่อไปสร้าง hardare

 // Negative Edge-Triggered D FF
module Dff(Clk,D,Q,Qn);
input Clk,D;
output Q,Qn;
reg Q,Qn;
always @ (negedge Clk)
begin
#1 Q<=D;
#1 Qn<=~D;
end
endmodule

ตัวอย่างการออกแบบวงจร negative edge trigger D flip-flop และเป็นวงจรที่ ทำงานเช่นเดียวกับ วงจรข้างบน ดังนั้น port ต่างๆ ของวงจร (module) จึงเหมือนกัน
สังเกตุว่า Q และ Qn ถูกประกาศเป็น reg  ทั้งนี้เนื่องจาก Q และ Qn ไม่ใช่ ouput ของ gate แต่จะมีการกำหนด ค่าให้ Q และ Qn (จะอธิบายภายหลัง)
Code กำหนดการทำงานว่า ทุกครั้งที่มี negative edge ของสัญญาณ Clk เกิดขึ้นหลังจากนั้น 1 timeunit  "ค่า" ของQเปลี่ยนเป็นDและ "ค่า" ของ compliment ของ D
แต่ถ้าไม่มี negative edge ของสัญญาณ Clk เกิดขึ้น Q และ Qn ไม่เปลี่ยนแปลง
 
ใน module เดียวกันสามารถเขียน code ทั้งแบบstructure และ behavior ด้วยกันได้

Simulate VS Synthesis

Simulation คือการที่ทดสอบการทำงานของวงจรที่ออกแบบด้วย Verilog  ซึ่งทั้งสัญญาณ input และ clock สามารถเขียนด้วย Verilog 
simulation มีประโยชน์ในตรวจสอบการทำงานของวงจรโดยไม่ต้องสร้างวงจรจริง
Synthesis เป็นขั้นตอนที่เปลี่ยน Verilog code ให้เป็น hardware โดยทั่วไปจะแบ่งเป็น 2 ขั้นตอน โดยจะเปลี่ยนเป็น netlist ก่อน แล้วจาก netlist เปลี่ยนไปเป็น target technology
netlist จะเป็นรายการการเชื่อมต่อระหว่าง primitive gate ต่างๆ เมื่อได้ netlist มีโปรแกรมที่สามารถทดสอบการทำงานของ netlist นี้ได้ ซึ่งจะต่างกับการ simulate Verillog code เพราะในการ simulate Verilog code เป็นการทำงานตาม code ที่เขียน ทั้งแบบ structure และ behavior ส่วนการ simulate netlist เป็นการทดสอบการทำงานที่ใกล้เคียงกับ hardware
Verilog code แบบ structure เปลี่ยนเป็น netlist ได้ง่าย และดูเสมือนว่าการเปลี่ยน code แบบ behavior เป็น netlist อาจได้ วงจรที่ไม่มีประสิทธิภาพเทียบเท่ากับ netlist ที่ได้จาก code แบบ structure แต่โปรแกมที่ทำหน้าที่ Synthesis (หรือ เรียกว่า Synthesisor) มีความสามารถในการ optimize วงจรได้ดี บางครั้งทำได้ดีกว่าทำด้วยมือ
การที่ synthesisor ทำงานได้ดีหรือไม่ย่อมขึ้นกับ code ที่เขียน ถ้า code เขียนโดยมีการออกแบบ เขียนอย่างเป็นระเบียบ เป็นระบบ มีการแบ่งเป็น module ย่อย (hierarchical) และเขียนโดยมองถึง hardware ที่จะได้
ยังไม่มี synthesisor ใดที่สามารถ synthesis คำสั่งทั้งหมดของ Verilog ได้  ดังนั้น code ที่สามารถ simulate ได้อาจจะ synthesisไม่ได้ และการเขียน code ต้องคำนึงถึง hearware ที่จะได้ เพราะ codeที่ทำงานอย่างเดียวกันอาจสร้างเป็น hardware ได้ไม่เหมือนกัน เช่น
ในตัวอย่าง code ของ D flip-flop แบบ behavior ซึ่งมี output เป็น Q และ Qnทั้งคู่จะต้องเก็บค่าไว้ในระหว่างช่วงที่ ไม่มี clock เข้ามา  และ ต้องเป็นcompliment ของกันและกัน
   Q=D;
Qn=~D;
<== ทั้ง Q และ Qn ต้องเก็บค่าได้ ดังนั้นเวลาsynthesis จะได้ latch หรือ flip=flop สำหรับ Q และ Qn หมายความว่า ใช้ flip-flop2 อันเพื่อสร้าง D flip-flop 1 อัน


ตัวอย่างของ code ที่ simulate ได้ แต่ synthesis ไม่ได้

delay  เมื่อเขียน code ว่า   a= #10  b+c; หมายความว่า  adder มี propagationdelay = 10 timeunit  ซึ่งใช้เพื่อการ simulate แต่ในตอน synthesis ไม่สามารถสร้างวงจรให้มีdelayเป็น  10 ได้ 
delay ของ adder ที่จะถูกสร้าง ขึ้นอยู่กับ วงจร และ technology ที่ใช้
delay มีไว้เพื่อการ simulate เท่านั้น เพื่อดู timing ของการทำงาน      synthesisor ทั่วไปจะไม่สนใจ delayที่อยู่ใน code

       การหาร (/) เมื่อใช้การหารใน expressionตอน simulate ย่อมสามารถหาผลลัพธ์ได้   แต่ในการ synthesis วงจรหารไม่ใช่วงจรมาตรฐาน  synthesisor ส่วนใหญ่ไม่สามรถจะสร้างวงจรหารได้เอง  synthesisor บางอันสามารถทำการหารได้ถ้าเป็นก่รหารด้วยเลขยกกำลังของ 2 (2,4,8...) เนื่องจากจะไปใช้วงจร shift left แทน


หลังจากได้ netlist แล้วขั้นต่อไปของการสร้างวงจร คือนำ netlist มา impliment โดยใช้ target technology ที่ต้องการ เช่น PLA, PAL, FPGA เป็นต้น
ในวิชา 2110252 และ 2110262 จะทำถึงขั้น simulate เท่านั้น ขั้นตอน synthesis และ impliment จะทำใน 2110361 แต่การเขียน code ในวิชานี้ ต้องคำนึงถึงการ synthesis ด้วย