ความแตกต่างระหว่าง Verilog การบล็อกและการบล็อกที่ไม่ใช่การบล็อก


15

ฉันกำลังอ่านหน้านี้http://www.asic-world.com/verilog/verilog_one_day3.htmlเมื่อฉันเจอสิ่งต่อไปนี้:

โดยปกติเราต้องรีเซ็ต flip-flop ดังนั้นทุกครั้งที่นาฬิกาทำการเปลี่ยนจาก 0 เป็น 1 (posedge) เราตรวจสอบว่าการรีเซ็ตถูกยืนยัน (การซิงโครนัสรีเซ็ต) จากนั้นเราจะใช้ตรรกะปกติ หากเรามองอย่างใกล้ชิดเราจะเห็นว่าในกรณีของตรรกะเชิงผสมเรามี "=" สำหรับการมอบหมายและบล็อกตามลำดับเรามีตัวดำเนินการ "<=" ก็คือ "=" กำลังบล็อกการกำหนดและ "<=" เป็นการกำหนดการบล็อกที่ไม่ใช่ "=" เรียกใช้งานโค้ดตามลำดับภายในจุดเริ่มต้น / สิ้นสุดในขณะที่การบล็อก "<=" ทำงานแบบขนาน

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

คำตอบ:


21

ค่อนข้างแน่ใจว่าการมอบหมายที่ไม่ใช่การปิดกั้นเป็นลำดับในขณะที่การบล็อกการมอบหมายนั้นขนานกัน

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

การมอบหมายการไม่บล็อกจะดำเนินการแบบขนานเพราะจะอธิบายการมอบหมายที่เกิดขึ้นทั้งหมดในเวลาเดียวกัน ผลลัพธ์ของข้อความสั่งบนบรรทัดที่ 2 จะไม่ขึ้นอยู่กับผลลัพธ์ของข้อความสั่งในบรรทัดที่ 1 แต่บรรทัดที่ 2 จะทำงานเหมือนว่าบรรทัดที่ 1 ยังไม่เกิดขึ้น


ดังนั้นสิ่งที่เกี่ยวกับกำหนดงบ? พวกเขาอยู่ในชั้นเรียนของตัวเองหรือไม่?
Void Star

4
ใช่assignคำสั่งเกิดขึ้นนอกบล็อกเสมอและโดยทั่วไปจะใช้เพื่ออธิบายถึงตรรกะเชิงตรรกะ (ไม่สลัก) combinatorial (ในขณะที่บล็อกเสมอมีข้อยกเว้นบางอย่างอธิบายตรรกะลำดับ) AFAIK assignข้อความสั่งจะ "เสมอ" เสมอเมื่อใดก็ตามที่ LHS มีการเปลี่ยนแปลงค่า
โฟตอน

โอเค ... ฉันเริ่มรู้สึกว่า Verilog ไม่ใช่ภาษาที่ออกแบบอย่างหรูหราที่สุด นี่เป็นเหมือนการเรียนรู้ C
Void Star

1
Verilog ถูกออกแบบมาเพื่อ "อธิบาย" ฮาร์ดแวร์ที่มีอยู่แล้ว การใช้มันเป็นภาษาในการออกแบบ (สังเคราะห์) ฮาร์ดแวร์คือแฮ็ค
โฟตอน

4
ถ้า Verilog "ชอบการเรียนรู้ C" เป็นปัญหาลองดู VHDL บางคนมีการตั้งค่าที่ค่อนข้างแข็งแกร่งสำหรับหนึ่งหรืออื่น ๆ สำหรับบางคน VHDL เป็นเพียง verbose เกินไป สำหรับฉันมันเป็นความคิดที่ดีกว่ามาก (ความหมายของการมอบหมายสัญญาณ / ตัวแปรนั้นชัดเจนกว่าการบล็อก / ไม่เช่น) stackoverflow.com/questions/13954193/ …และsigasi.com/content/vhdls-crown-jewelคุณอาจจะชอบหรือเกลียดมัน แต่มันก็คุ้มค่ากับการดู
Brian Drummond

6

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

การมอบหมายการบล็อกจะมีผลทันทีที่ถูกประมวลผล การมอบหมายที่ไม่ปิดกั้นจะเกิดขึ้นในตอนท้ายของการประมวลผล "เวลาเดลต้า" ปัจจุบัน

บล็อกเสมอสามารถใช้ในการสร้างแบบจำลองทั้งตรรกะเชิงผสมหรือเชิงลำดับ (systemverilog มี always_comb และ always_ff เพื่อทำให้เรื่องนี้ชัดเจน) เมื่อสร้างแบบจำลองตรรกะเชิงผสมมันมักจะมีประสิทธิภาพมากกว่าในการใช้ = แต่โดยทั่วไปแล้วมันไม่สำคัญ

เมื่อสร้างแบบจำลองตรรกะลำดับ (เช่น always @ (posedge clk)) โดยปกติคุณจะใช้การประเมินที่ไม่ปิดกั้น สิ่งนี้ช่วยให้คุณสามารถกำหนด "สถานะหลังจากขอบนาฬิกา" ในแง่ของ "สถานะก่อนขอบนาฬิกา"

บางครั้งมีประโยชน์ในการใช้การบล็อกการมอบหมายตามลำดับบล็อกเป็น "ตัวแปร" เสมอ หากคุณทำสิ่งนี้มีกฎสำคัญสองข้อที่ต้องคำนึงถึง

  1. ห้ามเข้าถึง reg ที่ตั้งค่าด้วยการบล็อกการมอบหมายภายในบล็อกตามลำดับจากด้านนอกเสมอบล็อกที่กำหนดไว้
  2. อย่าผสมการบล็อกและการบล็อกที่ไม่ใช่การบล็อกเข้ากับ reg เดียวกัน

การทำลายกฎเหล่านี้มีแนวโน้มที่จะส่งผลให้เกิดความล้มเหลวในการสังเคราะห์และ / หรือความแตกต่างของพฤติกรรมระหว่างการจำลองและการสังเคราะห์


"" อย่าเข้าถึง reg ที่ถูกตั้งค่าด้วยการบล็อกการมอบหมายภายในซีเควนเชียลเสมอจากนอกบล็อกที่มันกำหนดไว้เสมอ "" คุณช่วยอธิบายได้ไหม?
user125575

บล็อกที่เรียงตามลำดับที่แตกต่างกันไม่มีลำดับที่กำหนดไว้ ดังนั้นการอ่านชุด "reg" ที่มีการกำหนด assingment ในบล็อกหนึ่งบล็อกจากอีกบล็อกหนึ่งเสมอจะนำไปสู่พฤติกรรมที่ไม่สามารถคาดเดาได้
Peter Green

และแม้ว่ามันจะทำงานในการจำลอง แต่เครื่องมือสังเคราะห์ควรดูและพูดว่า "ไม่" ฉันใช้ regs ท้องถิ่นสำหรับ vars กลางเหล่านั้นและตรวจสอบให้แน่ใจว่าพวกเขาได้รับมอบหมายให้เสมอในทุก ๆ นาฬิกาก่อนที่จะถูกอ่านเพื่อให้ไม่มี 'พื้นที่เก็บข้อมูล' โดยนัย
greggo

IIRC อย่างน้อยในควอตัสถือว่าเป็นคำเตือนเท่านั้นไม่ใช่ข้อผิดพลาด
Peter Green

5

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

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

จากมุมมองทางกฎหมายมันทำงานได้ดีมาก ในความเป็นจริงคุณสามารถพิจารณาการ=ดำเนินการบล็อก (เรียงตามลำดับเวลา) ได้แม้ในalways_combลำดับ อย่างไรก็ตามความแตกต่างระหว่างอนุกรมเวลาและขนานทำให้ไม่มีความแตกต่างอย่างแน่นอนในกรณีนี้เพราะalways_combบล็อกถูกกำหนดให้ทำซ้ำจนกระทั่งลำดับการสอนมาบรรจบกันในสถานะเสถียร - ซึ่งเป็นสิ่งที่วงจรฮาร์ดแวร์จะทำ (ถ้าตรงตามเวลา) ความต้องการ)

ชุดย่อยที่สังเคราะห์ได้ของ Verilog (และโดยเฉพาะ SystemVerilog) นั้นง่ายและใช้งานง่ายมาก - เมื่อคุณรู้สำนวนที่จำเป็น คุณต้องผ่านการใช้คำศัพท์ที่เกี่ยวข้องกับองค์ประกอบด้านพฤติกรรมในภาษาอย่างชาญฉลาด


ในรูปแบบการเข้ารหัสพฤติกรรม ( เมื่อเทียบกับ RTL ) ความแตกต่างระหว่างการบล็อกและการไม่บล็อกอาจมีความเกี่ยวข้อง ในบางกรณีเครื่องมือการสังเคราะห์อาจสามารถสรุป RTL ที่เทียบเท่ากับการใช้งานได้จากการออกแบบองค์ประกอบด้านพฤติกรรม
nobar

ของหลักสูตรขั้นตอนโหมดของการ SystemVerilog ใช้งานได้โดยเฉพาะอย่างยิ่งinitialงบภายในprogramบล็อกการใช้งาน (เวลาตามลำดับ) การปิดกั้นการกำหนดเฉพาะ สิ่งนี้มีประโยชน์สำหรับการออกแบบtestbenchแต่โดยทั่วไปไม่ใช่ข้อกำหนด RTL
nobar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.