เหตุใดสลักจึงอนุมานไม่ดี


22

คอมไพเลอร์ของฉันบ่นเกี่ยวกับ latches ที่สรุปในลูป combinatorial ของฉัน ( always @(*)ใน Verilog) ฉันยังได้รับการบอกด้วยว่าควรหลีกเลี่ยงการสลักสลักที่อนุมาน

มีอะไรผิดปกติกับสลักที่สรุป? พวกเขาทำให้ลูป combinatorial ง่ายต่อการเขียน


มันจะเป็นการดีถ้ารวมตัวอย่าง HDL ของสิ่งที่คุณกำลังทำอยู่
shuckc

ฉันสังเกตว่าคำถามนี้ได้ถูกอ้างถึงสองสามครั้งเมื่อเร็ว ๆ นี้ สำหรับทุกคนที่ไม่ใช่ผู้เชี่ยวชาญที่มาในลักษณะนี้โปรดทราบว่าคำตอบทั้งหมดนอกเหนือจาก Oli Glaser นั้นเป็นการผสมผสานที่ไม่ถูกต้องและ / หรือไม่ช่วยเหลือ
EML

มันน้อยกว่าที่ควรหลีกเลี่ยงการสลักแบบอนุมานและมากกว่านั้นควรหลีกเลี่ยงการสลักแบบโปร่งใสโดยทั่วไปเว้นแต่คุณจะรู้ว่าสิ่งที่คุณกำลังทำอยู่ (โปรดทราบว่า quartus ค่อนข้างจะทำให้เข้าใจผิด "สลักแบบ inffered" ในบางสถานการณ์ที่ไม่เกี่ยวข้องกับ ปลอดภัยอย่างสมบูรณ์แบบ)
ปีเตอร์กรีน

คำตอบ:


20

"สลัก" จะแตกต่างจาก "Flip-Flop" ซึ่ง FF จะเปลี่ยนเอาต์พุตในการตอบสนองต่อขอบนาฬิกาเท่านั้น แลตช์สามารถเปลี่ยนเอาต์พุตเพื่อตอบสนองต่อสิ่งอื่นที่ไม่ใช่นาฬิกา ตัวอย่างเช่น SR-Latch มีชุดและอินพุตรีเซ็ตและหากหนึ่งในนั้นทำงานอยู่ดังนั้นเอาต์พุตสามารถเปลี่ยนได้ ที่ไหนในฐานะ SR-FF เพียงตอบสนองต่อการตั้งค่าหรือรีเซ็ตเมื่อมีขอบนาฬิกา

ใน FPGA คุณต้องการให้ตรรกะของคุณซิงโครนัสอย่างเต็มที่ หมายความว่าองค์ประกอบหน่วยเก็บข้อมูลทั้งหมด (เช่นเดียวกับ FF) ถูกโอเวอร์คล็อกจากแหล่งสัญญาณนาฬิกาเดียว สิ่งใดที่ไม่ตรงกันกับนาฬิกานั้นจำเป็นต้องได้รับการปฏิบัติอย่างระมัดระวังมิฉะนั้นจะเกิดข้อผิดพลาดเกี่ยวกับเวลา

กลอนนั้นเป็นองค์ประกอบหน่วยเก็บข้อมูลแบบอะซิงโครนัส ไม่มีอินพุตนาฬิกาและไม่สามารถซิงโครไนซ์กับนาฬิกาใด ๆ ฉันควรทราบว่ามี FF ที่มีการรีเซ็ตแบบอะซิงโครนัสและอินพุตแบบรีเซ็ตและสิ่งเหล่านี้ควรได้รับการดูแลด้วยความระมัดระวังเช่นเดียวกับสลักแบบปกติ

การเข้าสู่ประเด็นการจับเวลาทั้งหมดที่สลักอาจเป็นสาเหตุที่เกินกว่าที่จะครอบคลุมได้ที่นี่ แต่ขอยกตัวอย่างหนึ่งตัวอย่าง:

สมมติว่าคุณมี SR-Latch และคุณต้องการให้ตั้งค่าทุกครั้งที่ตัวนับ 8 บิตมาถึงค่าที่แน่นอน ฉันไม่แน่ใจว่ารหัส Verilog จะเป็นอย่างไร แต่ใน VHDL รหัสคือ: set <= '1' เมื่อ count = "11010010" else '0'; สัญญาณชุดนั้นจะไปที่อินพุตที่ตั้งไว้บน SR-Latch ของเรา

ตรรกะที่สร้างขึ้นคือ combinatorial หมดจด; การผสมผสานของและ - ประตูหรือประตูและอินเวอร์เตอร์ (หรือ LUT) แต่เส้นทางของสัญญาณผ่านตรรกะเชิงผสมนั้นไม่ได้สมบูรณ์แบบเสมอไปและสัญญาณ "ชุด" อาจมีข้อบกพร่อง เส้นทางสัญญาณผ่านกลุ่มเฉพาะของประตูอาจใช้เวลานานกว่ากลุ่มอื่นทำให้การส่งออกชุดที่จะใช้งานในช่วงเวลาสั้น ๆ ก่อนที่จะส่งออกปักหลักลงในสถานะสุดท้าย

ความผิดพลาดของเอาต์พุตนี้อาจทำให้ SR-Latch ของเราถูกตั้งค่าแม้ว่าจะไม่ควรทำก็ตาม หากเราเปลี่ยนจาก SR-Latch ไปเป็น SR-FF โอเวอร์คล็อกนาฬิกาแบบเดียวกับที่นับจากนั้น SR-FF จะรอรอบนาฬิกาหนึ่งรอบก่อนที่จะเปลี่ยนสถานะ ในสาระสำคัญมันจะรอให้สัญญาณชุดที่จะตัดสินก่อนที่จะมองมัน

หากเส้นทางผ่านทาง combinatorial ลอจิกสำหรับสัญญาณที่ตั้งไว้นั้นถูกส่งไปต่างกัน (ทำให้เกิดความล่าช้าต่างกัน) พฤติกรรมการผิดพลาดก็จะเปลี่ยนเช่นกัน ตรรกะอาจทำงานได้ดี แต่เนื่องจากคุณเปลี่ยนบางสิ่งที่ไม่เกี่ยวข้องอย่างสิ้นเชิงตรรกะนี้จะถูกกำหนดเส้นทางแตกต่างกันและข้อผิดพลาดจะปรากฏขึ้น อุณหภูมิและแรงดันไฟฟ้าจะเปลี่ยนจังหวะเวลาของสัญญาณด้วยเช่นกันซึ่งสามารถเปลี่ยนพฤติกรรมการผิดพลาดได้

ความไม่แน่นอนในช่วงเวลานี้คือเหตุผลที่คุณควรหลีกเลี่ยงการสลักในตรรกะของคุณ FF มีความปลอดภัยในการใช้งานมาก นี่คือสาเหตุที่คอมไพเลอร์ของคุณเตือนคุณเกี่ยวกับแลตช์เนื่องจากง่ายต่อการทำสลักโดยไม่ตั้งใจและคุณอาจไม่ต้องการใช้มัน

แน่นอนว่าบางครั้งจำเป็นต้องใช้สลัก คุณเพียงแค่ต้องใช้มันน้อยมากเฉพาะเมื่อจำเป็นอย่างยิ่งเท่านั้นและจากนั้นคุณต้องออกแบบตรรกะให้ถูกต้องดังนั้นจึงไม่มีความผิดพลาดเกิดขึ้น


ฉันคาดหวังว่าหากมีใครระบุสลักใน verilog หรือภาษาอื่นอย่างชัดเจนและถ้าใครออกแบบวงจรเพื่อที่มันจะทำงานได้อย่างถูกต้องกับการรวมกันของความล่าช้าในการเลี้ยงลูกด้วยนมผสม combinatorial (หมายความว่าอะไรก็ตามที่สร้างสัญญาณที่จะรวมเข้าด้วยกัน latch จะทำเช่นนั้นแม้ในกรณีที่เลวร้ายที่สุดของการรวมกันของเส้นทางตรรกะศูนย์ล่าช้าและเส้นทางตรรกะสูงสุดล่าช้าความต้องการเวลาสำหรับสลักจะยังคงพบ) ซินควรจะสร้างวงจรการทำงาน ที่สลักตัวเองมีความล่าช้าไม่เป็นลบ อย่างไรก็ตามถ้า ...
supercat

... ใครคนหนึ่งใช้ตรรกะเชิงตรรกะและข้อเสนอแนะโดยไม่ระบุโหนดใด ๆ ที่ต้องมีความล่าช้าที่ไม่เป็นลบ ฉันขอขอบคุณตรรกะซิงโครนัสที่ออกแบบได้ง่ายกว่า async แต่อุปกรณ์จำนวนมากจำเป็นต้องปิดนาฬิกาเมื่อพวกเขาหลับเพื่อประหยัดพลังงานโดยไม่ตาย มันอาจจะน่าสนใจที่จะมีอุปกรณ์ที่ซิงโครนัสทั้งหมด แต่มีความสัมพันธ์กับแต่ละพินของเอาต์พุตลอจิกสำหรับ "รันถ้าพินสูง" และ "วิ่งถ้าพินต่ำ" พร้อมกับความสามารถในการสร้างนาฬิกาหาก หมุดใด ๆ ที่ระบุว่าจำเป็นต้องมี
supercat

ความสามารถดังกล่าวจะช่วยลดความจำเป็นในการใช้ async logic เนื่องจากอินพุตที่มาถึงในขณะที่อุปกรณ์กำลังหลับอยู่สามารถเพิ่มออสซิลเลเตอร์ภายในและวงจรภายในได้นานพอที่จะประมวลผลและรับรู้ คุณลักษณะดังกล่าวจะมีความหลากหลายมากกว่าการมีพิน "ปลุก" เดี่ยว แต่การออกแบบการปลุกเดี่ยวดูเหมือนจะเป็นสิ่งปกติ วิธีปลุกหลายครั้งเช่นฉันอธิบายจะกินซิลิคอนมากเกินไปหรือไม่ ฉันคิดว่าความต้องการซิลิคอนจะค่อนข้างน้อยเมื่อเทียบกับทุกอย่างบนชิป
supercat

13

อะไรทำให้สลักอนุมาน
สำหรับตรรกะเชิงผสม, เอาต์พุตของวงจรเป็นฟังก์ชันของอินพุตเท่านั้นและไม่ควรมีหน่วยความจำหรือสถานะภายใน (สลัก)

ใน Verilog ตัวแปรจะเก็บค่าก่อนหน้าถ้าไม่ได้กำหนดค่าในบล็อกเสมอ ต้องสร้างสลักเพื่อจัดเก็บมูลค่าปัจจุบัน

คำสั่งif-else ที่ไม่สมบูรณ์จะสร้างแลตช์ คำสั่งif-elseถูกพิจารณาว่า "ไม่สมบูรณ์" หากไม่ได้กำหนดสถานะเอาต์พุตสำหรับเงื่อนไขอินพุตที่เป็นไปได้ทั้งหมด คำสั่งcase ที่ไม่สมบูรณ์หรือคำสั่งcaseที่ไม่มีค่าดีฟอลต์คือ item

เหตุใดสลักจึงอนุมานไม่ดี
สลักที่อนุมานได้อาจทำหน้าที่เป็น 'สัญญาณเตือน' ที่การออกแบบลอจิกอาจไม่สามารถนำไปใช้ได้ตามที่ตั้งใจไว้ คำสั่ง if-elseหรือ case ที่สำคัญอาจหายไปจากการออกแบบ

แลตช์สามารถนำไปสู่ปัญหาเรื่องเวลาและสภาพการแข่งขัน พวกเขาอาจนำไปสู่ข้อเสนอแนะ combinatorial - เส้นทางของเอาท์พุทกลับไปที่อินพุต - ซึ่งไม่สามารถคาดการณ์ได้

เพื่อหลีกเลี่ยงการสร้างสลักที่อนุมาน:

  • รวมสาขาทั้งหมดของคำสั่งifหรือcase
  • กำหนดค่าให้กับสัญญาณเอาต์พุตทุกตัวในทุกสาขา
  • ใช้การกำหนดค่าเริ่มต้นในช่วงเริ่มต้นของกระบวนการดังนั้นทุกสัญญาณจะถูกกำหนด

บางส่วนถอดความจาก "FPGA Prototyping โดย Verilog ตัวอย่าง" โดย P. Chu


2
"การสร้างต้นแบบ FPGA โดย Verilog ตัวอย่าง" เป็นหนังสือที่ดีในการเรียนรู้ Verilog สำหรับการสังเคราะห์ มันมีตัวอย่างการออกแบบที่ดีตั้งแต่สิ่งของ combinatorial ขั้นพื้นฐานไปจนถึงลำดับขั้นพื้นฐานนำไปสู่การออกแบบที่มีประโยชน์เช่น UART, VGA, โปรเซสเซอร์คอร์คอร์ซอฟต์ (Picoblaze) และแม้แต่เกมปิงปอง นอกจากนี้ยังครอบคลุมถึงการทดสอบขั้นพื้นฐานและการจำลอง @ Randomblue คุณควรคว้าสำเนาหากคุณยังไม่ได้รับ ฉันเชื่อว่าเขาทำ VHDL ด้วยเช่นกัน
Oli Glaser

8

แลตช์นั้นใช้งานยากมากใน FPGAs หรือ CPLDs ผู้คนจำนวนมากจึงหลีกเลี่ยงมันได้อย่างสมบูรณ์ หนึ่งในเหตุผลคือ FPGA จำนวนมากไม่มีสลักในตัวดังนั้นจึงทำจากประตูตรรกะซึ่งอาจทำให้เกิดปัญหาเรื่องเวลาที่น่ารังเกียจ
นอกจากนี้คุณไม่สามารถควบคุมการหน่วงเวลาและสภาพการแข่งขันเมื่อใช้สลัก (เว้นแต่มีองค์ประกอบดั้งเดิม)

ฉันจะแนะนำไม่ให้ใช้สลักเว้นแต่คุณจะไม่สามารถทำได้โดยไม่ต้องใช้มัน (เช่นการยืมเวลาเพื่อให้ได้ความถี่สัญญาณนาฬิกาสูงสุดที่จำเป็น) และใช้เทคนิคการเข้ารหัสเพื่อทำให้สลักมีโอกาสน้อยลงโดยไม่ตั้งใจ


6

ตรรกะการออกแบบตามลำดับที่สร้างขึ้นโดยใช้ตรรกะ combinatorial และข้อเสนอแนะโดยทั่วไปทำให้สมมติฐานที่ดูเหมือนว่ามีเหตุผลเมื่อใช้ประตูทางกายภาพ: ที่เอาท์พุทประตูจะไม่เปลี่ยนแปลงในการตอบสนองต่อการเปลี่ยนแปลงในการป้อนข้อมูลจนกระทั่งบางครั้งหลังจากที่มีการเปลี่ยนแปลง มีบางโอกาสที่การสันนิษฐานนั้นอาจไม่เกิดขึ้นเมื่อใช้ประตูจริง (เช่นถ้าประตู NOR ที่รวดเร็วและอินเวอร์เตอร์ที่รวดเร็วถูกขับเคลื่อนด้วยสัญญาณที่เพิ่มขึ้นอย่างช้าๆจาก VSS ถึง VDD และหากอินเวอร์เตอร์สลับที่ 1.2 โวลต์ในขณะที่ NOR เกทไม่ได้เปลี่ยนจนกระทั่ง 1.7 โวลต์เกท NOR อาจเห็นเอาต์พุตของอินเวอร์เตอร์ต่ำลงก่อนที่จะเห็นว่าสัญญาณที่เพิ่มขึ้นอย่างช้าๆสูงขึ้นไป) แต่โดยทั่วไปปัญหาดังกล่าวสามารถแก้ไขได้ด้วยการเพิ่มบัฟเฟอร์เมื่อใดก็ตามที่มีการเปลี่ยนแปลงอย่างช้าๆ สัญญาณถูกส่งไปยังปลายทางมากกว่าหนึ่งแห่ง น่าเสียดาย,

ปัญหาคือว่าหากไม่ได้รับคำแนะนำอย่างชัดเจนผู้รวบรวม FPGA อาจเปลี่ยนวงจร combinatorial ด้วยวงจรที่แตกต่างกันโดยสิ้นเชิงซึ่งมีพฤติกรรมคงที่เหมือนเดิม แต่อาจมีจังหวะที่แตกต่างกันโดยสิ้นเชิง ตัวอย่างเช่นสมมติว่าฟังก์ชัน combinatorial ที่ซับซ้อน F รับอินพุตหกถึง U ถึง Z F ถูกป้อนโดยตรงไปยังวงจร P และ (F NAND Z) ถูกป้อนไปยังวงจร Q คอมไพเลอร์อาจตระหนักว่าค่าที่ป้อนกับ Q จะขึ้นอยู่กับ F เมื่อ Z อยู่ในระดับสูงและอาจคำนวณฟังก์ชัน F 'ซึ่งเป็นเหมือน F ยกเว้น Z ที่ถือว่าสูง Q อาจถูกเลี้ยงด้วย (F 'NAND Z) มากกว่า (F NAND Z) มันอาจเป็นไปได้อย่างสิ้นเชิงที่การรับรู้ที่มีประสิทธิภาพมากที่สุดของ P จะมีความล่าช้าของประตูห้าครั้ง แต่การรับรู้ที่มีประสิทธิภาพที่สุดของ Q จะมีเพียงสองข้อเท่านั้น ดังนั้น,

หากวงจรมีลูปป้อนกลับแบบคอมบิเนทีเรียลลูปคอมไพเลอร์ FPGA จะต้องเพิ่มโหนดสัญญาณทางกายภาพซึ่งจะมีความล่าช้าทางกายภาพซึ่งจะทำให้มีความล่าช้าในเชิงบวก โหนดดังกล่าวจะถูกเพิ่มในสถานที่ที่จำเป็นในการทำให้วงจรทำงานตามที่ต้องการ ไม่มีแม้แต่การรับประกันว่าการเปลี่ยนแปลงเล็กน้อยในการออกแบบจะไม่ทำให้คอมไพเลอร์เปลี่ยนจากตำแหน่งโดยพลการที่เกิดขึ้นกับการทำงานในโลกแห่งความเป็นจริงไปยังตำแหน่งที่แตกต่างกันซึ่งเกิดขึ้นล้มเหลว


0

รายละเอียดเกี่ยวกับวิธีการจับสลักในการออกแบบอธิบายสั้น ๆ ในลิงค์นี้

https://www.doulos.com/knowhow/fpga/latches/


1
ยินดีต้อนรับสู่ EE.SE! คุณสามารถปรับปรุงคำตอบของคุณโดยรวมถึงรายละเอียดที่เกี่ยวข้องจากลิงค์ วิธีนี้ช่วยให้มั่นใจได้ว่าคำตอบของคุณมีคุณภาพสูงแม้ว่าหน้าต้นฉบับจะหายไป
เดวิด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.