Verilog Thai
description
Transcript of Verilog Thai
Mahanakorn University of Technology 1
เรียนรูการออกแบบระบบดิจิตอล ดวยภาษา Verilog เบื้องตน
โดย… ธีรยศ เวียงทอง ภาควิชาอิเล็กทรอนิกส
มหาวิทยาลัยเทคโนโลยีมหานคร
Version 3.0 : Copyright © 2005
Mahanakorn University of Technology 2
คํานํา
ปจจุบันฮารดแวรที่สามารถโปรแกรมได หรือที่เรียกกันวา FPGA (Field Programmable Gate Array) มีความนิยมในการใชงานในการออกแบบระบบดิจิตอลสูงมากขึ้นเรื่อย ๆ เนื่องจากความงายในการออกแบบ และความรวดเร็วในการผลิตและสรางโดยที่สามารถกระทําไดโดยใชเครื่องคอมพิวเตอรมาตรฐานทั่วๆ ไป นอกจากนี้ส่ิงที่ทําใหแตกตางจากระบบฮารดแวรเดิม ๆ เชน ASIC (Application Specific IC) คือความสามารถในการโปรแกรม หรือใชงานไดหลาย ๆ ครั้ง โดยไมมีความเสียหาย หรือคาใชจายเพิ่มเติมเกิดขึ้น ซึ่งชฟิประเภท FPGA นี้ทําใหมีการเปล่ียนแปลงที่สําคัญของการออกแบบระบบดิจิตอลในปจจุบัน
ภาษาที่ใชในการออกแบบระบบดิจิตอลใน FPGA ซึ่งมีสองภาษาที่สําคัญคือ VHDL และ Verilog ซึ่งสวนใหญเทาที่ทราบมาสําหรับในเมืองไทยเองนั้น VHDL จะเปนที่นิยมใชในการออกแบบมากกวา Verilog ผูเขียนเองไดเรียนรูภาษา VHDL กอน แตตอมาไดมีโอกาสเรียนรู และออกแบบระบบโดยใชภาษา Verilog ซึ่งงาย และสะดวกกวาที่คิดไวอยางมาก เนื่องจากเปนภาษาที่คลายคลึงกับภาษา C และมีไวยากรณ หรือขอบังคับที่จุกจิกนอยกวาภาษา VHDL
ผูเขียนตั้งใจนําเสนอภาษา Verilog ในฉบับภาษาไทย โดยมีความตั้งใจมานานพอสมควร จนหาเวลาที่เหมาะสมได จึงมาเปน Verilog ฉบับยอเลมนี้ โดยอางอิงมาจาก Evita HDL ของ Aldec Inc. (สามารถดาวนโหลดไดที่ http://www.aldec.com/products/tutorials/) ซึ่งเหมาะสําหรับผูเริ่มตน สวนของรายละเอียดลึก ๆ ของภาษา Verilog คาดวาคงจะนําเสนอเปนหนังสือฉบับสมบูรณตอไป
ธีรยศ เวียงทอง 7 กันยายน 2548
Mahanakorn University of Technology 3
สารบัญ
บทที่ หนา 1. Why do we need Verilog? …………………………………………………………………. 4 2. A System in Verilog Representation………………………………………………………… 9 3. Signals………………………………………………………………………………………….. 16 4. A Structural View of a System……………………………………………………………… 23 5. Specification with Signal Transformations…………………………………………………. 32 6. The Behavioral Approach……………………………………………………………………. 41 Appendix Verilog Quick Reference………………………………………………………………………. 52
Mahanakorn University of Technology 4
CHAPTER 1 Why do we need Verilog?
ในบทนี้จะเริ่มตนดวยคําถามที่วา ทําไมถึงตองเรียนรู Verilog ซึ่งเปนคําถามแรกที่สําคัญ สําหรับผูที่ยัง
ไมเคยใชภาษาชั้นสูงในการออกแบบฮารดแวร หรือผูที่เคยใชภาษา VHDL มากอน ในบทนี้จะชวยใหผูอานในการตอบคําถามนี้ หลังจากนั้น จะพูดถึงวิธีการออกแบบโดยทั่วไปที่มีอยูสองวิธีไดแก การออกแบบลอจิกโดยใชสมการบูลีน (Boolean equation) และวิธีการที่นิยมใชคือการออกแบบดวย Schematic ในโปรแกรม CAD (Computer aided design) ซึ่งทั้งสองวิธกีารนี้ยังใชกันอยูในปจจุบัน แตมีขอเสียมากมายโดยเฉพาะความสามารถในการรองรับการออกแบบที่ซับซอนในปจจุบัน ซึ่งขอเสียบางอยางของการออกแบบโดยทั่วไปทั้งสองวิธีนี้สามารถขจัดไปไดดวยภาษาที่ใชอธิบายฮารดแวรระดับต่ํา (Low-level hardware description language)
เนื่องจากในปจจุบัน การออกแบบทางดิจิตอลฮารดแวร ประกอบดวยจํานวนของลอจิกเกตนับพัน ๆ ถึง แสน ๆ ตัว ผูออกแบบจําเปนตองมีเครื่องมือในการออกแบบที่สามารถรองรับความตองการนี้ได อยางมีประสิทธิภาพ มากกวาการออกแบบดวยสมการบูลีน หรือ Schematic เครื่องมือที่เราจะพูดถึงนี้ไดแกภาษาชั้นสูงที่ใชในการอธิบายการทํางานของฮารดแวร (High-level hardware description language) ซึ่งภาษาประเภทนี้ที่เปนที่นิยมใชกันอยางกวางขวางในการออกแบบดิจิตอลฮารดแวรคือ VHDL และ Verilog โดยจะมีการเปรียบเทียบใหเห็นจุดเดน และดอยระหวางภาษาทั้งสองในชวงทายของบทนี้
โลกของการออกแบบกอนหนา Verilog (The World Before Verilog) การออกแบบดวยสมการบูลีน (Designing with Boolean Equations)
คงเปนการยากสําหรับการออกแบบระบบดิจิตอลระบบหนึ่งโดยปราศจากความเขาใจถึงอุปกรณพ้ืนฐาน เชน เกต (Gate) หรือฟลิปฟลอป (Flip-flop) เพราะวงจรลอจิกโดยสวนใหญแลวจะสรางมาจากเกต และฟลิปฟลอป ซึ่งกําหนดไดจากสมการบูลีน มีหลาย ๆ เทคนิคที่ถูกออกแบบมาสําหรับการ Optimize การออกแบบ ประกอบดวยการลดรูปของสมการบูลีนโดยใช Karnough map (K-Map) สําหรับการใชทรัพยากรคือ เกต หรือฟลิปฟลอป ใหนอยที่สุด
การออกแบบดวยสมการบูลีนตองการสมการสําหรับการกําหนดการใชงานของแตละเกต ดังนั้นจึงทําใหไมสามารถใชงานไดจริงสําหรับระบบท่ีมีขนาดใหญ ที่ประกอบดวยจํานวนเกตเปนแสน ๆ ตัว ที่จะตองกําหนดมากจากสมการบูลีนหลาย ๆ พันสมการ แมในทางทฤษฎีแลว ทุก ๆ ระบบสามารแทนไดดวยสมการบูลีน แตอยางไรก็ตามมันไมสามารถนํามาใชในการออกแบบจริงของระบบดิจิตอลท่ีซับซอนในปจจุบัน
Mahanakorn University of Technology 5
การออกแบบดวย Schematic (Schematic-based Design) การออกแบบดวย Schematic ชวยในการขยายความสามารถในการออกแบบดวยสมการบูลีน เนื่องจาก
ไมใชมีแคเกต หรือฟลิปฟลอปท่ีเปนอุปกรณพ้ืนฐานเทานั้น แตยังมีวงจร หรือตัวไอซีที่อยูในไลบราลี (Library) ดวย นอกจากนั้น วิธีนี้ยังสามารถออกแบบระบบเปนลักษณะของลําดับชั้น (Hierarchy) ไดอีกดวย ซึ่งทําใหสามารถออกแบบระบบที่ซับซอนได และสามารถประหยัดเวลาในการออกแบบเนื่องจากสามารถมองเห็นเปนรูปรางของระบบที่ชัดเจน สามารถเรียกใชอุปกรณไดหลาย ๆ ครั้ง (Design reuse) และแชรการใชงานระหวางผูออกแบบโดยสรางเปนไลบรารีรวม (Shared library) ทําใหงายในการออกแบบเปนกลุม
หลายคนจะชอบลักษณะการออกแบบที่มองเห็นเปนภาพ (Graphical representation) โดยสามารถมองเห็นไดวาอุปกรณตัวไหน ตอกันอยางไร ซึ่งจากการออกแบบที่งายขึ้นในลักษณะ Schematic นั้นทําใหเปนที่นิยมกัน โดยในหลาย ๆ ปกอนหนานี้นั้น การออกแบบลักษณะนี้ถูกมองวาจะเปนวิธีการออกแบบที่ดีสําหรับระบบตาง ๆ จนกระทั่งเราตองการระบบที่ซับซอนที่มีจํานวนอุปกรณมากขึ้น อาจจะเปนหลาย ๆ พันตัว ซึ่งก็ทําใหเวลาในการออกแบบนั้นมากขึ้นเรื่อย ๆ เนื่องจากจะตองเสียเวลาในการเชื่อมตอแตละขาของอุปกรณ รวมทั้งยากในการตรวจสอบความถูกตอง และการแกไข ที่อาจเปนบริเวณใด บริเวณหนึ่งของวงจร Schematic ที่มีการเชื่อมตอกันอยางมากมาย ขอเสียของการออกแบบแบบเดิม (Drawback of Traditional Methods)
แมจะเปนลักษณะของออกแบบที่งาย ของการออกแบบระบบแบบเดิมที่ใชสมการบูลีน หรือใช Schematic แตมีขอเสียที่สําคัญคือ ระบบถกูกําหนดเปนการเชื่อมตอเปนโครงขายของอุปกรณพ้ืนฐานตาง ๆ เชน เกต ฟลิปฟลอป หรืออุปกรณในไลบรารี แตไมไดเปนการสรางจากวิธีการในการกําหนดความสามารถในการทํางานของระบบ (System specification) โดยตรง ดังนั้นผูออกแบบจําเปนตองมีพ้ืนฐานความรูพอสมควร ในการออกแบบเชน การออกแบบวงจรบวก ผูออกแบบก็จะตองรูต้ังแต Half-adder หรือ Full-adder วาจะตองใชการตอกันของ And/Or/Xor gate อยางไรบาง อีกทั้งความงายในการทําความเขาใจวาเปนวงจรที่ทํางานอะไรโดยผูออกแบบคนอื่น โดยดูจาก Schematic หรือสมการบูลีนนั้นคอนขางยาก
ขอเสียอีกอยางคือ ความสามารถในการรองรับการออกแบบระบบที่ซับซอน การจัดการกับสมการบูลีนแครอยสมการ ก็คอนขางยาก (แตสามารถทําได ถามีเวลาพอ) อยางไรก็ตามถาเพ่ิมเปนพัน หรือหมื่นสมการ ถือวาเปนเรื่องที่ยากมาก กลาวกันวาการออกแบบโดยใช Schematic นั้นสามารถรองรับระบบที่มีเพียงหกพันเกตเทานั้น ถาเกินกวานั้นจะทําใหระบบยากในการตรวจสอบ หรือทําความเขาใจ
จะเห็นไดวาในปจจุบัน ความกาวหนาทางดานวงจรรวม (Integrated circuit) ที่สามารถบรรจุเกต ไดเปนลาน ๆ ตัวในชิฟ เราตองการการออกแบบระบบที่ใหญ และซับซอน เพ่ือตอบสนองความตองการการใชงานชิฟในดานตาง ๆ ดังนั้นจึงจําเปนตองมีวิธีที่สามารถรองรับการออกแบบระบบดิจิตอลในลักษณะนี้ได
Mahanakorn University of Technology 6
ภาษาฮารดแวร (Hardware Description Language) ภาษาฮารดแวร คือภาษาชั้นสูงที่ใชในการอธิบายการทํางานของฮารดแวร โดยที่เราไมจําเปนตองแปลง
เปนสมการบูลีน หรือ Schematic ตัวอยางเชน ภาษา HDL สวนใหญสามารถสราง หรืออธิบาย Finite sate machine สําหรับวงจร Sequential logic ได หรอืสรางเปนตารางคาความจริง (Truth table) สําหรับวงจร Combinational logic ได
ภาษา HDL ใชเปนภาษาหลักในการออกแบบระบบในอุปกรณประเภท Programmable logic device (PLD) หรือ Complex PLD (CPLD) และ Field programmable gate array (FPGA) ซึ่งในปจจุบันมีภาษาลักษณะนี้ใชงานกันหลาย ๆ ตัว แตตัวที่เปนที่นิยม และรูจักกันไดแก Abel, Palasm, Cupl ที่ใชสําหรับการออกแบบวงจรที่ไมซับซอนนักใน PLD หรือ Verilog, VHDL สําหรับการออกแบบระบบที่ซับซอนในอุปกรณพวก CPLD หรือ FPGA การออกแบบในระดับตาง ๆ (Dealing with Different Design Levels)
เนื่องจากวงจรในปจจุบันเพ่ิมความซับซอนมากขึ้นเรื่อย ๆ ดังนั้นแนวโนมของความตองการในการออกแบบคือ ความสามารถในการเปลี่ยน หรือรองรับลักษณะของ Design entry ไดหลาย ๆ แบบ เชนสามารถออกแบบไดทั้งการใชภาษาชั้นสูงในการอธิบายระบบ หรือการใชสมการบูลีน หรือการใช Schematic
เราสามารถแบงระดับของการอธิบายระบบไดเปนชั้น จากชั้นลางสุดไดแก Silicon level ไปยังชั้นสูงสุดไดแก System level โดยที่แตละระดับสามารถแยกไดเปนการอธิบายในลักษณะของโครงสราง (Structure) หรือการทํางาน (Behavior)
การออกแบบในระดับลาง ๆ นั้นสามารถกําหนดรายละเอียด หรือคุณสมบัติของวงจรไดทุกขั้นตอน เริ่มต้ังแตขนาดของทรานซิสเตอร ที่จะนํามาสรางเปนเกต ทําใหเราไดวงจรตามที่กําหนดรอยเปอรเซนต แตทวาผูออกแบบจะตองใชเวลาในการออกแบบมาก รวมทั้งจําเปนตองมีประสบการณพอสมควร สวนการออกแบบในระดับสูง ๆ นั้นเราสามารถทําการออกแบบไดเร็ว จากการกําหนดการทํางานของระบบในระดับที่สูงขึ้นทําใหทําไดงายขึ้น หนาที่ของการสรางวงจรในระดับลางลงมาในแตละระดับนั้นตัวเครื่องมือจะเปนตัวรับผิดชอบเอง
Mahanakorn University of Technology 7
Verilog HDL: คําตอบสําหรับการออกแบบฮารดแวร การออกแบบดวยภาษาชั้นสูงอยาง Verilog สามารถครอบคลุมลักษณะของการออกแบบไดเกือบทั้งทุก
ระดับ ทั้งทางดานโครงสราง (Structure) หรือลักษณะการทํางาน (Behavior) ซึ่งถือวาเปนประโยชนสําหรับการเปลี่ยน หรือยาย (Transfer) การออกแบบไปยังระดับตาง ๆ ในแตละเฟสของการออกแบบ หรือการทําเอกสารประกอบในการออกแบบ เนื่องจากความเปนเอกภาพของการออกแบบนั่นเอง
อะไรคือ Verilog HDL (What is Verilog HDL?)
Verilog หรือชื่อเต็ม ๆ คือ Verilog HDL เปนภาษาที่ใชในการอธิบายลักษณะการทํางานของฮารดแวร (Hardware description language) ภาษาหนึ่งที่ถูกสรางขึ้นมาในชวง คศ 1984-1985 โดย Philip Moorby ที่ตองการภาษาที่งาย และมีประสิทธิภาพในการอธิบายลักษณะของวงจรดิจิตอล สําหรับการโมเดล การจําลองการทํางาน และการวิเคราะหการทํางาน ภาษานี้ไดกลายเปนลิขสิทธิ์ของบริษัท Design Gateway Automation ซึ่งตอมาไดรวมกับบริษัท Cadence Design Systems และต้ังแตป คศ 1990 เปนตนมา ทาง Cadence ไดเปดใหเปนภาษาที่ทุกคนสามารถใชงานได ทั้งนี้เพ่ือใหงายในการกําหนดมาตรฐาน และพัฒนารวมกนั และในท่ีสุด ภาษานี้ไดเขาเปนภาษามาตรฐานของ IEEE ในป คศ 1995 (IEEE Standard 1364)
คุณลักษณะที่สําคัญในภาษานี้ไดแก • Universal: ภาษา Verilog อนุญาตใหการออกแบบทั้งระบบทําไดภายใตสภาวะแวดลอมของ
การออกแบบ (Design environment) เดียวกัน ที่ประกอบดวย การวิเคราะห และการตรวจสอบ (Analysis and verification) อยางไรก็ตาม Verilog อาจไมเหมาะกับระดับของการออกแบบที่เปน Complex system design ที่ตองการภาษาชั้นสูงกวานี้ที่อาจตองการความสามารถในการอธิบายการทํางานไดทั้งซอฟทแวร และฮารดแวร
• Extensibility: มาตรฐาน IEEE std 1364 ประกอบดวย Verilog PLI (Programming Language Interface) ซึ่งชวยขยายความสามารถของภาษา Verilog โดยจะประกอบดวยวิธีการที่จะเพ่ิมเติมฟงกชันตาง ๆ ขึ้นมา หรือการติดตอกับภาษาอื่น เปนตน
• Industrial support: ภาษา Verilog ไดรับการตอนรับเปนอยางดีจากผูออกแบบวงจรประเภท ASIC (Application specific circuit) เนื่องจากเปนภาษาที่งายในการเรียนรู และชวยใหการจําลองการทํางาน หรือตรวจสอบระบบทําไดอยางรวดเร็ว จากขอมูลของนิตยสาร EE Times ไดพูดถึงเกี่ยวกับการใชงานภาษา Verilog ในการออกแบบ ASIC ในป 1993 นั้นมีถึง 85% ของการออกแบบทั้งหมด
Mahanakorn University of Technology 8
Verilog เปรียบเทียบกับ VHDL ผูออกแบบมือใหมหลาย ๆ คนมักตั้งคําถามกับตัวเองวา แลวภาษา HDL ภาษาไหนควรนํามาใชในการ
ออกแบบดี VHDL หรือ Verilog คําตอบก็คือทั้งสองภาษาตางมีขอไดเปรียบ เสียเปรียบ หรือยากงายตางกัน แลวแตความถนัด หรือความชอบของผูใชงาน ดังนั้นเมื่อเปรียบเทียบกันทั้งสองภาษา ถือวาไมมีผูชนะ
ความไดเปรียบของภาษา Verilog คือ ความงายในการทําความเขาใจ และใชงาน โครงสรางไวยากรณเหมือนภาษา C และไมจุกจิก ถือวามีความยืดหยุนในการเขียนมากกวา VHDL ดังนั้นจึงคอนขางเปนที่นิยมในการใชงานในการออกแบบทั่วไปในอุตสาหกรรมวงจรรวม โดยเฉพาะทางอเมริกา และญีปุน อยางไรก็ตาม ภาษา Verilog คอนขางจะดอยในดานความสามารถในการกําหนดการทํางานของระบบในระดับที่สูงขึ้น (System level specification)
สําหรับภาษา VHDL จะซับซอนกวา มีคุณสมบัติดานตาง ๆ (Feature) ที่เยอะกวา (ซึ่งบางทีไมจําเปนในงานการออกแบบโดยทั่วไป) จึงมีไวยากรณของภาษา หรือกฎตาง ๆ มากกวา ทําใหคอนขางยากในการเรียนรู และใชงาน แตขอดีคือมีความยืดหยุนในการใชงานสูง เนื่องจากสามารถใชในการเขียนออกแบบรูปแบบตาง ๆ มากมาย (Permissible coding styles) ดังนั้น VHDL จึงเหมาะสําหรับการออกแบบระบบที่ซับซอน ทําใหไดรับความนิยมมากจากนักออกแบบวงจรดิจิตอลโดยทั่วไป โดยเฉพาะแถบทางดานยุโรป
Verilog Vs
VHDL
Mahanakorn University of Technology 9
CHAPTER 2 A System and Verilog Representation
ภาษา Verilog ไดถูกพัฒนาขึ้นมาเพื่อใชในการอธิบายการทํางานของวงจรดิจิตอล ที่มีการทํางานพรอม
ๆ กันหลาย ๆ วงจรยอย เปนลักษณะแบบขนาน (Concurrency) และความตองการที่จะตองเปนภาษาที่สามารถใชในการจําลองการทํางานได โดยที่ภาษาชั้นสูงทั่วไปอยางเชน ภาษา C, Basic ไมสามารถนํามาใชงานในลักษณะนี้ได ในบทนี้จะแนะนําใหรูจักภาษา Verilog โดยจะพิจารณาถึงความสามารถในการอธิบายระบบดิจิตอลโดยทั่วไป
ในสวนแรก อธิบายถึงแนวคิดของการสรางระบบโดยใชภาษา Verilog ที่มองระบบเหมือนกับกลองดํา (Black box) อันหนึ่งที่มีสวนที่ตอเชื่อมกับภายนอกอยูรอบ ๆ ซึ่งตัวกลองดําอันนี้ใน Verilog เราเรียกวา โมดูล (Module) หลังจากนั้นจะพูดถึงสวนประกอบของ Verilog ที่อยูในโมดูล รวมท้ังวิธีการตั้งชื่อโมดูลที่ถูกตอง ทายสุดของบทนี้ จะบอกวิธีการกําหนดการทํางานของกลองดํานี้ ซึ่งมีอยูหลัก ๆ ดวยกันสามแบบไดแก Structural, Dataflow และ Behavioral โดยจะมีตัวอยางวิธีการกําหนดโดยทั่วไปของการอธบิายระบบโดยใชวิธีการทั้งสามแบบนี้
สวนประกอบของระบบ (The Anatomy of a System)
ระบบ วงจร และโมดูล (System, Circuit and Module)
ภาษา HDL ถูกใชในการอธิบายลักษณะของวงจร หรือระบบอิเล็กทรอนิกส ซึ่งโดยทั่วไปแลวระบบ (System) จะถูกอางอิงในภาษา HDL เหลานี้ในลักษณะเปน Entity โดยที่สวนประกอบของระบบนั้น ไดแกวงจร (Circuit) ตาง ๆ ที่ทํางานสอดคลองกัน ใหไดเปนผลลัพธอยางที่ผูออกแบบตองการ แตอยางไรก็ตามทั้งความหมายของวงจร หรือระบบน้ันสามารถนํามาใชแทนกันได แลวแตการมองของผูออกแบบแตละคน
ขอกาํหนดของระบบ (System specification) นั้นจะตองสามารถอธิบายองคประกอบ (Elements) ตาง ๆ ในระบบ และความเกี่ยวของระหวางกันใหได สําหรับ Verilog เองนั้น ระบบจะถูกกําหนดไดดวยคําส่ัง module และจบดวย endmodule ดังแสดงในรูป
Mahanakorn University of Technology 10
เมื่อไรก็ตามที่ระบบทํางาน ระบบจะรับอินพุทขอมูลเขามา และสรางเอาทพุทตามฟงกชันที่ถูกกําหนดขึ้นมาในระบบนั้น ๆ หรือมองอีกนัยหนึ่งก็คือ ระบบทําการติดตอ (Interface) กับส่ิงตาง ๆ รอบตัวมันผานทางพอรตอินพุท และพอรตเอาทพุท ถาปราศจากการอินเทอรเฟส ระบบก็จะไมสามารถทํางานได ลองคิดดูงาย ๆ วาถาเรามีคอมพิวเตอรโดยปราศจากเมาส หรือคบีอรด (ซึ่งถือวาเปนอินพุทของระบบ) และมอนิเตอร (เอาทพุทของระบบ) นั้นจะเปนอยางไร
ในระบบตาง ๆ นั้นเราสามารถแยกไดเปนสองสวนหลัก ๆ คือ Body และ Interface หนาที่ของ Body คือทําการประมวลผลขอมูลที่รับเขาไป และสงออกมา ผานทางสวนของการ Interface นอกจากนี้ระบบบางระบบอาจมีสวนเพ่ิมเติม หรือที่เรียกวา Add-on ที่จะมาใชงานควบคูกับระบบท่ีมีอยู ซึ่งถาเทียบกับเครื่องคอมพิวเตอรเครื่องหนึ่งแลว สวนของ Body คือ Main board นั่นเอง สวนของ Interface คือ เมาส และคียบอรด และในสวนของ Add-on อาจจะเปน Sound card หรือ Video card เปนตน
Interface และ Body ในโมดูล Verilog (Interface and Body in Verilog Module)
เนื่องจาก module ใน Verilog ใชแทนระบบดิจิตอล ดังนั้น module จะตองสามารถแทนสวนประกอบของระบบได นั่นคือ Body และ Interface
พอรตของโมดูลจะถูกกําหนดไวในวงเล็บ หลังจากขื่อของโมดูล โดยสวนนี้จะทําหนาที่เปน Interface ของระบบ โดยที่รายละเอียดตาง ๆ ของแตละพอรต (Direction and type) เชน เปนอินพุท หรือเอาทพุทพอรต ขนาดกี่บิต จะถูกกําหนดขางลางตอมา หลังจากวงเล็บปด (ดูรูป) คําส่ัง 'include เสมือนกับ Add-on ของระบบที่จะเรียกไฟลอ่ืนมาใชงาน หลังจากนั้นจะเปนสวนของ Body ที่จะกําหนดการทํางาน หรือเรียกใชโมดูลยอยที่มีอยูแลวมาใชงานในระบบ ซึ่งมีวิธีการกําหนดการทํางานแตกตางกันสามแบบคือ Structural, Dataflow หรือ Behavioral ดังจะแสดงใหดูตอไป
โครงสรางของโมดูล Module (The Structure of a Module) คําจํากัดความของโมดูล (The Definition of a Module)
สําหรับโมดูล ใน Verilog หมายถึง บล็อกพ้ืนฐานที่สรางขึ้นมาสําหรับการกําหนดคุณสมบัติของระบบ ทั้ง
ระบบเล็ก ๆ ที่เปนเกตเพียงตัวเดียว หรือระบบใหญ ที่ประกอบดวยโมดูลยอย ๆ หลาย ๆ โมดูล อยางไรก็ตามไมวาระบบเล็ก หรือใหญ ที่อธิบายดวยโมดูลนั้น จะตองมีโครงสรางเหมือนกัน
ทุก ๆ โมดลู จะตองเริ่มตนดวยคําสงวน (Reserve words) คือ module ตามดวยชื่อของโมดูล และจบดวยคําสงวน endmodule (สังเกตวา ไมมีชองวางระหวาคําวา end กับคําวา module) ภายในตัวโมดูลจะประกอบดวยสามสวนดังที่กลาวมาแลวขางตน คือ
Mahanakorn University of Technology 11
• Interface: ประกอบดวยพอรต และการกําหนดตัวพารามิเตอรของโมดูล
• Body: จะเปนการกําหนดการทํางานของตัวโมดูล
• Optional add-on: สามารถกําหนดไดทุกที่ในโมดูล เพ่ือเรียกใชสวนประกอบอื่น ๆ ที่เขียนไวแลวเปนไฟล มาใชเพ่ิมเติม โดยใชคําส่ัง 'include
ชื่อของโมดูล (The Name of a Module)
หลักของการตั้งชื่อโมดูลคือ กระทัดรัด และมีความหมายที่สามารถเขาใจไดงาย ที่เปนการอธิบายวาโมดูลตัวนั้นทําหนาที่อะไร เนื่องจากขอกําหนดของภาษา Verilog จะเปนภาษาที่คํานึงถึงขนาดตัวอักษรที่ใชงาน (Case sensitive) ซึ่งไมเหมือนกับ VHDL ที่ตัวอักษรเล็กใหญสามารถใชแทนกันได ดังนั้นเราสามารถใชลักษณะตัวอักษรเล็กใหญสลับกันเพ่ือใหอานไดงายขึ้น ตัวอยางเชน FastBinaryCntr เปนตน (สังเกตวาคําสงวนใน Verilog จะใชตัวเล็กเทานั้น)
โดยสรุป มีขอกําหนดในภาษา Verilog ในการตั้งชื่อโมดูลดังนี้ • ประกอบดวย ตัวอักษรภาษาอังกฤษ (Letter) ตัวเลข (Digit) เครื่องหมาย $ (Dollar sign) และ
_ (Underscore) เทานั้น • ตองเริ่มตนดวยตัวอักษร หรือ Underscore เทานั้น • ไมสามารถเวนวางระหวางตัวอักษร
หรือเครื่องหมายได • ตัวอักษรเล็ก ใหญมีความหมาย
ตางกัน (Case sensitive) • ตองไมเปนคําสงวน
การเขียนขอสังเกตุ หรือหมายเหตุใน Verilog (Comments in Verilog)
วิธีการเขียนโคด (Coding style) ที่ดีนั้นจําเปนจะตองคํานึงถึงผูอานในการทําความเขาใจสวนตาง ๆ ของการเขียนดวย หรือแมกระทั่งตัวผูออกแบบเองในการที่จะกลับมาตรวจสอบ แกไขสวนตาง ๆ ในภายหลัง ดังนั้นลักษณะการเขียนที่ดีนอกจากจะตองเขียนใหอานงาย เปนสัดสวนแลวควรจะตองมีคําอธิบายสั้น ๆ ในแตละสวนของโปรแกรมดวย
สําหรับภาษา Verilog นั้นจะอนุญาตใหเขียนหมายเหตุในตัวโปรแกรม โดยที่ตัวคอมไพเลอรจะไมนําไปประมวลผลแตอยางใด นั้นคือ
• One-line comment: เริ่มตนดวย // และจบดวยการจบบรรทัด (end-of-line) • Block comment: จะเริ่มตนดวย /* จนกระทั่งถึงจุดที่มีเครื่องหมาย */ ทําใหสามารถกําหนด
หมายเหตุไดครอบคลุมหลาย ๆ บรรทัดเทาที่ตองการ
Mahanakorn University of Technology 12
การกําหนดขอสังเกตุ หรือหมายเหตุนั้นสามารถกําหนดที่ใดก็ไดในตัวโปรแกรม ยกเวนกําหนดภายในคําสงวน หรือชื่อของส่ิงตาง ๆ ที่เราตั้งขึ้นมา เชนชื่อของพอรต โมดูล เปนตน
รายละเอียดของระบบ (Descriptions of a System)
การเริ่มตนการเขียนออกแบบที่ดีนั้นควรจะมีสวนหัวของไฟลในการอธิบายลักษณะของระบบ (System description) เพ่ือใหงายในการตรวจสอบ ทั้งจากผูออกแบบเอง หรือผูรวมงานอ่ืน ๆ รวมท้ังผูใชงานดวย ทั้งนี้ขอมูลตาง ๆ อาจประกอบดวยสวนตาง ๆ เชน ชื่อไฟล ลักษณะของการใชงาน ขอจํากัด ขอผิดพลาดที่เกิดขึ้นแลวไดแกไขในเวอรชั่นกอน ชื่อของผูออกแบบ เวอรชันในการออกแบบ และวันที่ของการออกแบบ เปนตน ดังแสดงในรูป
สวน Interface ในโมดูล (The Module Interface) ในการที่จะกําหนดสวนของการ Interface ในตัวโมดูล จะตองประกอบดวยสองสวนดังนี้
• Port list: เปนรายชื่อของพอรตที่จะใชในตัวโมดูล ซึ่งกําหนดอยูในวงเล็บหลังจากชื่อของโมดูล โดยมีเครื่องหมาย Comma (,) ระหวางพอรตตาง ๆ
• Port declaration: เปนสวนที่กําหนดขึ้นมาเพื่ออธิบายคุณลักษณะของพอรตตาง ๆ ที่อยูใน Port list โดยจะเปนขอมูลของทิศทางวาเปนอินพุท หรือเอาทพุท หรือทั้งสอง และความกวางของพอรต เปนตน
Mahanakorn University of Technology 13
สําหรับชื่อของพอรตควรตั้งในเหมาะสม เพ่ือใหงายในการอานทําความเขาใจ หรืออาจจะเพิ่ม Comment ตามหลังแตละพอรตโดยใช One-line comment (//) ก็ได ดังแสดงในรูป
การเขียนในสวนของ Body (The Body of a Module) เนื่องจากความหลากหลายของวงจรที่เราตองการออกแบบ ทั้งในดานการทํางาน และในดานโครงสราง
การออกแบบ ซึ่งบางทีในวงจรชนิดเดียวกันสามารถออกแบบไดหลายวิธีเปนตน ดังนั้นภาษาที่ดีควรจะสนับสนุนลักษณะการออกแบบ หรือลักษณะการเขียนอธิบายวงจร (Coding style) ไดหลายแบบ ทั้งแบบที่เหมาะสมสําหรับวงจรเล็ก ๆ ไมกี่เกต แตบางทีวิธีการนี้อาจไมเหมาะสมกับวงจรใหญ ๆ ที่มีหลายพันเกตเนื่องจากทําความเขาใจไดยาก
สําหรับภาษา Verilog HDL สามารถมีวิธีการเขียนในการอธิบายวงจร แบงไดเปน 3 ลักษณะตามความตองการในวงจรแตละระดับ (Hierarchy) หรือความถนัดที่แตกตางกันของผูออกแบบ ไดแก
• Structural design: เปนการใชอุปกรณที่มีอยูแลวในไลบรารีมาตรฐาน หรือที่เรียกวา Primitives และโมดูลยอย ๆ มาตอกันโครงสราง (Structure) แบบพอรตตอพอรต เพ่ือใหเปนระบบขึ้นมา
• Dataflow style: เปนการสงผานคาเอาทพุทที่ขึ้นอยูกับคาของอินพุท หลังจากผานตัวกระทํา หรือฟงกชันตาง ๆ โดยสามารถเห็นเปนการไหลของขอมูล (Data flow) วาคาในแตละจุดในวงจรนั้นมาจากไหน
• Behavioral style: เปนการเขียนลักษณะการทํางาน (Behavior) ของวงจรไดโดยตรง ตัวอยางเชน เราตองการออกแบบ Multiplexer ที่มี 4 inputs (In0, In1, In2, In3) และ 1 output (Out) โดยมีสัญญาณควบคุมการเลือกคือ Sel0 และ Sel1 นั้นสามารถแสดงเปนการออกแบบในแตละสไตลไดดังตอไปนี้
Mahanakorn University of Technology 14
MUX in structural design style
จะเห็นไดวาวงจรสามารถกําหนดไดโดยอุปกรณพ้ืนฐานตาง ๆ นั่นคือ And Or Not เกต ซึ่งเปนอุปกรณประเภท Primitive ในภาษา Verilog ที่สามารถเรียกใชงานไดทันที หรือเปนโมดูลยอยที่เราสรางขึ้นมาแลวเก็บไวในไลบรารี เราสามารถกําหนดการตอเชื่อมกันระหวางพอรตของอุปกรณพ้ืนฐาน หรือโมดูลยอยนั้น ๆ ซึ่งผูออกแบบก็จําเปนจะตองรูวา MUX นั้นจะตองมีการตอเชื่อมกันของอุปกรณตาง ๆ อยางไร
MUX in dataflow design style
การออกแบบลักษณะนี้จะเหมือนกับการออกแบบโดยสมการลอจิก (แตวาไมจํากัดเพียงแคลอจิก ‘0’ หรือ ‘1’ เทานั้น) ขอกําหนดตาง ๆ ในวงจรจะสรางมาจากการสมการการกําหนด (Assign) อินพุทไปยังเอาทพุทผานฟงกชันตาง ๆ ที่อาจเปนตัวกระทําทางลอจิก (Logical operator) หรือตัวกระทําทางคณิตศาสตร (Mathematical operator) ตาง ๆ เปนตนแทนที่จะเปนการตอกันของอุปกรณตาง ๆ ทําใหวิธีการนี้งายในการดู ทําความเขาใจ
Mahanakorn University of Technology 15
MUX in behavioral design style
การออกแบบจะเปนการอธิบายการทํางานของ MUX มากกวาวาจะทํางานไดอยางไรในการที่จะสงผานอินพุทไปยัง เอาทพุท จากเงื่อนไขตัวเลือก Sel0 Sel1 โดยใชคําส่ัง Case เปนตน ซึ่งการออกแบบลักษณะนี้ไมจําเปนตองรูถึงโครงสรางวงจร ทําใหงาย และยืดหยุนมาก แตตองรูวิธีการอธิบายการทํางานวงจร การอธิบายจําเปนตองขึ้นอยูกับไวยกรณ และคําส่ังของภาษาชั้นสูงที่ใช ดังนั้นจึงจําเปนตองมีเครื่องมือในการสังเคราะหวงจร (Synthesis tools) ในการแปล และสรางวงจรขึ้นมา
Mahanakorn University of Technology 16
CHAPTER 3 Signals in Verilog
ทุกอยางในวงจรอิเล็กทรอนิกส สามารถมองไดเปนลักษณะของการรับ การแปลง และการสงสัญญาณทางไฟฟา (Receiving, transforming, and sending signals) จงึไมแปลกใจวาสัญญาณเปนส่ิงที่สําคัญในระบบอิเล็กทรอนิกส ดังนั้นในบทนี้จะพูดถึงเรื่องสัญญาณเปนสําคัญ และวิธีการที่เราจะเรียกใชในภาษา Verilog โดยจะเริ่มแนะนําใหรูจักกับนิยาม และลักษณะตาง ๆ ของสัญญาณ รวมทั้งหนาที่ของสัญญาณที่มีอยูในวงจรดิจิตอล
ลําดับตอมาจะเปนเรื่องของขอกําหนดตาง ๆ ในการกําหนดสัญญาณในภาษา Verilog ซึ่งโดยทั่วไปแลวสัญญาณจะมีอยูสองลักษณะคือ nets และ registers แตในบทนี้จะพูดถึง nets เทานั้น เนื่องจาก registers จะตองเกี่ยวของกับการอธิบายวงจรแบบ Behavioral ซึ่งอยูในบทตอไป
จากที่กลาวมาในเบื้องตนถึงลักษณะของโมดูลวา สามารถแบงออกเปนสองสวนหลัก ๆ คือ Body และ Interface ดังนั้นลักษณะของสัญญาณก็เชนกันสามารถแบงไดเปน Internal ที่ใชในสวนของ Body และ External ที่ใชในสวนของ Interface ที่เปนการกําหนดการทํางานของพอรต เกริ่นนํา (Introduction to Signals) แนวคิดเกี่ยวกับสัญญาณ (Concept of Signals)
ส่ิงหนึ่งที่เปนปรากฎการณสําคัญในโลกเราก็คือ การติดตอส่ือสาร ซึ่งทําใหเราสามารถแชรขอมูลระหวางกัน ซึ่งเปนกระบวนการในการแลกเปลี่ยน มีการเกี่ยวของกับการสงขอมูลจากผูสงไปยังปลายทางที่เปนผูรับ และถึงแมวาจะมีวิธีการหลาย ๆ วิธีการในการรับสงขอมูลนี้ แตมีส่ิงหนึ่งที่รวมกันคือ สัญญาณ หรือ Signals
สัญญาณสามารถมไีดหลาย ๆ รูปแบบ เชน อยูในรูปของแสง (Optical) เสียง (vocal) ทางกล (mechanical) หรือทางไฟฟา (Electrical) เปนตน แตไมวาจะอยูในรูปใดก็ตาม สัญญาณจะเปนตัวที่มีขอมูลบรรจุอยูเสมอ
สัญญาณในอุปกรณอิเล็กทรอนิกส (Signals in Electronic Device) การติดตอส่ือสารไมไดจํากัดเฉพาะสิ่งมีชีวิตเทานั้น เครื่องจักร หรือเครื่องมือตาง ๆ ก็สามารถทําได
เชนกัน ตัวอยางเชน ตัววัดอุณหภูมิ (Temperature sensor) อาจบอกวงจรควบคุมเมื่อมีอุณหภูมิเกินระดับที่กําหนดไว ใหวงจรควบคุมทําการสั่งแอรใหทํางาน เปนตน
Mahanakorn University of Technology 17
สัญญาณท่ีสงผานระหวางอุปกรณ หรือเครื่องมือตาง ๆ สามารถมีอยูไดหลาย ๆ แบบแตตราบใดที่เกี่ยวของกับวงจรไฟฟา ดังนั้นทุกสัญญาณจากสภาวะแวดลอมภายนอกจําเปนจะตองถูกแปลงเปนสัญญาณทางไฟฟา (Electrical signals) เพ่ือที่จะนําไปใชงาน หรือประมวลผลดวยตัวอุปกรณทางไฟฟาได
ความสําคัญของสัญญาณทางไฟฟา (The Importance of Electrical Signals)
สัญญาณทางไฟฟาเปนส่ิงสําคัญในการทํางานในวงจร หรืออุปกรณอิเล็กทรอนิกส ซึ่งความจริงแลวถาปราศจากสัญญาณไฟฟา อุปกรณตาง ๆ เหลานั้นไมสามารถถูกเรียกไดวาเปนอุปกรณอิเล็กทรอนิกสไดนั่นเอง
ถาพิจารณาทางกายภาพ สัญญาณทางไฟฟาคือการไหลของอิเล็กตรอน และโปรตรอน ซึ่งเปนการมองในทางฟสิกสนั่นเอง แตทางภาษาชั้นสูงอยาง Verilog เราไมจําเปนตองไปกังวลถึง เพียงแตทําการกําหนดหนาที่การทํางานของวงจร โดยคํานึงถึงคา หรือความหมายของสัญญาณทางไฟฟาที่จะเกิดขึ้นเทานั้นเอง โดยจะมีตัวสังเคราะหวงจร (Synthesis tools) ที่ทําการสรางวงจรขึ้นมาใหรับ และสรางสัญญาณไฟฟาตามที่เราตองการ
จากนี้ไปสัญญาณไฟฟาจะถูกเรียกสั้น ๆ วาสัญญาณ ซึ่งไหลไปตามเสนทางที่ตอเชื่อมกันระหวางอุปกรณอิเล็กทรอนิกส หรือโมดูลตาง ๆ ตามลักษณะของทิศทางที่ถูกกําหนดขึ้นมาโดยชนิดของพอรตที่ตัวอุปกรณ ซึ่งอาจเปน อินพุท เอาทพุทพอรต หรือพอรตที่เปนไดทั้งอินพุท/เอาทพุท
คาท่ีเปนไปไดของสัญญาณ (Available Values of Signals) คาของสัญญาณที่เปนไปไดในภาษา Verilog มีเพียงแค 4 คาตามลักษณะของสัญญาณ และความเปนไป
ไดจริง ๆ ในวงจรอิเล็กทรอนิกส ซึ่งไดแก ‘0’, ‘1’, ‘X’, ‘Z’ โดยที่ • ‘0’ คือคาลอจิกศูนย (Logic zero) หรือลอจิกต่ํา
(Logic low) หรือคาที่ไมจริง (False condition) จากการเปรียบเทียบ
• ‘1’ คือคาลอจิกหนึ่ง (Logic one) หรือลอจิกสูง (Logic high) หรือคาที่เปนจริง (True condition) จากการเปรียบเทียบ
• ‘x’ หรือ ‘X’ เปนลอจิกไมทราบคา (Logic unknown) ที่อาจเกิดจากการไมลงรอยกัน (Conflict) ของสัญญาณที่จุด ๆ นั้นที่อาจเปนไปไดทั้ง ‘0’ ‘1’ ‘Z’
• ‘z’ หรือ ‘Z’ เปนลอจิกที่เกิดจากการเปดวงจร (Open circuit) ทําใหเกิดสภาวะ High impedance ณ จุดนั้น ๆ
Mahanakorn University of Technology 18
สังเกตุไดวา ถึงแมภาษา Verilog จะเปน Case sensitive แตสําหรับสภาวะ unknown หรือ high impedance สามารถใชไดทั้งตัวเล็ก และตัวใหญ การกระทําทางลอจิกสําหรับคาของสัญญาณตาง ๆ (Logic Operations on Four-value Signals)
วงจรทางดิจิตอลที่ซับซอนเพียงใด เราสามารถแบงแยกยอยออกมาเปนลอจิกเกตตาง ๆ (สามารถกําหนดไดเปนสมการบูลีน) และเราใชตารางคาความจริง (Truth table) สําหรับแสดงความสัมพันธกันระหวางอินพุท และเอาทพุท โดยท่ีสัญญาณทั้งอินพุท และเอาทพุทสามารถเปนไปไดทั้ง 4 คาทางสัญญาณไฟฟานั้นคือ ‘0’ ‘1’ ‘X’ ‘Z’
ตัวอยางของตารางคาความจริงของ AND และ OR เกต แสดงไดดังรูป
สัญญาณในภาษา Verilog (Signals in Verilog) ประเภทของสัญญาณ (Class of Signals)
แตละสัญญาณในภาษา Verilog สามารถจัดใหอยูในสองประเภทของสัญญาณ คือ nets และ registers • Nets แทนการเชื่อมตอระหวางสวนตาง ๆ ของวงจร มันไมสามารถเก็บ (Storage) คาของ
สัญญาณไวได และคาที่ปรากฎบน nets กําหนดไดโดยตัวขับ (Driver) หรือแหลงจาย (Source) ดังนั้นเมื่อตัดแหลงจายออกไปจาก nets ก็จะเกิดสภาวะ High impedance ‘Z’ (ไมไดตอกับแหลงจายใด ๆ ) เกิดขึ้นที่ nets
• Registers ตางกับ nets คือสามารถเก็บคาของสัญญาณได โดยยังคงคาเดิมเมื่อไมไดตอกับแหลงขับ คาที่ถูกกําหนดกอนหนานี้ สามารถถูกแทนไดดวยสัญญาณใหมที่เพ่ิงเขามา ดังนั้นสัญญาณประเภท registers ก็คลายกับรีจีสเตอร หรือฟลิปฟลอป (Flip-flop) ที่ใชงานในวงจรดิจิตอลทั่วไป แตตางกันตรงที่ไมจําเปนตองใชสัญญาณนาฬิกา (Clock) ในการเก็บคา
Nets
ในภาษา Verilog สัญญาณที่จัดอยูในประเภท nets ประกอบดวย • wire และ tri : เปน nets ที่ใชกันมากที่สุด ชื่อที่ตางกันนี้ใชตาม
ลักษณะการใชงานนั่นคือ wire ควรจะในจุดที่มีตัวขับตัวเดียว (Single drive nets) สวน tri ควรใชสําหรับจุดที่มีหลาย ๆ ตัวขับ
• wand/triand และ wor/trior : เปน nets ที่มีการกระทําทางลอจิก And หรือ Or ตามลําดับ
• supply0, supply1, tri0, tri1, trireg : เปน nets ที่มีลักษณะการใชงานพิเศษสําหรับการออกแบบในระดับลาง (Low level) เชน ทรานซิสเตอร
Mahanakorn University of Technology 19
ตารางคาความจริงของ Nets แตละชนิดสามารถแสดงเปนตารางคาความจริงไดดังนื้
การกําหนดสัญญาณ (Signal Specification) กอนที่จะทําการใชประเภทของสัญญาณในภาษา Verilog เราจําเปนตองมีการกําหนด (Declaration)
ชนิด และชื่อกอน ในที่นี้จะพูดถึงการกําหนดสัญญาณประเภท internal ที่อยูในสวนของ body ของโมดูลเทานั้น สวนสัญญาณประเภท external ที่อยูในสวนของการเชื่อมตอ (Interface) จะพูดถึงในสวนตอไป
กฎ หรือไวยกรณของการกําหนดการใชสัญญาณสามารถทําไดโดยงายคือ บอกชนิดของสัญญาณกอนวาเปน wire, tri, wand,…แลวตามดวยชื่อ โดยอาจใสพรอม ๆ กันหลาย ๆ ชื่อไดโดยใสเครื่องหมาย , (comma) กั้นระหวางชื่อ เชน wire a, b, c, d; เปนตน
ส่ิงที่สะดวกอยางหนึ่งของภาษา Verilog ก็คือเราสามารถกําหนดการใชสัญญาณไดทุกที่ บรรทัดใดก็ได ในสวนของ body แตตองกําหนดไวกอนการใชงาน
สัญญาณสเกลลาร และเวกเตอร (Scalar Signals and Vectors)
ถึงตอนนี้เราไดพูดถึงเฉพาะสัญญาณที่มีเสนเดียว หรือบิตเดียว ที่เราอาจเรียกวา Scalar signal ซึ่งมคีาสัญญาณทางลอจิกคาเดียว ณ เวลาใดเวลาหนึ่ง ตัวอยางเชน สัญญาณนาฬิกาที่ใชเปนจังหวะ (Synchronize) ของการทํางานในระบบดิจิตอล
หลาย ๆ ระบบจําเปนตองมีกลุมของสัญญาณหลาย ๆ เสนที่เรียกวา บัส หรือเวกเตอร (Buses or vectors) ซึ่งจะทําการรับสงขอมูลที่ประกอบดวยคาทางลอจิกที่อยูในแตละเสนหลาย ๆ คา ตัวอยางที่มักจะเห็นกันเปนประจําก็คือ ระบบไมโครโปรเซสเซอร เมื่อไดยินถึง 32-bit microprocessor นั่นหมายถึงวา บัสขอมูลมีขนาด 32 bit หรือ 32 เสน แตละบิตในบัสสามารถเขาถึงไดทั้งการอาน และการเขียน โดยการใชตัวชี้ (Index) เชน data[31:0], address[31:0]
การกําหนดการใชงานแบบเวกเตอร (Vector Specification)
ในการกําหนดการใชงานแบบเวกเตอร เราไมจําเปนตองมีชนิดของสัญญาณขึ้นมาใหมสําหรับเวกเตอร แทจริงแลว สัญญาณสเกลลารนั้นอาจถือไดวาเปนกรณีเฉพาะของสัญญาณแบบเวกเตอรที่มีเสนเดียวโดยท่ีบิตสําคัญมากสุด MSB (Most significant bit) กับบิตสําคัญนอยสุด LSB (Least significant bit) นั้นอยูในตําแหนงเดียวกัน
เมื่อสัญญาณแบบเวกเตอรประกอบดวยหลาย ๆ บิต ซึ่งในแตละบิตจะตองสามารถเขาถึงไดโดยการอาศัยตัวชี้ (Index) สําหรับภาษา Verilog นั้นเราสามารถกําหนดตัวเลขชี้บิต (Indexing number) ที่ใชไดทั้ง
Mahanakorn University of Technology 20
เลขลบ และเลขบวก กําหนดลงใน [ ] โดยที่ตัวเลขชี้บิตจะมีอยูสองตัวสําหรับการกําหนดชวงโดยจะถูกคั่นดวยเครื่องหมาย : (Colon) สําหรับตัวเลขดานซายจะเปน MSB และตัวเลขดานขวาคือ LSB ตัวอยางเชน wire [0:5] Bus1; wire [5:0] Bus2; wire [5:-5] Address; เปนตน
สัญญาณภายนอก (External Signals)
สัญญาณ Internal เทียบกับ External (Internal vs External Signals)
สัญญาณท่ีพูดถึงกอนหนาที่อยูในประเภท Internal ที่ใชภายในโมดูลในสวนของ Body และไมสามารถเขาถึง (Accessible) ไดจากภายนอกโมดูลถาปราศจากสัญญาณ External ที่อยูในสวนของการ Interface
ดังนั้นความแตกตางระหวางสัญญาณ Internal และ External คือ สัญญาณ Internal จะใชภายในตัวโมดูลสําหรับการรับสงขอมูลตาง ๆ สวนสัญญาณ External จะเปนตัวที่ติดตอกับอุปกรณตาง ๆ ที่อยูภายนอกโมดูล โดยจะกําหนดเปนพอรตของโมดูล (Module port) นั่นเอง สําหรับการรับขอมูลอินพุทเขามา หรือสงขอมูลเอาทพุทออกไป
พอรตของโมดูล (Module Ports)
โมดูลสามารถสื่อสารระหวางภายใน และภายนอกผานทางพอรต ในการกําหนดการใชงานพอรตนั้นจะตองกําหนดความกวางของพอรต และทิศทางของขอมูลที่จะผานพอรต (เขาหรือออก เทียบกับตัวโมดูลนั้น ๆ )
ในภาษา Verilog เราสามารถกําหนดทิศทางของพอรตไดเปน • input: ขอมูลจะถูกอานโดยโมดูลจากภายนอกผานทาง input ports เราไมสามารถเขียนขอมูล
จากภายในโมดูลไปยังพอรตชนิดนี้ได • output: ขอมูลจะถูกสงไปยังภายนอกโมดูลผานทาง output ports เราไมสามารถอานขอมูลเขา
มายังภายในโมดูลผานทางพอรตชนิดนี้ได • inout: ขอมูลสามารถถูกอาน และเขียนผานทางพอรตชนิดนี้ได ดังนั้นจึงถูกเรียกวา bi-
directional ports
Mahanakorn University of Technology 21
สําหรับตัวอยางในรูปจะแสดงการ
กําหนดการใชงาน Bi-directional port สําหรับเปนพอรตขอมูลระหวาง Processor กับ Memory โดยที่ขอมูลสามารถไปกลับไดสองทิศทาง คือจากซายไปขวา หรือจากขวาไปซาย
การกําหนดการใชงานพอรต (The Specification of Ports)
การกําหนดการใชงานพอรตในภาษา Verilog ประกอบดวยสองสวนดังนี้ • ชื่อของพอรตที่ถูกเรียงอยูในสวนที่เรียกวา Port list ที่ตามหลังชื่อของโมดูล รายชื่อของพอรต
ตาง ๆ จะอยูในวงเล็บ โดยถูกคั่นดวยเครื่องหมาย , (comma) • หลังจากสวนของ Port list จะตองตามดวย Port declaration ที่เปนตัวกําหนดทิศทางของพอรต
รวมท้ังขนาดของพอรตแตละพอรต การกําหนดการใชงานในสวนนี้จะคลายกับการกําหนดการใชงานของ Internal signals โดยมีไวยกรณดังนี้
Keyword vector_range identifier; โดยที่ keyword คือ input, output หรือ inout
ตัวอยางในรูปแสดงการกําหนดการใชงาน
พอรตในโมดูล Processor และโมดูล Memory ซึ่งเราจะเห็นสวนของ Port list ตามดวย Port declaration เชนในกรณีของ Processor ที่มีพอรตตาง ๆ คือ Clock, Reset, Read_Write, Data และ Address กําหนดไวใน Port list ภายในวงเล็บที่อยูหลังชื่อโมดูล บรรทัดหลาย ๆ บรรทัดตอมาจะเปนสวนของ Port declaration ที่เปนกําหนดทิศทาง และขนาดของสัญญาณ กอนที่จะนําไปใชงานตอไป
Port list
Port declaration
Mahanakorn University of Technology 22
การสรางรีจิสเตอรท่ีเอาทพุท (Registered Outputs) ในการออกแบบระบบใหญ ๆ ที่ดีนั้น เรามักจะกําหนดใหคาเอาทพุทของแตละโมดูลมีการเก็บคาไวดวย
รีจิสเตอร ทั้งนี้เพ่ือใหงายในการเชื่อมตอ และไดคาที่เสถียรกอนที่จะนําไปใชงาน หรือเปนอินพุทของโมดูลอื่น ๆ เนื่องจากเราทราบวาถาเอาทพุทตอโดยตรงกับสัญญาณประเภท Nets เชน wire นั้นจะมีสภาวะเปน High impedance เมื่อไมมีตัวขับ หรือแหลงจายตออยู ซึ่งสภาวะนี้ไมเปนที่ตองการในการใชงาน
วิธีการที่จะทําใหเปนเอาทพุทแบบรีจีสเตอร สามารถทําไดงาย ๆ โดยกําหนด Internal signals แบบ reg (Register) และใหสัญญาณเปนชื่อเดียวกันกับเอาทพุทพอรต ดังตัวอยาง
Mahanakorn University of Technology 23
CHAPTER 4 A Structural View of a System
หลังจากที่ทราบถึงการกําหนดการใชงานของสัญญาณที่เปนทั้ง External และ Internal แลว ในบทนี้จะ
เปนการแนะนําใหรูจักการเขียนในสวนที่เปน Body และวิธีการสรางระบบที่ซับซอนจากสวนประกอบยอย ๆ ที่อาจเปนโมดูล หรืออุปกรณพ้ืนฐาน (Primitive) ตาง ๆ ทั้งที่เปนมาตรฐานที่สามารถเรียกใชไดเลย เชน ลอจิกเกตตาง ๆ หรือที่เราสรางขึ้นมาเองที่เรียกวา UDP (User defined primitive) โดยในการเชื่อมตอนั้นจะใช nets เปนตวัเชื่อมตอ
อุปกรณพื้นฐานใน Verilog (Verilog Primitives) วิธีการกําหนดออกแบบโครงสรางเบื้องตน (Introduction to Structural Specifications)
เราสามารถมองไดวา ทุก ๆ ระบบประกอบดวยโมดูลหลาย ๆ โมดูล ที่ถูกเชื่อมตอกันสําหรับการติดตอส่ือสารระหวางกัน ในแตละโมดูลนี้ สามารถมีโมดูลยอย ๆ ภายในตัวมันเองที่ตอเชื่อมกัน ลักษณะการออกแบบระบบแบบนี้เราเรียกวา Hierarchy หรือลําดับชั้นนั่นเอง
การออกแบบระบบโดยดูจากโครงสรางนั้น มีลักษณะคลายกับการมองระบบในทางกายภาพที่ประกอบดวยสวนตาง ๆ และสวนตาง ๆ เหลานั้นก็สามารถแยกยอยลงไปอีก ดังตัวอยางในรูปของระบบคอมพิวเตอรที่ประกอบดวยสวนตาง ๆ เชน การด และในตัวการดเองก็ประกอบดวย IC โดยที่ใน IC ก็มีเกตอยูภายใน รวมทั้งฟลิปฟลอป และในตัวฟลิปฟลอบเองก็มีเกตตอกันอยู ซึ่งถามองลึกลงไปอีกถึงชั้นลางสุด เกตก็จะประกอบดวยตัวทรานซิสเตอรตอกัน
สําหรับในตัวภาษา Verilog นั้น เราสามารถออกแบบเปนลักษณะโครงสรางได จากระดับลางที่เปนตัว
ทรานซิสเตอร จนกระทั่งเปนโมดูลยอย ๆ รวมกันเปนโมดูลหลัก และประกอบกันขึ้นมาเปนระบบที่ซับซอนไดในที่สุด
เนื่องจากลอจิกเกต เปนอุปกรณพ้ืนฐานที่สุด และจําเปนที่สุดที่ประกอบกันเปนวงจรดิจิตอลขึ้นมา และใน Verilog เองก็มีอยูในไลบรารี Primitive ซึ่งสามารถเรียกใชไดทันที ดังนั้นเราจะมาทําความรูจักกับอุปกรณพ้ืนฐานเหลานี้ และวิธีการเรียกใชงานดวยภาษา Verilog กอน
Mahanakorn University of Technology 24
เกตพื้นฐานท่ีสรางไวแลว (Predefined Gate Primitives) ใน Verilog เราสามารถเรียกใชเกตพื้นฐานท่ีมีอยูแลวได 14 ชนิดดวยกัน ทั้งหมดนี้เราสามารถแบงออก
ไดเปน 4 กลุมดวยกันคือ • Multiple-input gates ประกอบดวย 6 ลอจิกเกตดวยกันคือ and, nand, or, nor, xor, และ
xnor แตละตัวนั้นเปนตัวกระทําทางลอจิก โดยสามารถกําหนดอินพุทไดมากเทาไรก็ได โดยแตละตัวมีการทํางานสําหรับสองอินพุทตามตารางคาความจริงดงัตอไปนี้
โดยมีตัวอยางการใชงานดังนี้
สังเกตวา พอรตแรกจะเปนเอาทพุทพอรต ตามดวยแตละอินพุทพอรตตามจํานวนที่ตองการ
Mahanakorn University of Technology 25
• Multiple-output gates ไดแก buf และ not โดยที่สามารถมีไดหลาย ๆ เอาทพุท จากหนึ่ง
อินพุท ตัวอยางเชน
• Tri-state gates ไดแก bufif0, bufif1, notif0, notif1 ใชแทนบัฟเฟอรแบบสามสถานะ (Tri-state buffer) ไดแก ‘0’, ‘1’, และ ‘Z’ โดยมีสัญญาณควบคุมการปดเปดเกต เกตชนิดนี้มีหนึ่งอินพุท หนึ่งเอาทพุท และหน่ึงสัญญาณควบคุม ตัวอยางเชน
• Pull gates สามารถหาขอมูลไดจากขอมูลอางอิงในภาษา Verilog
การออกแบบโดยใชอุปกรณพื้นฐาน (Design with Primitives) สําหรับการออกแบบประเภทนี้ อันดับแรกเรา
จําเปนตองกําหนดชื่อของเกต (Gate instance declaration) และการเชื่อมตอของสัญญาณที่ขาของเกต (Interconnection signal declaration)
การกําหนดการใชงานเกตนั้นจะตองกําหนดชื่อ (Primitive name) และรายการของสัญญาณที่ขาตาง ๆ (Signal list) อีกอยางคืออุปกรณพ้ืนฐานแตละตัวสามารถมีขอมูลเพ่ิมเติมตาง ๆ ขึ้นมา เชน เกตดีเลย (Propagation delay) ความแรงของการขับ (Drive strength) จํานวนของอุปกรณที่ตอเรียงกันแบบอารเรย เปนตน
ตัวอยางของการสรางวงจร 1-bit full adder จากเกตพื้นฐานตาง ๆ แสดงไดดังนี้ โดยที่คาดีเลย ของ
Mahanakorn University of Technology 26
แตละตัวสามารถกําหนดไดเปนตัวเลขหลังเคร่ืองหมาย # และในวงจรประกอบดวย XOR 2 ตัว ⎯ ที่มีชื่อ (Instance name) เปน HalfSum และ FullSum ⎯ AND 3 ตัว และ OR 1 ตัว เชื่อมตอกันดวย wire (internal nets) คือ AxorB, AandB, AandCin และ BandCin ตามจุดตาง ๆ ในวงจร
การวางลําดับของตัวอุปกรณ (The Order of Instances)
ในวงจรที่ใชงานจริงนั้น เราจะเห็นไดวาเกตแตละตัวสามารถทํางานไดพรอม ๆ กัน นั่นคือถามีการเปล่ียนแปลงที่สัญญาณอินพุทเมื่อไหร คาของเกตตัวนั้น ๆ ก็จะมีการปรับปรุงตามอินพุทที่เขามาในขณะนั้น โดยไมจําเปนตองรอ
ในการเขียนอธิบายวงจรเปนภาษา แนนอนวาจําเปนตองเขียนเปนบรรทัดเรียงลําดับจากบนลงลาง โดยที่เราไมสามารถเขียนไดพรอม ๆ กัน ดังนั้นส่ิงที่จะทําไดคือการกําหนดใหคอมไพลเลอร หรือตัวจําลองการทํางาน สามารถมองใหเปนลักษณะของการทํางานแบบขนาน ซึ่งเหมือนกันการทํางานจริง โดยไมจําเปนวาอุปกรณตัวไหนจะอยูในบรรทัดกอน หรือหลัง ดังนั้นถึงแมวาเราจะสลับตําแหนงกัน แตการทํางานก็ยังจะเหมือนเดิม
อุปกรณพื้นฐานที่กําหนดโดยผูออกแบบ (User-defined Primitives: UDP) ถึงแมวาเราจะมีเกตพื้นฐานท่ีถูกกําหนดไวแลว และสามารถใชงานไดทันที (Predefined primitives) แต
อาจไมเพียงพอกับการออกแบบที่ตองการอุปกรณหลาย ๆ ประเภท นอกเหนือจาก 14 ลอจิกเกตพื้นฐาน ดังนั้นภาษา Verilog จึงอนุญาตใหผูออกแบบสามารถกําหนดอุปกรณพ้ืนฐานของตัวเองได (User-defined Primitives: UDP) โดยสามารถกําหนดฟงกชันการทํางานไดตามที่ตองการ สามารถทําไดทั้ง Combinational logic หรือ Sequential logic
UDP กับ Module สามารถเรียกใชไดเหมือนกัน ทั้งลักษณะของโครงสรางวิธีการเขียน (ดูรูป) และการเรียกใชงาน แต UDP สามารถมีไดแคหนึ่งเอาทพุทเทานั้น ไมสามารถมีอินพุท หรือเอาทพุทเปนแบบ
Mahanakorn University of Technology 27
เวกเตอรได และตองกําหนดการใชงานเปนตารางคาความจริง โดยมีรูปแบบที่แตกตางกันระหวางตารางคาความจริงของอุปกรณประเภท Combinational และ Sequential ดังตัวอยางของการสราง MUX2to1 และ T-Flip-flop ขางลาง
UDP Structure
สําหรับโครงสรางจะประกอบดวย primitive UDP_name ซึ่งเปนสวนที่กําหนดชื่อของ Primitive ตามดวย (port list) ซึ่งจะเหมือนกับการกําหนดการใชงานในโมดูล แตพอรตแรกจําเปนตองเปนเอาทพุทพอรต และพอรตตอ ๆ ไปเปนอินพุท โดยท่ีแตละพอรตไมสามารถมีสัญญาณไดมากกวา หนึ่ง หรือไมสามารถเปนเวกเตอรได ตอมาคือ port declaration ซึ่งกําหนด
ทิศทางของพอรตวาเปนเขา หรือออกเทานั้น ไมมี bidirectional port เหมือนกับโมดูล และเราสามารถกําหนดคาเริ่มตนของสัญญาณไดที่สวนของ UDP initialization มีเฉพาะวงจร Sequential logic โดยเริ่มตนดวยคําสงวนคือ initial แลวใชเครื่องหมายเทากับทําการกําหนดสัญญาณเริ่มตนที่เอาทพุท สวนของ truth- or state table เปนการกําหนดลักษณะการทํางานของตัว Primitive นั้น ๆ เริ่มตนดวยคําสงวน table และจบดวย endtable ซึ่งแสดงคาที่อาจเปนไปไดทั้งหมดของอินพุท และคาที่เอาทพุทที่จะเกิดขึ้น โดยลําดับของอินพุทจะเรียงตามที่กําหนดใน (port list) สวนทายสุดเปนการจบดวยคําวา endprimitive UDP: Mux2to1
เปนการสราง Multiplexer ที่มี 2 inputs ไดแก In0 และ In1 สวน output คือ Out โดยมีตัวเลือกคือ Sel สวนการกําหนดการทํางานจะอยูในตารางคาความจริงโดยที่สัญลักษณ ‘?’ หมายถึงเปนคาอะไรก็ได อาจเปน ‘0’, ‘1’, ‘x’, หรือ ‘z’ สังเกตุวาจะไมมีการกาํหนดคาเริ่มตน (Initial values) เนื่องจากเปน Combinational logic
Mahanakorn University of Technology 28
UDP: TFF ตัวอยางการสราง Primitive ที่เปน Sequential logic นี้จะเห็นไดวามีการกําหนดคาเริ่มตนของเอาทพุท Q = 0; ในตารางที่เปน state table จะประกอบดวยสามคอลัมนดวยกันคือ Input, Present state และ Next state ที่เอาทพุท คาของเหตุการณที่เกิดขึ้นขอบขาขึ้น (Rising edge) หรือขอบขาลง (Falling edge) สามารถเขียนไดส้ัน ๆ คือ ‘r’ และ ‘f’ ตามลําดับ สวน ‘-‘ หมายถึงการไมมีการเปล่ียนแปลงของคาแตอยางใด
การใชงาน UDPs (Using UDPs) การใชงาน UDPs สามารถใชไดเหมือนกับ Predefined primitive หรืออุปกรณพ้ืนฐานท่ีกําหนดไวแลวใน
ไลบรารี ส่ิงที่ตองกระทําเพ่ิมขึ้นมาคือ ตองสรางตัวอุปกรณนั้นกอน แลวทําการประกาศ (Declare) กอนใชงาน
เนื่องจาก UDP อยูในระดับเดียวกันกับโมดูล เราจึงไมสามารถสราง UDP ไดในตัวโมดูล ดังนั้นเราจะตองเขียนแยกไวกอน หรือหลังตัวโมดูลที่ตองการเรียก UDP มาใชงานโดยสามารถอยูในไฟลเดียวกันได หรือเแยกเขียนเปนไฟลสําหรับ UDP ตางหาก แลวใชคําส่ัง 'include สําหรับการนําไฟลนั้นมาใชงาน
UDP เปนการกําหนดการใชงานของอุปกรณพ้ืนฐานเทานั้น ซึ่งยังมีขอจํากัดตาง ๆ มากมาย เชนเราไมสามารถสรางตัวอุปกรณที่มีหลายเอาทพุท หรือที่มีอินพุท เอาทพุทเปนแบบเวกเตอรได ซึ่งเปนขอจํากัดที่สําคัญ แตขอจํากัดตาง ๆ เหลานี้สามารถหลีกเล่ียงไดโดยการกําหนดเปนโมดูลยอยแทน
Mahanakorn University of Technology 29
โมดูลใน Verilog (Module in Verilog) การเรียกใชงานโมดูล (Module Instantiation)
การออกแบบแบบลําดับชั้น (Hierarchical design) ไมจําเปนตองใชแคอุปกรณพ้ืนฐานท่ัวไป (Primitives) เทานั้น เรายังสามารถเรียกใชโมดูลที่เราออกแบบไวแลวมาประกอบกันเปนวงจร หรือระบบขนาดใหญที่ซับซอน วิธีการนี้ทําใหเราสามารถตรวจสอบ คนหา และทําความเขาใจไดงาย มากกวาการออกแบบโดยใหทุกอยางอยูในระดับเดียวกัน หรืออยูในโมดูล ๆ เดียว (Flattened design)
การเรียกใชงานโมดูลใน Verilog มีวิธีการเหมือนกับการเรียกใชอุปกรณพ้ืนฐานตาง ๆ โดยที่ไมจําเปนตองใชการเรียนรูเพ่ิมเติม นอกจากนี้การใชโมดูลยอย ในการออกแบบ จะมีความยืดหยุนในการออกแบบมากกวาอุปกรณพ้ืนฐาน เนื่องจากสามารถมีหลายอินพุท หลายเอาทพุท เปนตน อีกอยางคือ โมดูลสามารถเรียกใชอุปกรณพ้ืนฐานได แตในทางกลับกันอุปกรณพ้ืนฐานไมสามารถเรียกใชโมดูลได ดังนั้นการออกแบบโดยใชโมดูล ที่ประกอบดัวยโมดูลยอย จึงสามารถทําการออกแบบเปนลําดับชั้นไดโดยงาย และสะดวกกวา
ขอจํากัดที่สําคัญอยางหนึ่งในการใชงานโมดูลคือ เราไมสามารถออกแบบโมดูลภายในโมดูลใด ๆ ได ดังนั้นเราจะตองเขียนแยกไวกอน หรือหลังตัวโมดูลที่จะเรียกมาใชงาน โดยสามารถอยูในไฟลเดียวกันได หรือเแยกเขียนเปนไฟลสําหรับโมดูลตางหาก แลวใชคําส่ัง 'include สําหรับการนําโมดูลนั้นมาใชงาน ดังเชนตัวอยางในรูป เปนการเรียกใชโมดูล Square ในโมดูล MyDesign โดยที่โมดูล Square นั้นถูกเขียนแยกไวขางลาง
หลักการตอเชื่อมพอรต (Port Connection Rules) สวนนี้จะอธิบายการเชื่อตอพอรตระหวางโมดูล กับส่ิงตาง ๆ รอบตัว แตละพอรตประกอบดวยสวนที่
ตอเชื่อมภายในโมดูล (Internal part) และสวนที่อยูภายนอก (External part) โดยที่ชนิดของสัญญาณสวนภายใน และภายนอกโมดูลที่สามารถเปนไดทั้ง net และ reg มขีอกําหนดดังนี้
Internal
part External
part Input net net, reg Output net, reg net Inout net net
Mahanakorn University of Technology 30
จากตัวอยางในรูป Internal part ที่อยูในโมดูล MyMod ก็คือ {P1, P2, P3, P4, P5} สวน External part คือ {S1, S2, S3, S4, S5} และสังเกตไดวา สัญญาณประเภท reg แทนดวยส่ีเหล่ียม สวนสัญญาณประเภท net จะแทนดวยวงกลม
การเชื่อมตอพอรตโดยลําดับ (Connecting Ports by Ordered Port List)
การเชื่อมตอสัญญาณไปยังพอรตในโมดูลสามารถทําไดโดยใชภาษาทําการแมป (Map) ตามตําแหนงของขาที่กําหนดไวในโมดูล ดังตัวอยางในรูปจะเห็นวาเราเรียกใชโมดูล Hexagon มาใชงานในโมดูล MySyst และกําหนดใหมีการเชื่อมตอสัญญาณ A, B, C เขาไปที่พอรตตาง ๆ ของโมดูล Hexagon ที่ชื่อวา MyMod เนื่องจากโมดูล Hexagon กําหนดพอรตเรียงลําดับดังนี้คือ (Out1, In1, In2) ดังนั้นตอนที่นํามาใชงานใน MySyst ในบรรทัด Hexagon MyMod (A, B, C); นั่นหมายถึงวาตามตําแหนงแลว A จะตอเชื่อมกับ Out1, B จะตอเชื่อมกับ In1, และ C จะตอเชื่อมกับ In2 ตามลําดับของพอรตในโมดูลนั้น ๆ
การเชื่อมตอพอรตโดยชื่อ (Connecting Ports by Name)
สําหรับการเชื่อมตอดวยวิธีการนี้ เราสามารถสลับที่ของพอรตในโมดูลที่ถูกเรียกมาใชงานได แตเราจะตองกํากับชื่อของพอรตไปดวย ตัวอยางเชน Hexagon MyMod (.In1(B), .In2(C), .Out1(A)); โดยมีการเชื่อมตอของสัญญาณเหมือนกันกับตัวอยางในรูปขางบน เพียงแตวาเราสามารถสลับตําแหนงของพอรตโดยมีชื่อพอรตกํากับไวได
การกําหนดพอรตที่ไมมีการเชื่อมตอ (Unconnected Ports)
นอกจากการกําหนดพอรตโดยอางอิงถึง Port list และอางอิงถึงชื่อแลว ภาษา Verilog มีการกําหนดพอรตที่ไมไดใชงาน โดยสามารถทําไดตามลักษณะการการกําหนดการเชื่อมตอพอรตดังนี้
Internal part External part
Mahanakorn University of Technology 31
• เมื่อมีการเขื่อมตอโดยใชชื่อพอรต เราสามารถตัดพอรตที่ไมไดใชงานออกไดทันที ดังนั้นก็จะเหลือเพียงแคพอรตที่ใชงานแสดงไวเทานั้น ดังตัวอยางในรูป
• เมื่อมีการเชื่อมตอโดยอางถึงลําดับ Port list เนื่องจากเราตองรักษาตําแหนงลําดับของพอรตใน
โมดูล ดังนั้นเมื่อไมมีการใชงานของพอรตใด พอรตหนึ่ง เราจะตองเวนที่วางไวโดยใส Blank space แทนชื่อของสัญญาณ เชน GoldBox (A, B, C, , E);
Mahanakorn University of Technology 32
CHAPTER 5 Specification with Signal Transformations
การออกแบบระบบดวย Structural style โดยการเขียนอธิบายโครงสรางของวงจรใดวงจรหนึ่งดวยภาษาชั้นสูงสามารถทําไดดังแสดงในบทที่ผานมา ในบทนี้จะเนนลักษณะการออกแบบโดยการอธิบายความสัมพันธระหวางเอาทพุท และอินพุท ซึ่งการออกแบบลักษณะนี้เราเรียกวา Dataflow style นั่นเอง โดยจะแนะนําใหรูจัก Expression ที่ประกอบดวย Operands (หรือตัวแปรอินพุทตาง ๆ) ที่ถูกกระทําดวย Operators (หรือตัวกระทํา) อยูภายใน
สําหรับตัว Operators ในภาษา Verilog นั้นมีใหใชงานหลากหลาย ตามชนิดของ Operands และการใชงานที่แตกตางกัน ในการกําหนดเปน Dataflow expression นั้น ผลจากการกระทําใน Expression จะตองถูกกําหนดหรือสงผาน (Assign) มาใหกับสัญญาณที่ตองการ (Target signal) ลักษณะการสงผานคาสัญญาณในลักษณะนี้ เราเรียกวา Continuous assignments ซึ่งจะกลาวในบทนี้เชนกัน Expressions รูจักกับ Expressions (Introduction to Expressions)
โดยปกติแลวในระบบทั่วไป สัญญาณอินพุทจะถูกแปลง (Transform) ดวยวิธีการใด ๆ วิธีการหนึ่ง เพ่ือสรางสัญญาณเอาทพุทที่ตองการออกมา กระบวนการแปลงเชนนี้ สามารถเขียนไดเปน
Outputs <- transformations (Inputs)
นิยามตามพจนานุกรมของ Expressions นั้นคือ “การสรางผลลัพธจากการท่ี Operands กระทํากัน
ดวย Operators ในการท่ีจะกําหนดฟงกชันการทํางานใด ๆ ข้ึนมา” ในภาษา Verilog นั้น Operator หนึ่งตัวสามารถมี Operands ไดต้ังแต 1, 2, หรือ 3 ตัว ตามแตความตองการใชงาน โดยอาจเปน Operands ตางชนิดกันก็ได ซึ่งเปนขอยืดหยุนที่สําคัญในภาษา Verilog ที่ตางกับภาษา VHDL
ตัวอยางของ Expression แสดงไดดังรูป
ในหัวขอตอไปจะแนะนําใหรูจักกับแตละชนิดของ Operands
Mahanakorn University of Technology 33
Operands แตละ Expression จําเปนตองมี Operands ที่ถูกกระทําดวยตัว Operators ในการที่จะกําหนดฟงกชัน
การทํางานเพ่ือที่จะสรางผลลัพทที่ตองการออกมา และเนื่องจากตัว Operands มีหลายชนิด ดังนั้นการเลือกใช Operators จะตองสอดคลองกันกับชนิดของ Operands ดวย ซึ่งสามารถแบงไดเปนดังนี้
• ตัวอยางที่เห็นไดงาย และชัดเจนที่สุดสําหรับชนิดของ Operands คือการอางอิงถึงสัญญาณ Nets และ Registers ดวยชื่อตาง ๆ หรือที่เรียกวา Instance names นั่นเอง
• คาคงที่ หรือ Constant values ก็เปนอีกชนิดหนึ่งของ Operands ที่สําคัญ ซึ่งในภาษา Verilog นั้นมีคาคงที่หลาย ๆ ประเภทเชน Integer, Real เปนตน
• คาที่ประกอบดวยหลาย ๆ บิต หรือที่เรียกวา Vector ซึ่งสามารถเปนไดทั้ง Nets หรือ Registers และเราสามารถกําหนดการเรียกใชงานในแตละบิต (Bit-select) หรือบางสวน (Part-select) ของคาเวกเตอรนั้น ๆ ใด
• ชนิดสุดทายของ Operands อาจจะเปนการเรียกใชฟงกชัน (A call to a function) ทั้งฟงกชันของระบบ หรือที่ผูใชงานออกแบบขึ้นเอง โดยท่ีหลังจากเรียกใชจะมีคาที่สงกลับมา ที่มีความสอดคลองกับชนิดของตัวกระทํา (Operators)
ตัวอยาง Operands สามารถแสดงไดในรูป จะเห็น
วา in1, Radius และ DataBus เปน Simple reference ที่เปนการอางอิงถึงสัญญาณ Nets และ Registers ที่เปนแบบเวกเตอร สวนการใชงานบางสวน (Part-select) สามารถใชเปน DataBus[7:4] หรือการใชงานเฉพาะบิตคือ DataBus[0] เปนตน สําหรับตัวอยางของ Operands ที่เปนคาคงที่ (Constant values) เชน 1.3e7 (Scientific) , 127 (Decimal), 4’b1001 (Binary) สําหรับ
ตัวอยางที่เปนชนิดของการเรียกใชฟงกชันคือ CircleArea(Radius) เปนตน
คาคงท่ีจํานวนเต็ม (Integer Constants) คาคงที่จํานวนเต็ม คือคาจํานวนเต็มที่เขียนในเลขฐานสิบที่ใชในชีวิตประจําวัน สามารถเปนไปไดทั้งคาที่
เปนบวก หรือลบ เชน 1, 3, 457, -34, -872 เปนตน ในภาษา Verilog คาเลขฐานของจํานวนเต็มโดยปริยาย (Default) คือฐานสิบ (Decimal) ถาหากไม
กําหนดเลขฐานกํากับ แตเราสามารถกําหนดใหมใหเปนฐานสอง ฐานแปด หรือฐานสิบหกไดตามตองการ โดยตองมีสัญลักษณ ‘ ตามดวยตัวอักษรท่ีบอกคาของเลขฐาน เชน ‘h’ หรือ ‘H’ สําหรับฐานสิบหก, ‘o’ หรือ ‘O’ สําหรับเลขฐานแปด, ‘b’ หรือ ‘B’ สําหรับเลขฐานสอง, ‘d’ หรือ ‘D’ สําหรับเลขฐานสิบ
การกําหนดคาในลักษณะนี้จะถูกกําหนดใหเปนเลขจํานวนเต็มบวก เชน 8’b10100001, 12’B0001_0010_1010, 16’H12AB เปนตน เราจะสังเกตเห็นวาตัวเลขดานหนาของเครื่องหมาย ‘ จะเปนคาที่แสดงจํานวนบิตของคาจํานวนเต็มนั้น ๆ ซึ่งบางครั้งเราอาจละไวถาเราใสคาครบทุกบิต เชน ‘b0001_0010_1010 ซึ่งเปนการแสดงคาในเลขฐานสอง และมีอยู 12 บิต สวนเครื่องหมาย _ (Underscore) ใชสําหรับชวยในการกําหนดกลุมใหงายสําหรับการอานคา และไมมีผลตอคาของจํานวนเต็มที่กําหนดแตอยางใด
Mahanakorn University of Technology 34
• Unsized integer: เปนการกําหนดคาเลขจํานวนเต็มโดยไมบอกจํานวนบิต คาจํานวนบิตจะถือเปนคา Default นั่นคือ 32 บิต แตการกําหนดเลขฐานสําหรับคาที่ไมใชฐานสิบตองมีกํากับตามปกติ ตัวอยางเชน
• Sized integer: จําเปนตองมีจํานวนบิตกํากับ โดยกําหนดใหเปนตัวเลขจํานวนเต็มบวกฐานสิบ
ซึ่งคาที่แทจริงของคาคงที่นั้นจะตองมีจํานวนบิตที่นอยกวา หรือเทากับจํานวนบิตที่กําหนด ในกรณีที่นอยกวา ตัวคอมไพเลอรจะเติมคา ‘0’ ใหในบิตสูงที่ไมถูกกําหนด เชน
• Negative value: คาที่เปนลบของจํานวนเต็ม สามารถกําหนดไดโดยการใสเครื่องหมายลบไว
ขางหนาสุด โดยตัวคอมไพเลอรจะมองเปน 2’s compliment form ดังตัวอยาง
• Use of ‘?’: เครื่องหมายคําถาม ? ใชแทนการกําหนดคา ‘z’ หรือ High impedance ที่เปนการ
กําหนดคา “don’t care condition” ของคาคงที่นั้น ๆ โดยจํานวนบิตของ ‘z’ จะเทากับ 4, 3, 1 เมื่อกําหนดในเลขฐานสิบหก ฐานแปด ฐานสอง ตามลําดับ
• Use of ‘x’ and ‘z’: การแทนบิตคาคงที่ดวย ‘x’ หรือ ‘z’ (สามารถใชตัวเล็ก หรือใหญก็ได) เปน
การกําหนดคา “Unknown” หรือ คา “High impedance” ตามลําดับ สามารถใชในเลขฐานสอง ฐานแปด หรือฐานสิบหก (แตไมสามารถใชกับฐานสิบได) โดยจํานวนบิตของ ‘z’ จะเทากับ 4, 3, 1 เมื่อกําหนดในเลขฐานสิบหก ฐานแปด ฐานสอง ตามลําดับ
• Use of ‘_’: เครื่องหมาย Underscore เปนการกําหนดกลุม หรือวรรคของคาคงที่ที่กําหนด ทํา
ใหสามารถอานไดโดยงาย สามารถแทรกไดตามจุดตาง ๆ ภายในคา แตไมสามารถเขียนไวหนาสุดของคานั้น ๆ ได เชน
• Left padding: ในกรณีที่ขนาดของคาจํานวนเต็มนอยกวาคาของจํานวนบิต การทํา Left
padding หรือการเติมคาเขาทางดานซายในตําแหนงที่ไมมีการกําหนด จะถูกนํามาใชงาน กรณี
Mahanakorn University of Technology 35
ปกติจะเปนคา ‘0’ สําหรับการทํา Left padding แตถาคาดานซายสุดของคาที่กําหนดเปน ‘x’ หรือ ‘z’ จะตองใสคา ‘x’ หรือ ‘z’ เขาไปใหเต็มแทนที่จะเปน ‘0’ ตามตัวอยาง
Bit-select และ Part-select สําหรับตัวแปรเวกเตอร (The Bit-select and Part-select Operands) เมื่อเราตองการสวนหนึ่งของตัวแปรเวกเตอร อาจจะเปนแคบิตเดียว หรือหลาย ๆ บิตตอกัน สามารถทํา
ไดโดยการใช Select operand โดยมีไวยากรณที่ไมซับซอน แคกําหนดบิต หรือชวงบิตที่ตองการในเครื่องหมาย [ ] โดยถาเปนการกําหนดชวงในลักษณะของ Part select การกําหนดชวงบิตจะตองมีเครื่องหมาย : (Colon) เปนตัวคั่นระหวาง MSB กับ LSB นั่นคือ [MSB:LSB] ดังรูป
ถาเรากําหนดชวงของบิต (Indexes) เกินกวาที่กําหนดไวในตัวแปรเวกเตอร คาของบิตในตําแหนงที่เลย
ออกมาจะถูกกําหนดเปน ‘x’ โดยอัตโนมัติ ตัวกระทํา (Operators) ตัวกระทําทางคณิตศาสตร (Arithmetic Operators)
ในภาษา Verilog มีตัวกระทํามากถึง 32 ตัว สามารถแบงไดเปนสามกลุมตามจํานวนของ Operands ที่ใชงานดวย คือ Unary (with one operand), Binary (with two operands), Ternary (with three operands) หรือถาแยกตามประเภทของการทํางานสามารถกําหนด ไดเปนชนิดหลัก ๆ ไดดังนี้คือ
• ตัวกระทําเชิงคณิตศาสตร (Arithmetic operator) • ตัวกระทําเชิงตรรก (Logical operator) • ตัวกระทําเชิงความสัมพันธ (Relational operator)
ซึ่งในหัวขอนี้จะพูดถึงตัวกระทําเชิงคณิตศาสตรกอน ซึ่งคงคุนเคยกันดีสําหรับ Operators ประเภทนี้ ซึ่งไดแก + แทนการบวก, – แทนการลบ, * แทนการคูณ, / แทนการหาร โดยที่สองตัวแรกคือ + และ – สามารถเปน Unary operator ที่มี Operand เพียงแคตัวเดียวสําหรับการแทนเปนจํานวนบวก หรือจํานวนลบ
นอกจากตัวกระทําพ้ืนฐานทั้งส่ีตัวนี้แลว % เปนอีกตัวหนึ่งสําหรับการ Modulo ซึ่งจะไดผลลัพธเปนคาที่เหลือ (Remainder) จากการหารกันระหวางตัวตั้ง และตัวหาร
Mahanakorn University of Technology 36
ส่ิงสําคัญอยางหน่ึงสําหรับการกระทําโดยใช Arithmetic operators คือคาที่ไดจาก Operands ประเภท Register และ Integer จะแตกตางกันเนื่องจาก คาของสัญญาณ หรือตัวแปรประเภท Register จะคิดเปนคาจํานวนเต็มบวก (Unsigned) แตสําหรับ Integer จะคิดเปนคาจํานวนเต็มที่มีคาไดทั้งบวก และลบ (Signed) ทําใหบางครั้งคาผลลัพธที่ไดจะแตกตางกัน ถึงแมวาจะมีการกําหนดคาที่เหมือนกัน ดังตัวอยาง
IntA ถูกกําหนดเปนตัวแปรประเภท interger ซึ่งคา -12 จะถูกแปลงเปนเลข 2’s กอนทําการหาร โดยไดผลลัพธเทากับ 65532 ซึ่งเปนคา 2’s ของ -4 IntA ถูกกําหนดเปน Register ซึ่งถากําหนดเปน -12 ซึ่งแทนไดดวยคาภายในตัวคอมไพเลอร เปนจํานวนบวกที่เทากับ 65524 ดังนั้นจะไดผลลัพธเทากับ 21841 ซึ่งไมถูกตอง
ตัวกระทําเชิงความสัมพันธ (Relational Operators)
เปนตัวกระทําที่ใชในการเปรียบเทียบวา มากกวา นอยกวา หรือเทากับ ระหวางตัว Operands สองตัวใด ๆ โดยผลลัพธที่ไดออกมานั้น ถาเปนไปตามเงื่อนไขของความสัมพันธ (วามีตัวใดมีคามากกวา หรือนอยกวา หรือเทากัน) จะมีคาเปน ‘1’ เมื่อความสัมพันธนั้นเปนจริง และจะมีคาเปน ‘0’ เมื่อเปนเท็จ
ในกรณีที่บิตใด บิตหนึ่งของ Operands มีคาเปน ‘x’ หรือ ‘z’ คาผลลัพธที่ไดจะเทากับ ‘x’ (Unknown) และถาจํานวนบิตของ Operands ไมเทากัน ตัวที่นอยกวาจะถูกเตมิดวย ‘0’ ในดานซายมือ (Left padding)
ลําดับความสําคัญของการทํางาน หรือที่เรียกวา Precedence ของ Relational operators จะนอยกวา Arithmetic operators
Mahanakorn University of Technology 37
ตัวกระทําท่ีเปน Equality Operators นอกจากลักษณะของการกระทําเปรียบเทียบวาเทากับ ‘==’ หรือไมเทากับ ‘!=’ แลว ในภาษา Verilog มี
ลักษณะพิเศษเพิ่มขึ้นสําหรับการเปรียบเทียบโดยมีเง่ือนไขสําหรับสัญญาณ ‘x’ หรือ ‘z’ เรียกวา Case equality (inequality) โดยมีสัญลักษณเปน ‘===’ หรือ ‘!==’ โดยจะเปนการเปรียบเทียบคาของทั้งสอง Operands โดยไมคํานึงถึงวาเปน ‘x’ หรือ ‘z’ ดังนั้นผลลัพธจะออกมาเปน ‘0’ หรือ ‘1’ เทานั้นแลวแตเง่ือนไขที่ใชในการเปรียบเทียบ เชน ถาเทากันทุกบิตไมวาแตละบิตจะเปนคา ‘0’ ‘1’ ‘x’ หรือ ‘z’ ผลลัพธของการเปรียบเทียบโดยใชเง่ือนไข ‘===’ จะเปนจริง ดังตัวอยาง
ตัวกระทําทางตรรก (Logical Operators) ในภาษา Verilog ไดแบงตัวกระทําทางตรรก หรือทางลอจิกเปน 3 ประเภทใหญ ๆ ดวยกันคือ
• Logical operators: จะทําการกระทําทางลอจิกกับ Operands สองตัว ที่ความยาวบิตใด ๆ ผลลัพธที่ไดจะเปน 1 บิต ที่มีคาเปนจริง (‘1’) หรือ เท็จ (‘0’) เทานั้น
• Bit-wise operators: จะนําเอา Operands สองตัวที่ความยาวบิตใด ๆ มากระทําทางลอจิกบิต
ตอบิต ตามตําแหนง ตัวอยางเชน บิตที่ k ของตัว Operand ซาย จะกระทําทางลอจิกกับบิตที่ k ของตัวขวา ดังนั้นผลลัพธจะไดความยาวบิตเทากับ ความยาวบิตของตัว Operand ที่ยาวที่สุด สําหรับตัว Operand ที่ยาวนอยกวาจะมีการทํา Left padding ในตําแหนงบิตที่ขาดไป กอนจะนํามากระทําทางลอจิกในแตละบิต
• Reduction operators: จะใชกับ Operand เพียงตัวเดียวที่เปนเวกเตอร โดยผลลัพธจะเทากับ
การนําเอาแตละบิตใน Operand ตัวนั้นมากระทําทางลอจิกกันในตัวมันเองจนครบ ดังนั้นผลลัพธที่ไดจะมีเพียงแคบิตเดียว
Mahanakorn University of Technology 38
ตารางสรุปการใชงานตัวกระทําทางตรรกในประเภทตาง ๆ AND OR NOT XOR/XNOR
Logical operators
⎯
Bit-wise operators
Reduction operators
⎯
ตัวกระทําท่ีเปน Shift Operators
การใชงานจะประกอบดวย Operands สองตัว ตัวแรกจะเปนสัญญาณเวกเตอรที่ตองการใหเกิดการชิฟ และตัวที่สองจะเปนจํานวนของการชิฟ วาตองการชิฟไปกี่บิต เราสามารถทําการชิฟไดทั้งซาย และขวาโดยใชเครื่องหมาย ‘>>’ สําหรับการชิฟไปดานขวา และ ‘<<’ สําหรับการชิฟไปดานซาย โดยบิตที่ถูกชิฟจะถูกแทนดวยลอจิก ‘0’
Mahanakorn University of Technology 39
การตอเชื่อมสัญญาณเวกเตอร (Vector Concatenations) การตอเชื่อมคาตาง ๆ ของสัญญาณ หรือที่เรียกวา Concatenation สามารถทําไดโดยใชเครื่องหมาย {, }
สําหรับการตอสัญญาณตาง ๆ รวมกันเปนเวกเตอรตัวใหม โดยจะใช , (Comma) คั่นระหวางคาของแตละตัว ซึ่งอาจเปน Scalars, nets, registers, vector nets, vector registers, bit-select, part-select หรือแมกระทั่งคาคงที่ (ที่มีจํานวนบิตที่แนนอน)
นอกจากนี้เราสามารถตอคาสัญญาณชุดที่ซ้ํา ๆ กันไดโดยเพียงแตกําหนดจํานวนการซ้ําไวกอนหนาสัญญาณชดุนั้น เชน {DATA [1:0], DATA [1:0], DATA [1:0], DATA [1:0]} สามารถลดรูปไดเปน {4{DATA[1:0]}}
ตัวอยางนี้แสดงการสราง AggVec
ขนาด 8 บิต จากเวกเตอร Data1, Data2, และสเกลาร BitOne โดยเลือกเอาบางสวนของ Data1 และ Data2 มาเรียงกัน (Part-select)
การสงผานคาแบบตอเน่ือง (The Continuous Assignment) เมื่อไหรก็ตามที่มีการกระทําของ Expressions ที่ประกอบดวย Operands และ Operators แลวได
ผลลัพธออกมา เราจําเปนตองทําการสงผานคา (Assign) ผลลัพธนั้น ๆ ใหกับตัวแปรสัญญาณใด ๆ เพ่ือใหสามารถนําสัญญาณไปใชงานตอไดในระบบ
การสงผานคาสามารถทําไดสองวิธีคือ Continuous assignment หรือ Procedural assignment ซึ่งในบทนี้ เราจะพูดถึงวิธีแรกเทานั้น สวนอีกวิธีจะมีอยูในบทตอไป
การใชงานในลักษณะของ Continuous assignment เปนการสงผานคาจากผลลัพธที่ไดจาก Expression ทางดานขวามือ ของสัญลักษณ Assignment symbol มายังตัวแปรสัญญาณที่อยูทางดานซายมือ ซึ่งเปนลักษณะของ Dataflow model โดย Continuous assignment จะมีสวนประกอบตาง ๆ ดังนี้คือ
• คําส่ัง assign • คาดีเลย (มีหรือไมมีก็ได) • ตัวแปรสัญญาณทางซายมือ ซึ่งจะเปนปลายทางในการรับผลลัพธจาก Expression ทางดาน
ขวามือที่จะเปนตนทาง โดยตัวรับสัญญาณนี้จะตองกําหนดเปน Nets (scalar or vector) เทานั้น จะกําหนดใหเปนประเภท Registers ไมได
• สัญลักษณของการสงผานคา เราใชเครื่องหมายเทากับ ‘=’ ธรรมดา ตัวอยางเชน assign Out1 = A & B & C; assign Out2 = A + B; assign Out3 = {A, B, C};
Mahanakorn University of Technology 40
สําหรับการสงผานคาแบบ Continuous assignment จะมีการกระทําพรอม ๆ กันทันที ถามีการเปล่ียนแปลงคาของ Operands ใด ๆ ที่อยูใน Expression ทางดานขวามือเกิดขึ้น โดยจะมีการหาผลลัพธที่เกิดขึ้นใหม จากการเปลี่ยนแปลงคาของตัว Operands กอนที่จะทําการสงผานคามายังตัวแปรทางดานซายมือ
การสงผานคาแบบแฝง (The Implicit Continuous Assignment)
เราสามารถสงผานคาแบบ Continuous assignment ใหกับ Net ตอนที่เรากําหนดใชงาน (Net declaration) ไดทันที โดยไมตองมคีําส่ัง assign วิธีการนี้เรียกวา Implicit assignment หรือ Net declaration assignment เชน wire x = ………;
รูปทางดานซายมือ เปนการกําหนดโดยวิธีการปกติที่เห็นการสงผานคาใหกับ X, Y ไดอยางชัดเจน
โดยใชคําส่ัง assign เรียกวา Explicit assignment สวนรูปทางดานขวามือ จะเปนการสงผานคาใหกับ X, Y ทันที หลังจากการกําหนดเปนตัวแปรสัญญาณแบบ wire โดยไมตองใชคําส่ัง assign เรียกวา Implicit assignment
การสงผานคาแบบมีเงื่อนไข (The Conditional Assignment)
การกําหนดการทํางานแบบมีเง่ือนไข มีประโยชนมากในการอธิบายการทํางานของทั้งซอฟทแวร และฮารดแวร แตอยางไรก็ตามเราไมสามารถใชคําส่ัง if-then-else ในลักษณะการกําหนดคาที่เปน Continuous assignment ได ดังนั้นจึงมีตัวกระทําทางเง่ือนไข (Conditional operator) มาทดแทนการใชงานที่ไมซับซอน
ตัวอยางเชน assign Out = Sel ?
In0 : In1; เปนการสงผานคาใหกับ OUT โดยมีเง่ือนไขคือ ถา Sel เปนจริง คา In0 จะถูกกําหนดมาใหกับ Out แตถา Sel เปนเท็จ คา In1 จะถูกกําหนดมาใหแทน ซึ่งก็คือการทํางานของ Multiplexer ที่มีสองอินพุท และหนึ่งเอาทพุทนั่นเอง
Mahanakorn University of Technology 41
CHAPTER 6 The Behavioral Approach
การอธิบายการทํางานของระบบดวยสมการบูลีน หรือ Dataflow style มีขอจํากัดตาง ๆ มากมาย
เนื่องจากเปนการอธิบายการทํางานในระดับต่ํา สําหรับภาษา Verilog สามารถใชในการอธิบายการทํางานได ในระดับที่สูงขึ้นในการกําหนดการทํางานของระบบ โดยมีการอธิบายเปนพฤติกรรมของวงจร (Behavioral description) ทําใหงายขึ้น และสะดวกรวดเร็วในการออกแบบระบบ โดยที่หนาที่ของการสรางวงจรในระดับต่ํา ๆ เชน RTL หรือ Gate level ก็จะเปนหนาที่ของตัวสังเคราะหวงจรแทน
จากที่ผานมา ในการเขยีนในลักษณะของ Dataflow สามารถทําไดโดยใชคําส่ัง assign ซึ่งเปนการสงผานคาที่ไดจาก Expression ทางดานขวามือของเครื่องหมาย = มายังสัญญาณประเภท Nets เทานั้น ในทางกลับกัน สําหรับการเขียนในลักษณะของ Behavioral style จะมีการใชงานกับสัญญาณประเภท Registers ซึ่งมีหลาย ๆ ประเภทที่จะกลาวถึงตอไปในบทนี้
การเขียนอธิบายการทํางานในลักษณะของ Behavioral style จะมีวิธีการเขียนที่คลายกับภาษาซี เปนอยางมาก เชนมีการใชคําส่ัง if-then-else, case statement เปนตน ซึ่งในบทนี้เราจะไดเรียน ลักษณะของไวยากรณในการใชงานสําหรับการอธิบายการทํางานของฮารดแวรดวยภาษา Verilog
ตัวแปร และพารามิเตอร (Variables and Parameters) ทําไม Nets จึงไมเพียงพอ (Aren’t Nets Enough?)
จากที่ทราบมาแลววา กรณีที่มีสัญญาณที่มีคา ๆ หนึ่งที่ตัวสง (หรือที่เราเรียกวา Source หรือ Driver) แลวตองการสงผานคานี้ไปยังอีกที่ ๆ หนึ่ง เราสามารถกําหนดใหเปนการทํางานในลักษณะของ Dataflow ได โดยใช Nets ซึ่งถาสัญญาณที่ Driver ถูกตัดขาดแลว สถานะที่ Nets ที่ใชในการับคาจะเปน High impedance แตสําหรับ Registers แลวถึงแมวาสัญญาณท่ี Driver จะถูกตัดออกไป แตมันก็ยังสามารถคงสถานะของคาสุดทายที่ไดรับอยูได
คุณสมบัติในการคงคาไดของ Registers จําเปนตองใชในการอธิบายวงจรในแบบของ Behavioral style ที่สวนใหญเปนการเขียนอัลกอริทึมในการอธิบายพฤติกรรมการทํางาน และจําเปนตองมีการใชงานของตัวแปร (Variables) ตาง ๆ อยูภายใน คุณสมบัติของตัวแปรโดยท่ัวไปคือ สามารถคงคาไดตราบเทาที่ไมมีการเปล่ียนแปลงคาใหมเกิดขึ้น ดังนั้น Registers ในภาษา Verilog จึงเปรียบเสมือนตวัแปรที่ใชในการอธิบายวงจรลักษณะนี้ แทนที่จะเปน Nets
รีจีสเตอร (Rergisters)
ความหมายโดยทั่วไปของ Registers ในภาษา Verilog ก็คือเปนตัวที่ใชในการเก็บคาตาง ๆ ซึ่งเปรียบไดกับ Veriables ในภาษาชั้นสูงทั่วไป เชน C หรือ Pascal
วิธีการกําหนดการใชงานของ Registers จะใชคาํส่ัง reg นําหนาชื่อของสัญญาณที่จะกําหนด สําหรับการใชงานปกติที่ใชเก็บคาตาง ๆ ของสัญญานลอจิก นอกจากนี้เรายังสามารถกําหนดการใชงานของตวัแปรรีจิสเตอรประเภทอื่น ๆ สําหรับการใชงานในภาษา Verilog เพ่ือใหมีความสะดวกมากยิ่งขึ้น คือ integer, time, real, realtime ดังรายละเอียดตอไปนี้
Mahanakorn University of Technology 42
• reg: ใชในการเก็บคาลอจิก คลายกับ Filp-flop ในฮารดแวร แตไมจําเปนตองมีสัญญาณนาฬิกามาใชในการเก็บคา คาเริ่มตนของ register จะเปน ‘x’ (ไมเหมือนกับ Nets ที่เปน ‘z’) เชน
o reg A; o reg [3:0] B, C;
• time: เปนรีจิสเตอรประเภทพิเศษ ที่ใชสําหรับการจําลองการทํางาน (Simulation) การแกไข (Debugging) รวมท้ังการรายงาน (Reporting) เปนตัวแปรที่มีความกวาง 64 บิต เชน
o time sim_time; o time setup_time;
• integer: เปนรีจิสเตอรที่ใชในทางคณิตศาสตร สําหรับการเก็บคาจํานวนเต็ม สามารถเปนไปไดทั้งจํานวนบวก และลบ โดยตัวแปรรีจีสเตอรนี้มีขนาดเทากับ 32 บิต ตางกับ reg คือถามีคาลบ และใชงานใน Expression คาของมันก็ยังเปนลบอยู (ตางกับ reg จะมีคาเปนบวกเสมอ) เชน
o integer loop_count; o integer counter;
• real, realtime: เปนรีจิสเตอรที่ใชในทางคณิตศาสตร สําหรับการเก็บคาจํานวนจริงที่มีจุดทศนิยม เขียนไดทั้งเปนเลขยกกําลังในแบบของ Scientific form หรือจุดทศนิยมธรรมดา โดยท่ี realtime จะใชในการแทนคาทางเวลา แตทั้งสองประเภทนี้สามารถใชแทนกันได เชน
o real exact, average; o realtime exact_simtime;
เวกเตอร และอารเรย (Vectors and Arrays)
เราสามารถกําหนด reg เปนตัวแปรประเภทเวกเตอร (Vector) ได โดยกําหนดชวงบิตที่จะใชงาน (Indexing) อยูในเครื่องหมาย [ MSB: LSB] ที่อยูระหวางคําวา reg และ Instance name เชน
reg [7:0] Data; //เปนเวกเตอรชื่อ Data ที่มีขนาดความกวาง 8 บิต
อีกประเภทหนึ่งของรีจิสเตอรที่สามารถทําได คือตัวแปรแบบอารเรย (Array) ⎯ ที่ไมมีอยูในสัญญาณ
ประเภท Nets ⎯ ความแตกตางที่ชัดเจนระหวางเวกเตอร และอารเรยคือ มิติ โดยที่เวกเตอรมีเพียงมิติเดียวนั้นคือความกวาง (Width) แตอารเรยมีสองมิติคือทั้งความกวาง (Width) และความลึก (Depth) หรืออาจมองอีกนัยหนึ่งคือ อารเรยเปนการนําเอาเวกเตอรมาเรยีงซอน ๆ กัน
สําหรับวิธีการกําหนดอารเรย จะมีการกําหนดชวงความกวางอยูหลังจากคําวา reg และความลึกหลังจากInstance name เชน
reg Data[7:0]; //เปนการกําหนดอารเรยชื่อ Data ที่มีความกวาง 1 บิต และความลึก 8 ตําแหนง reg [7:0] MyMem [3:0]; //เปนอารเรยชื่อ MyMem มีความกวาง 8 บิตและความลึก 4 ตําแหนง
ความแตกตางระหวางเวกเตอร และอารเรยอีกอยางคือ เวกเตอรสามารถเปนรีจีสเตอรประเภท reg
เทานั้น แตอารเรยสามารถประกอบดวยรีจิสเตอรประเภทตาง ๆ เชน reg, integer หรือ time แตไมใช real หรือ realtime
Mahanakorn University of Technology 43
สําหรับการอางอิงถึงในแตละตําแหนงของอารเรยนั้นสามารถกําหนดไดโดยตรง เชน MyMem[2]; เปนการอางอิงถึงตําแหนงที่สองของอารเรย MyMem (ดูรูป) แตกรณีที่เราตองการอางอิงลึกลงถึงระดับบิต เราไมสามารถทําไดโดยตรง เราจําเปนจะตองมีตัวแปรเวกเตอรชั่วคราว (TempReg) มารับคาของอารเรยในตําแหนงที่ตองการกอน แลวจึงอางอิงถึงบิตที่ตองการในเวกเตอรชั่วคราว
คาคงท่ีในภาษา Verilog (Constants in Verilog) เหตุผลของการกําหนดตัวเลข ๆ หนึ่ง ใหเปนคาคงที่ที่มีชื่อ ๆ หนึ่งเพ่ือใหงายในการทําความเขาใจ และ
สามารถเรียกใชงานไดหลาย ๆ ครั้ง นอกจากนี้ยังงายในการแกไขคา โดยที่เราสามารถเปลี่ยนแปลงคาไดจากที่เดียว แลวสวนอื่นของโปรแกรมที่ใชคาคงที่นั้น ๆ ก็จะเปล่ียนแปลงตาม โดยที่เราไมตองเสียเวลาไปไลเปล่ียนทีละบรรทัด ซึ่งงายในการผิดพลาด และชา
คาคงที่จะไมสามารถเปลี่ยนแปลงคา หรือกําหนดคาใหใหมไดในโมดูล ดังนั้นเราจึงไมสามารถใชคาคงที่ในลักษณะของตัวแปรได ทําใหคาคงที่ในภาษา Verilog จึงไมถูกจัดอยูในประเภทของทั้ง Nets และ Registers แตมันถูกเรียกชื่อใหมวา parameter
ตัวอยางในรูป เราให BusSize
เปนพารามิเตอร ที่ใชกําหนดขนาดของบัส DataBus นอกจากนี้มันยังใชเปนเง่ือนไขในการทําคําส่ัง for loop ในตัวโปรแกรมอีกดวย สมมุติวาเราตองการเปลี่ยนขนาดของบัส และเง่ือนไขจากตัวพารามิเตอร
BusSize จาก 8 เปน 16 เราสามารถทําไดที่บรรทัด parameter BusSize = 16; ที่เดียว
การกําหนด และการใชงานพารามิเตอร (The Declaration and Use of Parameters) การกําหนดพารามิเตอรสําหรับใชงานในโปรแกรมสามารถทําไดดังนี้
• เริ่มตนดวยคําส่ัง parameter • ชื่อของพารามิเตอร • คาของพารามิเตอรที่กําหนดไวหลังจากเครื่องหมาย ‘=’
Mahanakorn University of Technology 44
• เครื่องหมาย ; (Semi colon) สําหรับการจบคําส่ัง เราสามารถกําหนดคาคงที่ไดมากกวาหนึ่ง ในการกําหนดครั้งเดียว โดยใชเครื่องหมาย , (Comma) แยก
ชุดของคาคงที่แตละตัว (ชื่อพารามิเตอร พรอมคาที่กําหนด) สําหรับวิธีการใชงานพารามิเตอร สามารถใชไดในลักษณะตาง ๆ เชน
• การกําหนดขนาดของเวกเตอร อารเรย เชน บัส หนวยความจํา
• การกําหนดคาของดีเลย หรือขอมูลเวลา เชน
• การกําหนดจํานวนรอบในการวนคําส่ัง for-loop ดังตัวอยาง
การอธิบายพฤติกรรมเบื้องตน (Behavioral Basics) จาก Dataflow ถึง Behavioral (From Dataflow to Behavioral)
ในการอธิบายพฤติกรรมการทํางานของวงจร จําเปนจะตองกระทําเปนสวน ๆ ที่เราเรียกวา Block โดยมีคําส่ังตาง ๆ ที่เปน Procedure statements สําหรับการกําหนดการทํางานในแตละสวน ในโมดูลหนึ่ง อาจมีไดหลาย ๆ Blocks ซึ่งแตละ Block ทํางานเปนอิสระตอกันแบบขนาน (Concurrency) เหมือนกับ Continuous assignments ในบทที่ผานมา เมื่อสัญญาณใดสัญญาณหนึ่งใน Block มีการเปล่ียนแปลง Block นั้นก็จะมีการทํางาน หรอืถูกประมวลผล โดยคําส่ังภายในจะถูกแปลตามความหมาย แบบเรียงลําดับ (Sequential) ตามลักษณะของคําส่ัง
ชนิดของ Blocks สามารถแบงออกไดเปนสองลักษณะคือ • Initial blocks • Always blocks
Mahanakorn University of Technology 45
เมื่อ Block ใด ๆ มีคําส่ังหลาย ๆ คําส่ัง เราสามารถรวมเปนกลุมของชุดคําส่ังได ดวยคําวา begin แลวจบดวย end สําหรับการทํางานแบบเรียงลําดับ (Sequential statement execution) หรือคําวา fork และ joint สําหรับการทํางานแบบขนาน (Concurrent statement execution)
ตัวอยางดานซายมือจะเปนการ
เขียนดวย Continuous assignment สําหรับการอธิบายดวย Dataflow style และดานขวามือจะเปนการอธิบายดวย Behavioral style โดยใชคําส่ัง initial และ always
ในแตละ Block จะทํางานพรอม ๆ กัน รวมท้ังพรอมกับ Continuous assignment (assign …;) ในบรรทัดสุดทายดวย
Behavioral Blocks ทั้งสองชนิดของ Behavioral blocks มีลักษณะการทํางานเหมือนกัน ยกเวน initial block จะถูกคอมไพล
ที่ตอนเริ่มตนของการจําลองการทํางาน (time 0) และกระทําเพียงครั้งเดียวเทานั้น สวน always block มีการเริ่มการทํางานที่เวลาเทากับ 0 เหมือนกัน แตจะวนรอบไปเรื่อย ๆ ไมมีส้ินสุด (Infinite loop) ตราบเทาที่กระบวนการจําลองทํางานยังมีอยู โดยที่ทุก Blocks ในโมดูลจะทํางานพรอม ๆ กันจากเวลาเริ่มตน
สําหรับคาปริยายของรีจิสเตอร จะมีคาเปน High impedance (‘z’) ซึ่งในการจําลองการทํางานใหถูกตองจําเปนตองเซตคาเริ่มตนใหกอน อาจจะเปน ‘0’ หรือคาที่เหมาะสม โดยใชคําส่ัง initial นั่นเอง สวนหนาที่ของคําส่ัง always เปนการเริ่มตนการอธิบายพฤติกรรมการทํางานของวงจรในโมดูล
ถึงแมวาในแตละ Blocks จะทํางานพรอม ๆ กัน แตในการเขียนเปนโปรแกรม เราจําเปนตองเขียนเรียงกันลงมาทีละบรรทัด เนื่องจากเราไมสามารถเขียนทุก Blocks ไดพรอม ๆ กัน ดังรูป
Mahanakorn University of Technology 46
การกําหนดคาตัวแปร (Variable Assignment) ส่ิงสําคัญทีสุดในการกระทําในการอธิบายพฤติกรรมการทํางาน คือการสงผานคาจาก Expression ไปยัง
ตัวแปร การสงผานคานี้เราเรียกวา Procedural assignment ซึ่งแตกตางจาก Continuous assignment ดังตอไปนี้
• ตัวแปรทางดานซายมือของการสงผานคา (The target of assignment) จะตองเปน Registers (reg, integer, real, time), บิต หรือสวนหนึ่งของรีจิสเตอรเวกเตอร โดยที่ไมสามารถเปน Nets ได
• ไมมีคําวา assign ในการสงผานคา • ตองกําหนดภายใน Behavioral block (initial or
always) • ตองเปนสัญญาณชนิดเดียวกัน • การสงผานคาแบบ Continuous assignment จะมีการ
เปล่ียนแปลงคาใหมเมื่อมีการเปล่ียนแปลงคาของสัญญาณใดสัญญาณหนึ่งใน Expression ทางดานขวามือ แตสําหรับ Procedural assignment ใน always จะมีการประมวลผลคาใหมเมื่อมีการเปล่ียนแปลงคาของสัญญาณใดสัญญาณหนึ่งใน Sensitivity list ที่อยูขางหลัง always
การใชงานที่ซับซอนมากข้ึน (Complex Statements)
การใชงานในลักษณะของการสงผานคา (Assignments) มักไมเพียงพอสําหรับการใชงานในการอธิบายพฤติกรรมการทํางานของระบบ เราอาจตองใชเง่ือนไขของการกระทํา (Conditional statements), เง่ือนไขที่มีหลาย ๆ ทางเลือก (Multi-branch choices), หรือ การวนรอบ (Loops) ที่คลาย ๆ กับที่มีอยูในภาษาซี
Conditional Operations
การกระทําบางอยางจะเกิดขึ้น เมื่อมีเง่ือนไขที่ถูกตองเกิดขึ้นกอน การกระทําลักษณะนี้ เราเรียกวา Conditional operations ซึ่งในภาษา Verilog มีไวยากรณดังนี้คือ
การทํางานสามารถอธิบายไดดังนี้คือ เมื่อ expression_true มีคาเปนจริง true_statement จะมีการทํางาน แตถาเปนเท็จ false_statement จะมีการทํางานแทน
แตถาคาจาก expression_true เปน ‘x’ หรือ ‘z’ จะมีการทํางานโดย false_statement โดยปริยาย ถา true(false)_statement ประกอบดวย Statements มากกวาหนึ่ง จะตองกําหนดจุดเริ่มตนของกลุม
Statements นั้น ดวยคําส่ัง begin และจบทายดวย end แตถามีแคหนึ่ง Statement เราอาจไมจําเปนตองใชก็ได
Mahanakorn University of Technology 47
ตัวอยางเปนการสรางชิฟรีจิสเตอร โดยใชคําส่ัง เง่ือนไข แบบซอนกันหลาย ๆ ชั้น เนื่องจากมีหลาย ๆ เง่ือนไข คือ Clr, Set, Shr, Shl สําหรับการเคลียรคาเอาทพุท การเซตคาเอาทพุท การชิฟไปดานขวา และการชิฟไปดานซาย ตามลําดับ
การมีตัวเลือกหลายกรณี (Multiple Choice) การสรางเง่ือนไขแบบซอน ๆ กันหลาย ๆ กรณีโดยใชคําส่ัง if-else-if มีขอเสียคือซับซอน และยากในการ
ทําความเขาใจ อีกทางเลือกหนึ่งสําหรับการเขียนอธิบายพฤติกรรมของวงจร ที่มีการกระทําแบบมีหลาย ๆ เง่ือนไข คอืการใชคําส่ัง case
สัญญาณท่ีเปนเง่ือนไขในแตละเง่ือนไข จะอยูภายในวงเล็บ ตามหลังคําส่ัง case โดยบรรทัดตอมาจะเปนคาในแตละกรณีที่เปนไปได ตามดวยการกระทํา (Statements) ถาเงื่อนไขในกรณีนั้นถูกตอง ดังตัวอยาง
จะเห็นไดวามีคําส่ัง default ที่เปนคาสําหรับการกระทํา (Outs = Ins) โดยปริยาย กรณีที่
สัญญาณไมตรงกับเง่ือนไขใด ๆ ที่กําหนด นอกจากคําส่ัง case แลว เรายังมี casex และ casez โดยมีความแตกตางกันในแงของการแปล
ความหมายของบิตที่เปน ‘x’ และ ‘z’ ดังนี้
Mahanakorn University of Technology 48
• ในคําส่ัง case ความหมายของบิต ‘x’ หรือ ‘z’ ก็คือคาที่เปน Unknown และ High impedance ตามปกติ
• สําหรับ casex จะมอง ‘x’ และ ‘z’ ในความหมายของ Don’t care ทั้งหมด • ในกรณีของ casez จะแปล ‘x’ เปน Unknown และ ‘z’ เปน Don’t care
การวนรอบ (Loops)
จุดประสงคของการใชคําส่ังในการวนรอบ เพ่ือใหมีการทําซ้ํากันหลาย ๆ รอบตามจํานวนครั้งที่เราตองการ ซึ่งชวยใหเราเขียนโปรแกรมไดส้ันมากขึ้น และสามารถกําหนดจํานวนรอบของการทําซ้ําไดงายมากขึ้นดวย
จํานวนรอบของการกระทํา กําหนดไดดวยเง่ือนไข (ในการหยุด) ในตัวคําส่ัง โดยที่การวนรอบจะเกิดขึ้นเรื่อย ๆ จนกระทั่งเง่ือนไขนั้นเปนจริง
ภาษา Verilog มีคําส่ังที่ใชในการวนรอบดังนี้คือ forever, repeat, while และ for ซึ่งโครงสรางไวยากรณคลายกับภาษาซี โดยมีรายละเอียดการใชงานดังนี้
• forever: เปนคําส่ังในการวนรอบแบบไมมีที่ส้ินสุด • repeat: เปนคําส่ังในการวนรอบวาตองการกี่ครั้ง โดยมีจํานวนครั้งกําหนดเปนคาคงที่เอาไว • while: เปนการวนรอบแบบมีเง่ือนไขสําหรับการเริ่มตนในการวน โดยไมมีจํานวนครั้งที่แนนอน
และในแตละรอบจะมีการตรวจเงื่อนไขในการทํางานกอนทุกครั้ง • for: เปนคําส่ังที่นิยมใชกันมากที่สุด เนื่องจากมีความยืดหยุนสูง ในการใชงานจะมีการกําหนด
เง่ือนไขเริ่มตน เง่ือนไขในการหยุด และการปรับปรุงคาตัวแปรที่ใชในการควบคุมการวนรอบ
ในรูปเปนตัวอยางการใช for-loop ในการวนรอบเพ่ือสรางตัวบวกที่มีจํานวนบิตเทากับการวนรอบ ซึ่งในที่นี้คือ 4-bit full adder สังเกตไดวาตัวแปร I จะเปนตัวควบคุมการวนรอบที่มีคาเริ่มตน เทากับ 0 และจะเพ่ิมขึ้น 1 (I=I+1) เมื่อมีการวนรอบหนึ่งครั้ง จํานวนในการวนรอบ จํากัดอยูที่ I <= 3 ดังนั้นจะมีการทํางานอยู 4 ครัง้ดวยกัน (I=0,1,2,3)
สมมุติวาเราตองการเปล่ียนเปน 8-bit full adder สามารถทําไดโดยแคเปล่ียน I<=3 เปน I<=7 ที่เดียวเทานั้น
Mahanakorn University of Technology 49
การควบคุมพฤติกรรมของวงจรขั้นสงู (Advance Control over Behavior) เหตุการณ (Events)
เราใชเครื่องหมาย @ สําหรับการกําหนดการเกิดขึ้นของเหตุการณ (Event control statement) สามารถทําไดโดยใช @ ตามดวยชื่อของ Registers หรือ Nets ดังตัวอยางตอไปนี้
posedge และ negedge เปนคําเริ่มตน (Prefix) ที่กําหนดเหตุการณในชวงขอบขาขึ้น หรือขอบขาลง
ของสัญญาณนั้น ๆ เชน จะทําการสงผานคา (Assignment) Q = D;ที่ขอบขาขึ้นของ CLK เปนตน
คําสั่งรอ (Wait Statement) การควบคุมเหตุการณ (Event control) เปนการควบคุมการเปลี่ยนแปลงคาคาสัญญาณ หรือตัวแปร โดย
อาจจะมีเง่ือนไข หรือชวงเวลามาเกี่ยวของ คําส่ัง wait สามารถนํามาใชควบคุมการกระทําอยางมีเง่ือนไข เชนอาจใชสรางตัว 3-state buffer หรือตัว
Level-sensitive event control สําหรับการใชงานจะตองมีเง่ือนไขการรอ (Enable) อยูขางในวงเล็บหลังจากคําส่ัง wait แลวตามดวย Statements
เชน wait (EN) #5 C=A+B; สามารถแปลไดดังนี้คือ การกระทํา C = A+B; จะเกิดขึ้น
ภายหลัง 5 หนวยเวลา หลังจากที่สัญญาณ EN เปน ‘1’ แตถาใช wait; โดยไมมีเง่ือนไขใด ๆ ทั้งส้ิน จะเปนการใหรอโดยไมมีที่ส้ินสุด หรือเปนการหยุดการ
จําลองการทํางานนั่นเอง
Sensitivity List เมื่อไรก็ตามที่คําส่ังถูกกระทําโดยเหตุการณที่เกิดขึ้นในสัญญาณหนึ่ง เรากรณีนี้วาคําส่ังนั้นไว
(Sensitive) ตอสัญญาณนั้น ๆ ซึ่งในภาษา Verilog เองไมจํากัดวาการไวตอสัญญาณจะเปนสัญญาณเดียว หรือหลาย ๆ สัญญาณ ตามแตที่จะปรากฏในคาํส่ัง หรือชุดคําส่ังนั้น ๆ และเราสามารถกําหนดรายชื่อของสัญญาณตาง ๆ เหลานั้นได (โดยใช or เปนตัวกั้น) เรียกวา Sensitivity list
การกํานด Sensitivity signals สวนมากจะใชในคําส่ัง always สําหรับการควบคุมการทํางานของชุดคําส่ังตาง ๆ ที่อยูระหวาง begin และ end ใน always block นั่นคือ ถาหากตัวใดตัวหนึ่งใน Sensitivity list เกิดการเปลี่ยนแปลง ตัว always block ก็จะมีการประมวลผล และปรับปรุงคาเกิดขึ้น
ตัวอยางเชน การสราง D-flipflop ทีมีขอบขาขึ้น (posedge) ของสัญญาณ CLK และ RST เปนตัวกําหนดการทํางาน ในคําส่ัง if-then-else สามารถเขียนไดดังนี้
Mahanakorn University of Technology 50
การสงผานคาแบบ Non-blocking (Non-blocking Assignment) การสงผานคาแบบ Non-blocking assignment เปนวิธีการกําหนดการสงผานคาในทุก ๆ บรรทัดที่เขียน
เรียงกันนั้น เกิดขึ้นพรอม ๆ กัน การใชงานในลักษณะนี้จะใชเครื่องหมาย ‘<=’ แทนที่จะเปน ‘=’ (Blocking assignment)
เหตุผลที่เราตองการ Non-blocking assignment เพ่ือใหทุก ๆ การสงผานคาเกิดขึ้นพรอม ๆ กันเปนลักษณะของ Concurrent data transfer ซึ่งสามารถหลีกเล่ียงการเกิด Race condition จากการใช Blocking assignment
ตัวอยางการทํางานของ always block ที่มีการใช Blocking และ Non-blocking assignment จะเห็นไดวา Blocking assignment จะมีการ Update คาทันทีหลังจากจบบรรทัด แต Non-blocking การ Update คาของตัวแปรทั้ง x, y, z จะเกิดขึ้นพรอม ๆ กันหลังจากเจอคําส่ัง end
• Blocking assignment:
• Non-blocking assignment:
ผลลัพธจากการใช Assignment ตางชนิดกัน บางครั้งจะเหมือนกันดังตัวอยางขางบน แตบางครั้งจะไม
เหมือนกัน เชนตัวอยางตอไปนี้
Mahanakorn University of Technology 51
จากโปรแกรมจะเปนการสรางชิฟรีจิสเตอรใน always block โดยใชการสงผานคาในลักษณะของ Blocking และ Non-blocking assignment เปรียบเทียบกัน กรณีกําหนดโดยใช Blocking assignment ‘=’ (ในโมดูลทางดานขวามือ) คาในแตละบรรทัดจะถูกปรบปรุงคาทันที นั่นคือ q1 = in; และหลังจากนั้น q2=q1; แตเนื่องจาก q1 ถูกปรับปรุงคาเปน in เรียบรอยแลวจากบรรทัดกอนหนานี้ ดังนั้น q2=q1=in; ทํานองเดียวกันในบรรทัดตอมา out = q2 = q1 = in; จะเห็นไดวาสัญญาณทุกตัวมีคาเทากันหมด ตัวสังเคราะหวงจรจึงแปลงเปนวงจรไดดังนี้
แตถาใช Non-blocking assignment ‘<=’ ที่มีการปรับปรุงคาทีเดียวพรอม ๆ กัน จะไดวงจรชิฟรีจิสเตอร
ตามตองการ ดังรูปตอไปนี้
เพ่ือปองกันการเกิดกรณีที่ไมตองการอยางนี้เกิดขึ้น กฎงาย ๆ ก็คือ ถามีการสงผานคาใน always block
ใหใช Non-blocking assignment ‘<=’ เสมอ ยกเวนการสราง Combinational circuit ใน always block ใหใช ‘=’ ดังตัวอยางในรูปขางลาง (ซึ่งจริง ๆ เรานิยมทําเปน Continuous assignment ที่อยูขางนอก always block มากกวา)
Mahanakorn University of Technology 52
Appendix
Quick Reference for Verilog HDL
1
1.0 Lexical ElementsThe language is case sensitive and all the keywords are lower case.White space, namely, spaces, tabs and new-lines are ignored. Veriloghas two types of comments:
1. One line comments start with // and end atthe end of the line
2. Multi-line comments start with /* and endwith */
Variable names have to start with an alphabetic character or underscorefollowed by alphanumeric or underscore characters. The only excep-tion to this are the system tasks and functions which start with a dollarsign. Escaped identifiers (identifier whose first characters is a backslash( \ )) permit non alphanumeric characters in Verilog name. Theescaped name includes all the characters following the backslash untilthe first white space character.
1.1 Integer Literals
Integer literals can have underscores embedded in them for improved
readability. For example,
1.2 Data Types
The values z and Z stand for high impedance, and x and X stand for
uninitialized variables or nets with conflicting drivers. String symbols
are enclosed within double quotes ( “string ” ).and cannot span multi-
ple lines. Real number literals can be either in fixed notation or in sci-
entific notation.Real and Integer Variables example
Binary literal 2’b1Z
Octal literal 2’O17
Decimal literal 9 or ’d9
Hexadecimal literal3’h189
Decimal literal 24_000
real a, b, c ; // a,b,c to be real
integer j, k ; // integer variableinteger i[1:32] ; // array of integer variables
Quick Reference for Verilog HDL
2
Time, registers and variable usage
2.0 Registers and NetsA register stores its value from one assignment to the next and is usedto model data storage elements.
Nets correspond to physical wires that connect instances. The default
range of a wire or reg is one bit. Nets do not store values and have to
be continuously driven. If a net has multiple drivers (for example two
gate outputs are tied together), then the net value is resolved according
to its type.Net types
For a wire , if all the drivers have the same value then the wire
resolves to this value. If all the drivers except one have a value of z
then the wire resolves to the non z value. If two or more non z drivershave different drive strength, then the wire resolves to the strongerdriver. If two drivers of equal strength have different values, then the
time newtime ;/* time and integer are similar in functionality,time is an unsigned 64-bit used for time variables*/
reg [8*14:1] string ;/* This defines a vector with range
[msb_expr: lsb_expr] */
initial begin a = 0.5 ; // same as 5.0e-1. real variable b = 1.2E12 ; c = 26.19_60_e-11 ; // _’s are
// used for readability string = “ string example ” ; newtime =$time;end
reg [5:0] din ;/* a 6-bit vector register: individual bitsdin[5],.... din[0] */
wire triwand triandwor triortri0 tri1supply0 supply1trireg
Quick Reference for Verilog HDL
3
wire resolves tox . A trireg net behaves like awire except thatwhen all the drivers of the net are in high impedance (z) state, then thenet retains its last driven value. trireg ’s are used to model capaci-tive networks.
A wand net ortriand net operates as a wiredand(wand) , and awor
net ortrior net operates as a wiredor (wor) , tri0 andtri1 netsmodel nets with resistivepulldown orpullup devices on them. Whena tri0 net is not driven, then its value is 0. When atri1 net is notdriven, then its value is 1.supply0 andsupply1 model nets that areconnected to the ground or power supply.
Memories are declared using register statements with the address rangespecified as in the following example,
The keywordscalared allows access to bits and parts of a bus andvectored allows the vector to be modified only collectively.
3.0 Compiler DirectivesVerilog has compiler directives which affect the processing of the input
wire net1 ;/* wire and tri have same functionality. tri isused for multiple drive internal wire */
trireg (medium) capacitor ;/* small, medium, weak are used for chargestrength modeling */
wand net2 ; // wired-andwor net3 ; // wired-ortriand [4:0] net4 ; // multiple drive wandtrior net5 ; // multiple drive wortri0 net6 ;tri1 net7 ;supply0 gnd ; // logic 0 supply wiresupply1 vcc ; // logic 1 supply wire
reg [15:0] mem16X512 [0:511];// 16-bit by 512 word memory// mem16X512[4] addresses word 4// the order lsb:msb or msb:lsb is not important
wire vectored [5:0] neta;/* a 6-bit vectored net */tri1 vectored [5:0] netb;/* a 6-bit vectored tri1 */
Quick Reference for Verilog HDL
4
files. The directives start with a grave accent( ‘ ) followed by somekeyword. A directive takes effect from the point that it appears in thefile until either the end of all the files, or until another directive thatcancels the effect of the first one is encountered. For example,
This defines a macro namedOPCODEADD. When the text‘OPCODEADD
appears in the text, then it is replaced by00010 . Verilog macros aresimple text substitutions and do not permit arguments.
If ‘ ‘SYNTH’’ is a defined macro, then the Verilog code until ‘endif isinserted for the next processing phase. If ‘‘SYNTH’’ is not defined macrothen the code is discarded.
The code in<Verilog file> is inserted for the next processingphase. Other standard compiler directives are listed below:
4.0 System Tasks and FunctionsSystem taska are tool specific tasks and functions..
‘define OPCODEADD 00010
`ifdef SYNTH <Verilog code> ‘endif
`include <Verilog file>
‘resetall - resets all compiler directives to default values‘define - text-macro substitution‘timescale 1ns / 10ps - specifies time unit/precision‘ifdef, ‘else, ‘endif - conditional compilation‘include - file inclusion‘signed, ‘unsigned - operator selection (OVI 2.0 only)‘celldefine, ‘endcelldefine - library modules‘default_nettype wire - default net types‘unconnected_drive pull0|pull1,‘nounconnected_drive - pullup or down unconnected ports‘protect and ‘endprotect - encryption capability‘protected and ‘endprotected - encryption capability‘expand_vectornets, ‘noexpand_vectornets,‘autoexpand_vectornets - vector expansion options‘remove_gatename, ‘noremove_gatenames
- remove gate names for more than one instance‘remove_netname, ‘noremove_netnames
- remove net names for more than one instance
$display( “Example of using function”);/* display to screen */
$monitor($time, “a=%b, clk = %b,add=%h”,a,clk,add); // monitor signals
$setuphold( posedge clk, datain, setup, hold);// setup and hold checks
Quick Reference for Verilog HDL
5
A list of standard system tasks and functions are listed below:
5.0 Reserved KeywordsThe following lists the reserved words of Verilog hardware descriptionlanguage, as of OVI LRM 2.0.
$display, $write - utility to display information$fdisplay, $fwrite - write to file$strobe, $fstrobe - display/write simulation data$monitor, $fmonitor - monitor, display/write information to file$time, $realtime - current simulation time$finish - exit the simulator$stop - stop the simulator$setup - setup timing check$hold, $width- hold/width timing check$setuphold - combines hold and setup$readmemb/$readmemh - read stimulus patterns into memory$sreadmemb/$sreadmemh - load data into memory$getpattern - fast processing of stimulus patterns$history - print command history$save, $restart, $incsave
- saving, restarting, incremental saving$scale - scaling timeunits from another module$scope - descend to a particular hierarchy level$showscopes - complete list of named blocks, tasks, modules...$showvars - show variables at scope
and always assign attributebegin buf bufif0 bufif1case cmos deassign defaultdefparam disable else endattributeend endcase endfunction endprimitiveendmodule endtable endtask eventfor force forever forkfunction highz0 highz1 ifinitial inout input integerjoin large medium modulenand negedge nor notnotif0 notif1 nmos oroutput parameter pmos posedgeprimitive pulldown pullup pull0pull1 rcmos reg releaserepeat rnmos rpmos rtranrtranif0 rtranif1 scalared smallspecify specparam strong0 strong1supply0 supply1 table tasktran tranif0 tranif1 timetri triand trior triregtri0 tri1 vectored waitwand weak0 weak1 whilewire wor
Quick Reference for Verilog HDL
6
6.0 Structures and HierarchyHierarchical HDL structures are achieved by defining modules andinstantiating modules. Nested module definitions (i.e. one module defi-nition within another) are not permitted.
6.1 Module DeclarationsThe module name must be unique and no other module or primitive canhave the same name. The port list is optional. A module without a portlist or with an empty port list is typically a top level module. A macro-module is a module with aflattened hierarchy and is used by some sim-ulators for efficiency.
module definition example
module dff (q,qb,clk,d,rst);input clk,d,rst ; // input signalsoutput q,qb ; // output definition
//inout for bidirectionals
// Net type declarationswire dl,dbl ;
// parameter value assignmentparamter delay1 = 3,
delay2 = delay1 + 1; // delay2// shows parameter dependance
/* Hierarchy primitive instantiation, portconnection in this section is byordered list */
nand #delay1 n1(cf,dl,cbf),n2(cbf,clk,cf,rst);
nand #delay2 n3(dl,d,dbl,rst),n4(dbl,dl,clk,cbf),n5(q,cbf,qb),n6(qb,dbl,q,rst);
/***** for debuging model initial begin#500 force dff_lab.rst = 1 ;#550 release dff_lab.rst;// upward path referencingend ********/
endmodule
Quick Reference for Verilog HDL
7
Overriding parameters example
Stimulus and Hierarchy example
6.2 User Defined Primitive (UDP) DeclarationsThe UDP’s are used to augment the gate primitives and are defined bytruth tables. Instances of UDP’s can be used in the same way as gateprimitives. There are 2 types of primitives:
1. Sequential UDP’s permit initialization ofoutputterminals, which are declared to be ofreg type and they store values.Level-sensitive entries take precedence over edge-sensitivedeclarations. An input logic stateZ is interpreted as anX. Similarly, only0, 1, X or - (unchanged) logic values are permitted on the output.
2. Combinational UDP’s do not store values and cannot beinitialized.
The following additional abbreviations are permitted in UDP declara-tions.
module dff_lab;reg data,rst;// Connecting ports by name.(map)dff d1 (.qb(outb), .q(out),
.clk(clk),.d(data),.rst(rst));// overriding module parametersdefparam
dff_lab.dff.n1.delay1 = 5 ,dff_lab.dff.n2.delay2 = 6 ;
// full-path referencing is used// over-riding by using #(8,9) delay1=8..
dff d2 #(8,9) (outc, outd, clk, outb, rst);// clock generatoralways clk = #10 ~clk ;// stimulus ... contd
initial begin: stimuli // named block stimulusclk = 1; data = 1; rst = 0;#20 rst = 1;#20 data = 0;#600 $finish;
end
initial // hierarchy: downward path referencingbegin
#100 force dff.n2.rst = 0 ;#200 release dff.n2.rst;
endendmodule
Quick Reference for Verilog HDL
8
Combinational UDP’s example
Logic/state Representation/transition Abbrevation
don’t care (0, 1 or X) ?
Transitions from logic x to logic y (xy).(01), (10), (0x), (1x), (x1), (x0)
(?1) ..
(xy)
Transition from (01) R or r
Transition from (10) F or f
(01), (0X), (X1): positive transition P or p
(10), (1x), (x0): negative transition N or n
Any transition * or (??)
binary don’t care (0, 1) B or b
// 3 to 1 mulitplexor with 2 select
primitive mux32 (Y, in1, in2, in3, s1, s2); input in1, in2, in3, s1, s2; output Y;
table
//in1 in2 in3 s1 s2 Y0 ? ? 0 0 : 0 ;1 ? ? 0 0 : 1 ;? 0 ? 1 0 : 0 ;? 1 ? 1 0 : 1 ;? ? 0 ? 1 : 0 ;? ? 1 ? 1 : 1 ;0 0 ? ? 0 : 0 ;1 1 ? ? 0 : 1 ;0 ? 0 0 ? : 0 ;1 ? 1 0 ? : 1 ;? 0 0 1 ? : 0 ;? 1 1 1 ? : 1 ;
endtable
endprimitive
Quick Reference for Verilog HDL
9
Sequential Level Sensitive UDP’s example
Sequential Edge Sensitive UDP’s example
// latch with async resetprimitive latch (q, clock, reset, data); input clock, reset, data ; output q;
reg q;
initial q = 1’b1; // initialization
table
// clock reset data q, q+? 1 ? : ? : 1 ;0 0 0 : ? : 0 ;1 0 ? : ? : - ;0 0 1 : ? : 1 ;
endtableendprimitive
// edge triggered D Flip Flop with active high,// async set and resetprimitive dff (QN, D, CP, R, S); output QN; input D, CP, R, S; reg QN;table // D CP R S : Qtn : Qtn+1
1 (01) 0 0 : ? : 0;1 (01) 0 x : ? : 0;? ? 0 x : 0 : 0;0 (01) 0 0 : ? : 1; // clocked data0 (01) x 0 : ? : 1; // pessimism? ? x 0 : 1 : 1; // pessimism1 (x1) 0 0 : 0 : 0;0 (x1) 0 0 : 1 : 1;1 (0x) 0 0 : 0 : 0;0 (0x) 0 0 : 1 : 1;? ? 1 ? : ? : 1; // asynch clear? ? 0 1 : ? : 0; // asynchronous set? n 0 0 : ? : -;* ? ? ? : ? : -;? ? (?0) ? : ? : -;? ? ? (?0): ? : -;? ? ? ? : ? : x;
endtableendprimitive
Quick Reference for Verilog HDL
10
7.0 Expressions and OperatorsArithmetic and logical operators are used to build expressions. Expres-sions perform operation on one or more operands, the operands beingvectored or scalared nets, registers, bit-selects, part selects, functioncalls or concatenations thereof.
• Unary Expression<operator> <operand>
• Binary and Other Expressions<operand> <operator> <operand>
• Parentheses can be used to change the precedence ofoperators. For example,((a+b) * c)
Operator precedence
a = !b;
if (a < b ) // if (<expression>){c,d} = a + b ;// concatenate and add operator
Operator Precedence
+,-,!,~ (unary) Highest
*, / %
+, - (binary)
<<. >>
<, < =, >, >=
=, ==. !=
===, !==
&, ~&
^, ^~
|, ~|
&&
||
?: Lowest
Quick Reference for Verilog HDL
11
• All operators associate left to right, except for theternary operator “?:” which associates from right toleft.
Relational Operators
Arithmetic Operators
Logical Operators
Operator Application
&& a && b ; // is a and b true?// returns 1-bit true/false
|| a || b ; // is a or b true?// returns 1-bit true/false
! if (!a) ; // if a is not true c = b ; // assign b to c
Operator Application
< a < b // is a less than b? // return 1-bit true/false
> a > b // is a greater than b?
>= a >= b // is a greater than or// equal to b
<= a <= b // is a less than or // equal to b
Operator Application
* c = a * b ; // multiply a with b
/ c = a / b ; // int divide a by b
+ sum = a + b ; // add a and b
- diff = a - b ; // subtract b// from a
% amodb = a % b ; // a mod(b)
Quick Reference for Verilog HDL
12
Equality and Identity Operators
Unary, Bitwise and Reduction Operators
Operator Application
= c = a ; // assign a to c
== c == a ; /* is c equal to areturns 1-bit true/falseapplies for 1 or 0, logicequality, using X or Z oper-ands returns always false‘hx == ‘h5 returns 0 */
!= c != a ; // is c not equal to// a, retruns 1-bit true/
// false logic equality
=== a === b ; // is a identical to// b (includes 0, 1, x, z) /// ‘hx === ‘h5 returns 0
!== a !== b ; // is a not// identical to b returns 1-// bit true/false
Operator Application
+ Unary plus & arithmetic(binary) addition
- Unary negation & arithmetic (binary) sub-traction
& b = &a ; // AND all bits of a
| b = |a ; // OR all bits
^ b = ^a ; // Exclusive or all bits of a
~&, ~|,~^
NAND, NOR, EX-NOR all bits to-getherc = ~& b ; d = ~| a; e = ̂ c ;
~,&, |, ^ bit-wise NOT, AND, OR, EX-ORb = ~a ; // invert ac = b & a ; // bitwise AND a,be = b | a ; // bitwise ORf = b ^ a ; // bitwise EX-OR
~&, ~|,~^
bit-wise NAND, NOR, EX-NORc = a ~& b ; d = a ~| b ;e = a ~^ b ;
Quick Reference for Verilog HDL
13
Shift Operators and other Operators
7.1 Parallel Expressionsfork ... join are used for concurrent expression assignments.
fork ... join example
7.2 Conditional StatementsThe most commonly used conditional statement is the if, if ... else ...conditions. The statement occurs if the expressions controlling the ifstatement evaluates to true.
Operator Application
<< a << 1 ; // shift left a by// 1-bit
>> a >> 1 ; // shift right a by 1
?: c = sel ? a : b ; /* if selis true c = a, else c = b ,?: ternary operator */
{} {co, sum } = a + b + ci ;/* add a, b, ci assign theoverflow to co and the re-sult to sum: operator iscalled concatenation */
{{}} b = {3{a}} /* replicate a 3times, equivalent to {a, a,a} */
initialbegin: block fork
// This waits for the first event a// or b to occur@a disable block ;@b disable block ;
// reset at absolute time 20#20 reset = 1 ;// data at absolute time 100#100 data = 0 ;// data at absolute time 120#120 data = 1 ;
join
end
Quick Reference for Verilog HDL
14
if .. else ...conditions example
case, casex, casez: case statements are used for switchingbetween multiple selections(if (case1) ... else if (case2)... else ...). If there are multiple matches only the first is evalu-ated. casez treats high impedance values as don’t care’s andcasextreats both unknown and high-impedance as don’t care’s.
case statement example
always @(rst)// simple if -elseif (rst)
// procedural assignmentq = 0;
else // remove the above continous assigndeassign q;
always @(WRITE or READ or STATUS)begin// if - else - if
if (!WRITE) beginout = oldvalue ;
endelse if (!STATUS) begin
q = newstatus ;STATUS = hold ;
endelse if (!READ) begin
out = newvalue ; end
end
module d2X8 (select, out); // priority encodeinput [0:2] select;
output [0:7] out;reg [0:7] out;always @(select) begin
out = 0;case (select)
0: out[0] = 1;1: out[1] = 1;2: out[2] = 1;3: out[3] = 1;4: out[4] = 1;5: out[5] = 1;6: out[6] = 1;7: out[7] = 1;
endcaseend
endmodule
Quick Reference for Verilog HDL
15
casex statement example
casez statement example
7.3 Looping Statementsforever, for, while and repeat loops example
casex (state)// treats both x and z as don’t care// during comparison : 3’b01z, 3’b01x, 3b’011// ... match case 3’b01x3’b01x: fsm = 0 ;3’b0xx: fsm = 1 ;default: begin// default matches all other occurances
fsm = 1 ;next_state = 3’b011 ;
endendcase
casez (state)// treats z as don’t care during comparison :// 3’b11z, 3’b1zz, ... match 3’b1??: fsm = 0 ;3’b1??: fsm = 0 ; // if MSB is 1, matches 3?b1??3’b01?: fsm = 1 ;default: $display(“wrong state”) ;
endcase
forever// should be used with disable or timing control
@(posedge clock) {co, sum} = a + b + ci ;
for (i = 0 ; i < 7 ; i=i+1)memory[i] = 0 ; // initialize to 0
for (i = 0 ; i <= bit-width ; i=i+1)// multiplier using shift left and add
if (a[i]) out = out + ( b << (i-1) ) ;
repeat(bit-width) beginif (a[0]) out = b + out ;b = b << 1 ; // muliplier usinga = a << 1 ; // shift left and add
end
while(delay) begin @(posedge clk) ;ldlang = oldldlang ;delay = delay - 1 ;
end
Quick Reference for Verilog HDL
16
8.0 Named Blocks, Disabling BlocksNamed blocks are used to create hierarchy within modules and can beused to group a collection of assignments or expressions. disable
statement is used to disable or de-activate any named block, tasks ormodules. Named blocks, tasks can be accessed by full or referencehierarchy paths (example dff_lab.stimuli).Named blocks canhave local variables.
Named blocks and disable statement example
9.0 Tasks and FunctionsTasks and functions permit the grouping of common procedures andthen executing these procedures from different places. Arguments arepassed in the form of input/inout values and all calls to functions andtasks share variables. The differences between tasks and functions are
initial forever @(posedge reset)disable MAIN ; // disable named block
// tasks, modules can also be disabled
always begin: MAIN // defining named blocksif (!qfull) begin
#30 recv(new, newdata) ; // call taskif (new) begin
q[head] = newdata ;head = head + 1 ; // queue
endendelse
disable recv ;end // MAIN
Tasks Functions
Permits time control Executes in one simulationtime
Can have zero or more argu-ments
Require at least one input
Does not return value,assigns value to outputs
Returns a single value, nospecial output declarationsrequired
Can have output arguments,permits #, @, ->,wait, task calls.
Does not permit outputs,#, @, ->, wait, task
calls
Quick Reference for Verilog HDL
17
task Example
function Example
// task are declared within modulestask recv ;
output valid ;output [9:0] data ;begin
valid = inreg ;if (valid) begin
ackin = 1 ;data = qin ;wait(inreg) ;ackin = 0 ;
endend
// task instantiationalways begin: MAIN //named definition
if (!qfull) beginrecv(new, newdata) ; // call taskif (new) begin
q[head] = newdata ;head = head + 1 ;
end end else
disable recv ;end // MAIN
module foo2 (cs, in1, in2, ns);input [1:0] cs;input in1, in2;output [1:0] ns;function [1:0] generate_next_state;input[1:0] current_state ;input input1, input2 ;reg [1:0] next_state ;// input1 causes 0->1 transition// input2 causes 1->2 transition// 2->0 illegal and unknown states go to 0begin case (current_state)
2’h0 : next_state = input1 ? 2’h1 : 2’h0 ; 2’h1 : next_state = input2 ? 2’h2 : 2’h1 ; 2’h2 : next_state = 2’h0 ; default: next_state = 2’h0 ;
endcasegenerate_next_state = next_state;endendfunction // generate_next_state
assign ns = generate_next_state(cs, in1,in2) ;endmodule
Quick Reference for Verilog HDL
18
10.0 Continous AssignmentsContinous assignments imply that whenever any change on the RHS ofthe assignment occurs, it is evaluated and assigned to the LHS. Theseassignments thus drive both vector and scalar values onto nets. Conti-nous assignments always implement combinational logic (possiblywith delays). The driving strengths of a continous assignment can bespecified by the user on the net types.
• Continous assignment on declaration
• Continous assignment on already declared nets
11.0 Procedural AssignmentsAssignments to register data types may occur withinalways, ini-
tial, task and functions . These expressions are controlled bytriggers which cause the assignments to evaluate. The variables towhich the expressions are assigned must be made of bit-select or part-select or whole element of areg, integer, real or time. These trig-gers can be controlled by loops,if, else ... constructs.assign anddeassign are used for procedural assignments and to remove the con-tinous assignments.
/* since only one net15 declaration exists in agiven module only one such declarative continousassignment per signal is allowed */
wire #10 (atrong1, pull0) net15 = enable ;/* delay of 10 for continous assignment withstrengths of logic 1 as strong1 and logic 0 aspull0 */
assign #10 net15 = enable ;assign (weak1, strong0) {s,c} = a + b ;
module dff (q,qb,clk,d,rst);output q, qb;input d, rst, clk;reg q, qb, temp;always
#1 qb = ~q ; // procedural assignment
always @(rst)// procedural assignment with triggersif (rst) assign q = temp;else deassign q;
always @(posedge clk)temp = d;
endmodule
Quick Reference for Verilog HDL
19
force and release are also procedural assignments. However, theycan force or release values on net data types and registers.
11.1 Blocking Assignment
11.2 Non-Blocking AssignmentAllows scheduling of assignments without blocking the proceduralflow. Blocking assignments allow timing control which are delays,whereas, non-blocking assignments permit timing control which can bedelays or event control. The non-blocking assignment is used to avoidrace conditions and can model RTL assignments.
12.0 Gate Types, MOS and BidirectionalSwitchesGate declarations permit the user to instantiate different gate-types andassign drive-strengths to the logic values and also any delays
module adder (a, b, ci, co, sum,clk) ;input a, b, ci, clk ;output co, sum ;reg co, sum;always @(posedge clk) // edge control// assign co, sum with previous value of a,b,ci
{co,sum} = #10 a + b + ci ;endmodule
/* assume a = 10, b= 20 c = 30 d = 40 at start ofblock */
always @(posedge clk)begin:block
a <= #10 b ;b <= #10 c ;c <= #10 d ;
end
/* at end of block + 10 time units, a = 20, b = 30,c = 40 */
<gate-declaration> ::= <component><drive_strength>? <delay>? <gate_instance>
<,?<gate_instance..>> ;
Quick Reference for Verilog HDL
20
Gates, switch types, and their instantiations
Gate level instantiation example
Gate Types Component
Gates Allowsstrengths
and, nand, or,nor,xor, xnorbuf, not
Three StateDrivers
Allowsstrengths
buif0,bufif1notif0,notif1
MOSSwitches
No strengths nmos,pmos,cmos,rnmos,rpmos,rcmos
Bi-directionalswitches
No strengths,non resistive
tran, tranif0,tranif1
No strengths,resistive
rtran,rtranif0,rtranif1
Allowsstrengths
pulluppulldown
cmos i1 (out, datain, ncontrol, pcontrol);nmos i2 (out, datain, ncontrol);pmos i3 (out, datain, pcontrol);pullup (neta) (netb);pulldown (netc);nor i4 (out, in1, in2, ...);and i5 (out, in1, in2, ...);nand i6 (out, in1, in2, ...);buf i7 (out1, out2, in);bufif1 i8 (out, in, control);tranif1 i9 (inout1, inout2, control);
// Gate level instantiationsnor (highz1, strong0) #(2:3:5) (out, in1,
in2);// instantiates a nor gate with out// strength of highz1 (for 1) and// strong0 for 0 #(2:3:5) is the// min:typ:max delay
pullup1 (strong1) net1;// instantiates a logic high pullupcmos (out, data, ncontrol, pcontrol);// MOS devices
Quick Reference for Verilog HDL
21
The following strength definitions exists
• 4 drive strengths (supply, strong, pull,weak)
• 3 capacitor strengths (large, medium, small)
• 1 high impedance statehighz
The drive strengths for each of the output signals are
• Strength of an output signal with logic value 1supply1, strong1, pull1, large1, weak1,highz1
• Strength of an output signal with logic value 0supply0, strong0, pull0, large0, weak0,highz0
12.1 Gate DelaysThe delays allow the modeling of rise time, fall time and turn-offdelays for the gates. Each of these delay types may be in the min:typ:-max format. The order of the delays are #(trise, tfall, tturn-
off). Forexample,
Logic 0 Logic 1 Strength
supply0 Su0 supply1 Su1 7
strong0 St0 strong1 St1 6
pull0 Pu0 pull1 Pu1 5
large La0 large La1 4
weak0 We0 weak1 We1 3
medium Me0 medium Me1 2
small Sm0 small Sm1 1
highz0 HiZ0 highz1 HiZ0 0
nand #(6:7:8, 5:6:7, 122:16:19)(out, a, b);
Quick Reference for Verilog HDL
22
For trireg , the decay of the capacitive network is modeled using therise-time delay, fall-time delay and charge-decay. For example,
13.0 Specify BlocksA specify block is used to specify timing information for the module inwhich the specify block is used. Specparams are used to declare delayconstants, much like regular parameters inside a module, but unlikemodule parameters they cannot be overridden. Paths are used to declaretime delays between inputs and outputs.
Timing Information using specify blocks
Delay Model
#(delay) min:typ:max delay
#(delay, delay) rise-time delay, fall-time delay,each delay can be withmin:typ:max
#(delay, delay, delay) rise-time delay, fall-time delayand turn-off delay, each min:t-yp:max
trireg (large) #(0,1,9) capacitor// charge strength is large// decay with tr=0, tf=1, tdecay=9
specify // similar to defparam, used for timingspecparam delay1 = 25.0, delay2 = 24.0;
// edge sensitive delays -- some simulators// do not support this
(posedge clock) => (out1 +: in1) =(delay1, delay2) ;
// conditional delaysif (OPCODE == 3’h4) (in1, in2 *> out1)
= (delay1, delay2) ;// +: implies edge-sensitive +ve polarity// -: implies edge sensitive -ve polarity// *> implies multiple paths
// level sensitive delaysif (clock) (in1, in2 *> out1, out2) = 30 ;
// setuphold$setuphold(posedge clock &&& reset,
in1 &&& reset, 3:5:6, 2:3:6);(reset *> out1, out2) = (2:3:5,3:4:5);
endspecify
Quick Reference for Verilog HDL
23
Verilog
Synthesis Constructs
The following is a set of Verilog constructs that are supported by mostsynthesis tools at the time of this writing. To prevent variations in sup-ported synthesis constructs from tool to tool, this is the least commondenominator of supported constructs. Tool reference guides cover spe-cific constructs.
14.0 Verilog Synthesis ConstructsSince it is very difficult for the synthesis tool to find hardware withexact delays, all absolute and relative time declarations are ignored bythe tools. Also, all signals are assumed to be of maximum strength(strength 7). Boolean operations onX and Z are not permitted. Theconstructs are classified as
• Fully supported constructs — Constructs that aresupported as defined in the Verilog Language ReferenceManual
• Partially supported — Constructs supported withrestrictions on them
• Ignored constructs — Constructs that are ignored by thesynthesis tool
• Unsupported constructs — Constructs which if used,may cause the synthesis tool to not accept the Veriloginput or may cause different results between synthesisand simulation.
14.1 Fully Supported Constructs
<module instantiation,
with named and positional notations>
<integer data types, with all bases>
<identifiers>
<subranges and slices on right-hand
side of assignment>
<continuous assignments>
>>, << , ? : {}
assign (procedural and declarative), begin, end
case, casex, casez, endcase
default
Quick Reference for Verilog HDL
24
14.2 Partially Supported Constructs
disable
function, endfunction
if, else, else if
input, output, inout
wire, wand, wor, tri
integer, reg
macromodule, module
parameter
supply0, supply1
task, endtask
Construct Constraints
*, /, % when both operands constants,or 2nd operand power of 2.
always only edge-triggered events.
for bounded by static variables:only use “+” or “-” toindex.
posedge, negedge only with always @ .
primitive,endprimitivetable,endtable
Combinational and edge-sen-sitive user defined primitivesare often supported.
<= limitations on usagewithblockingassignment.
and, nand, or,nor, xor, xnor,buf, not, buif0,bufif1,notif0,notif1
gate types supportedwithout X or Z constructs
!, &&, ||, ~, &,|, ^, ^~, ~^, ~&,~|, +, - , <, >,<=, >=, ==, !=
operators supported without Xor Z constructs
Quick Reference for Verilog HDL
25
14.3 Ignored Constructs
14.4 Unsupported Constructs
All rights reserved. Please send any feedback to the author.Verilog is a registered trademark of Cadence Design Sys-tems, Inc.
<intra-assignment timing controls>
<delay specifications>
scalared, vectored
small, large, medium
specify
time (some tools treat these as integers)
weak1, weak0, highz0, highz1, pull0, pull1
$keyword (some tools use these to set
synthesis constraints)
wait (some tools support wait with a
bounded condition)
<assignment with variable used as bit select
on LHS of assignment>
<global variables>
===, !==
cmos, nmos, rcmos, rnmos, pmos, rpmos
deassign
defparam
event
force
fork, join
forever, while
initial
pullup, pulldown
release
repeat
rtran, tran, tranif0, tranif1, rtranif0,
rtranif1
table, endtable, primitive, endprimitive
R
Quick Reference for Verilog HDL
26
- NOTES -
Quick Reference for Verilog HDL
26b
- NOTES -