ข้อ จำกัด เรื่องเวลาสำหรับวงจรซิงโครไนซ์บัส


10

ฉันเป็นวงจรซิงโครไนซ์บัสเพื่อส่งต่อการลงทะเบียนทั่วโดเมนนาฬิกา

ฉันจะให้คำอธิบายที่ง่ายขึ้นโดยไม่ใช้ตรรกะการรีเซ็ตแบบอะซิงโครนัส

ข้อมูลถูกสร้างขึ้นในหนึ่งนาฬิกา การอัพเดตมีขอบเขตนาฬิกา (อย่างน้อยหนึ่งโหล) เป็นจำนวนมาก:

PROCESS (src_clk)
BEGIN
   IF RISING_EDGE(clock) THEN
      IF computation_done THEN
          data <= computation;
          ready_spin <= NOT ready_spin;
      END IF;
   END IF;
END PROCESS;

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

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      ready_spin_q3 <= ready_spin_q2;
      ready_spin_q2 <= ready_spin_q1;
      ready_spin_q1 <= ready_spin;
   END IF;
END PROCESS;

วงจรซิงโครไนเซอร์แนะนำการหน่วงเวลาสั้น ๆ ซึ่งให้เวลามากมายสำหรับดาต้าบัสเพื่อทำให้เสถียร ตัวอย่างบัสข้อมูลโดยตรงโดยไม่มีความเสี่ยงต่อการแพร่กระจาย:

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      IF ready_spin_q3 /= ready_spin_q2 THEN
         rx_data <= data;
      END IF;
   END IF;
END PROCESS;

สิ่งนี้รวบรวมและทำงานได้ดีเมื่อสังเคราะห์เป็น Cyclone II FPGA อย่างไรก็ตาม TimeQuest รายงานการตั้งค่าและระงับการละเมิดเวลาเนื่องจากไม่รู้จักเครื่องมือซิงโครไนซ์ แย่ลงคู่มือ Quartus กล่าวว่า

มุ่งเน้นไปที่การปรับปรุงเส้นทางที่แสดงหย่อนที่เลวร้ายที่สุด ช่างฟิตทำงานหนักที่สุดบนเส้นทางที่มีอาการหน่วงที่แย่ที่สุด ถ้าคุณแก้ไขเส้นทางเหล่านี้ Fitter อาจสามารถปรับปรุงเส้นทางเวลาที่ล้มเหลวอื่น ๆ ในการออกแบบ

ดังนั้นฉันต้องการเพิ่มข้อ จำกัด เวลาที่เหมาะสมให้กับโครงการของฉันเพื่อที่ Quartus จะใช้ความพยายามของช่างฟิตในด้านอื่น ๆ ของการออกแบบ

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

ฉันขอขอบคุณคำแนะนำเกี่ยวกับการเขียนข้อ จำกัด เรื่องเวลาของ SDC สำหรับ synchronizers หากคุณพบปัญหาเกี่ยวกับวิธีการนี้โปรดแจ้งให้เราทราบด้วย


รายละเอียดนาฬิกา:

ตัวสร้างสัญญาณนาฬิกาภายนอก: สองช่องสัญญาณ, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz, และที่เกี่ยวข้อง)

Altera PLL: src_clk = refclk * 9/5 = 36 MHz

Altera PLL: dest_clk = refclk2 * 10 = 100 MHz

ฉันยังมีข้อมูลไปในทิศทางอื่นด้วย 100 MHz src_clk และ 36 MHz dest_clk


TL: DR: อะไรคือข้อ จำกัด เวลาของ SDC ที่ถูกต้องสำหรับโค้ดด้านบน


1
สิ่งนี้จะดีกว่าในเว็บไซต์ออกแบบ FPGA ที่เสนอแต่ข้อเสนอนั้นยังไม่ถึงรุ่นเบต้า
Ben Voigt

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

@Andy: ฉันเพิ่มรายละเอียดบางอย่าง ขอบคุณที่ช่วยด้วย
Ben Voigt

คำตอบ:


9

ฉันไม่มีประสบการณ์กับ Quartus ดังนั้นให้ปฏิบัติตามคำแนะนำทั่วไป

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

สำหรับเส้นทางจากนาฬิกา 36 MHz (27.777 ns) ไปยังนาฬิกา 100 MHz (10 ns) ถ้าฉันคำนวณอย่างรวดเร็วอย่างถูกต้องคู่ของขอบที่ใกล้ที่สุดคือ 138.888 ns ในนาฬิกาต้นทางและ 140 ns บนนาฬิกาปลายทาง นั่นเป็นข้อ จำกัด 900 MHz ที่มีประสิทธิภาพสำหรับเส้นทางเหล่านั้น! ขึ้นอยู่กับการปัดเศษ (หรือสำหรับนาฬิกาที่ไม่มีความสัมพันธ์) มันอาจออกมาแย่กว่านั้น

มีอย่างน้อยสามวิธีในการเขียนข้อ จำกัด สำหรับโครงสร้างนี้ ฉันจะโทรหานาฬิกาfast_clkและslow_clkฉันคิดว่ามันชัดเจนสำหรับภาพประกอบ

ตัวเลือกที่ 1: ปิดใช้งานการกำหนดเวลาด้วย set_false_path

ทางออกที่ง่ายที่สุดคือการใช้set_false_pathเพื่อปิดใช้งานการกำหนดเวลาระหว่างนาฬิกา:

set_false_path -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_false_path -from [get_clocks slow_clk] -to [get_clocks fast_clk]

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

ตัวเลือกที่ 2: ผ่อนคลายข้อ จำกัด ด้วย set_multicycle_path

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

set_multicycle_path 2 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -setup
set_multicycle_path 1 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -hold

set_multicycle_path 1ความสัมพันธ์ขอบเริ่มต้นสำหรับการติดตั้งวงจรเดียวคือ คำสั่งเหล่านี้อนุญาตรอบนาฬิกาจุดปลาย ( -end) อีกรอบสำหรับการตั้งค่าพา ธ การ-holdปรับด้วยจำนวนที่น้อยกว่าข้อ จำกัด ในการตั้งค่าเป็นสิ่งจำเป็นเกือบทุกครั้งเมื่อตั้งค่าเส้นทางหลายรอบเพื่อดูเพิ่มเติมที่ด้านล่าง

หากต้องการ จำกัด เส้นทางในทิศทางอื่นในทำนองเดียวกัน (ผ่อนคลายข้อ จำกัด ในช่วงเวลาหนึ่งของนาฬิกาที่เร็วขึ้น) เปลี่ยน-endเป็น-start:

set_multicycle_path 2 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -setup
set_multicycle_path 1 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -hold

ตัวเลือก 3: ระบุข้อกำหนดโดยตรงด้วย set_max_delay

สิ่งนี้คล้ายกับเอฟเฟกต์ของset_multicycle_pathแต่ช่วยประหยัดไม่ต้องคิดผ่านความสัมพันธ์ของขอบและผลกระทบจากข้อ จำกัด การพัก

set_max_delay 10 -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_max_delay 10 -from [get_clocks slow_clk] -to [get_clocks fast_clk]

คุณอาจต้องการจับคู่สิ่งนี้กับset_min_delayเพื่อระงับการตรวจสอบหรือออกจากการตรวจสอบการพักที่เป็นค่าเริ่มต้น คุณอาจสามารถทำset_false_path -holdเพื่อปิดใช้งานการระงับการตรวจสอบหากเครื่องมือของคุณรองรับ


รายละเอียดเลือดของการเลือกขอบสำหรับเส้นทางหลายรอบ

เพื่อทำความเข้าใจกับการปรับการพักที่ได้รับการจับคู่กับการปรับการตั้งค่าแต่ละครั้งให้พิจารณาตัวอย่างง่ายๆนี้ที่มีความสัมพันธ์แบบ 3: 2 แต่ละหลักแสดงถึงขอบนาฬิกาที่เพิ่มขึ้น:

1     2     3
4   5   6   7

การตรวจสอบการตั้งค่าเริ่มต้นใช้ขอบ 2 และ 6 การตรวจสอบการพักเริ่มต้นใช้ขอบ 1 และ 4

การใช้ข้อ จำกัด แบบหลายรอบของ 2 ด้วยการ-endปรับการตั้งค่าเริ่มต้นและการตรวจสอบการระงับการใช้ขอบถัดไปหลังจากสิ่งที่พวกเขาใช้เดิมหมายถึงการตรวจสอบการตั้งค่าตอนนี้ใช้ขอบ 2 และ 7 และการตรวจสอบการระงับใช้ขอบ 1 และ 5 นาฬิกาที่ความถี่เดียวกันการปรับค่านี้เหมาะสม - การเปิดใช้ข้อมูลแต่ละครั้งสอดคล้องกับการดักจับข้อมูลหนึ่งครั้งและหากขอบการจับถูกย้ายออกไปหนึ่งการตรวจสอบการพักควรเลื่อนออกไปหนึ่งครั้ง ข้อ จำกัด แบบนี้อาจเหมาะสมสำหรับสองสาขาของนาฬิกาเดียวหากสาขาหนึ่งมีความล่าช้ามาก อย่างไรก็ตามสำหรับสถานการณ์ที่นี่การระงับการตรวจสอบที่ใช้ขอบ 1 และ 5 ไม่เป็นที่ต้องการเนื่องจากวิธีเดียวที่จะแก้ไขได้คือการเพิ่มรอบสัญญาณนาฬิกาทั้งหมดของการหน่วงเวลาบนเส้นทาง

ข้อ จำกัด การพักหลายรอบของ 1 (สำหรับการพักค่าเริ่มต้นคือ 0) ปรับขอบของนาฬิกาปลายทาง uesd สำหรับการพักการตรวจสอบย้อนหลังทีละหนึ่งขอบ การรวมกันของ MCP การตั้งค่า 2 รอบและข้อ จำกัด MCP 1 รอบจะส่งผลให้มีการตรวจสอบการตั้งค่าโดยใช้ขอบ 2 และ 7 และการตรวจสอบการพักโดยใช้ขอบ 1 และ 4


2

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

set_mulicycle_path ไม่ใช่สิ่งที่ถูกต้องที่จะใช้เพราะปกติแล้วจะจัดการกับกรณีเมื่อทั้งต้นทางและปลายทางอยู่ในโดเมนนาฬิกาเดียวกัน อีกครั้งฉันอ้างอิงจากประสบการณ์ Xilinx ของฉันดังนั้นระยะของคุณอาจแตกต่างกันไป


1

ฉันคิดว่ามันปลอดภัยที่จะวาง set_false_path บนตัวซิงโครไนซ์

นอกจากนี้คุณสามารถใส่ "set_global_assignment -name SYNCHRONIZER_IDENTIFICATION AUTO" ใน qsf เพื่อช่วยให้ Quartus ค้นพบซิงโครไนซ์


มันจะมีหน้าตาเป็นอย่างไร? set_false_path -from ready_spin -to ready_spin_q2? และset_false_path -from data -to rx_data?
Ben Voigt

set_false_path -from src_clk -to ready_spinฉันไม่แน่ใจว่าเป็นการเหมาะสมที่จะวางเส้นทางที่ผิดพลาดในข้อมูลเนื่องจากคุณไม่ได้ซิงโครไนซ์
fbo

0

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


จะไม่set_multicycle_pathเป็นวิธีที่จะบอกตัวสังเคราะห์ / ตัววิเคราะห์เวลาว่าสัญญาณต้นทางสามารถเปลี่ยนแปลงได้หรือไม่ และฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดย "นาฬิการถบัส" มีสัญญาณรถบัสที่นี่ข้ามโดเมนนาฬิกาดังนั้นคุณเรียกนาฬิกา "นาฬิการถบัส" ที่ว่าคืออะไร ฉันคิดว่าคุณกำลังขวาว่ามียังอาจจะ metastability dataถ้าสังเคราะห์แนะนำบกพร่องในช่วงระยะเวลาเมื่อฉันไม่ปรับปรุง ฉันเดาว่าฉันสามารถยกตัวอย่างบล็อก DFF ได้ที่นั่นโดยเฉพาะ: (
เบ็น Voigt

@ BenVoigt: ฉันคิดว่า "set_multicycle_path" มักจะใช้เพื่อบอกตัวตรวจสอบเวลาว่าห่วงโซ่ของตรรกะเชิงการรวมกันระหว่างจุดที่สองที่ล็อคควรได้รับอนุญาตให้ใช้ N (Tc) -Ts-Tp (N คูณรอบเวลาลบด้วยเวลาตัวอย่าง เวลาการแพร่กระจาย) แทนที่จะเป็นเพียง Tc-Ts-Th ฉันไม่รู้ว่าสิ่งนั้นจะโต้ตอบกับการล็อคด้วยนาฬิกาที่แตกต่างกันอย่างไร
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.