ทำให้ UVM เร็วขึ้นผ่านระบบการกำหนดค่าใหม่ - Semiwiki

ทำให้ UVM เร็วขึ้นผ่านระบบการกำหนดค่าใหม่ – Semiwiki

โหนดต้นทาง: 3036575

Universal Verification Methodology (UVM) เป็นวิธีที่ได้รับความนิยมในการช่วยตรวจสอบการออกแบบ SystemVerilog และประกอบด้วย ระบบการกำหนดค่า น่าเสียดายที่มีปัญหาด้านความเร็วและการใช้งานอยู่บ้าง Rich Edelman จาก Siemens EDA ได้เขียนรายงานที่มีรายละเอียดจำนวน 20 หน้าในหัวข้อวิธีหลีกเลี่ยงปัญหาเหล่านี้ และฉันได้อ่านบทความนี้เพื่อสรุปประเด็นสำคัญสำหรับคุณแล้ว วิศวกรตรวจสอบใช้ฐานข้อมูลการกำหนดค่า UVM เพื่อตั้งค่า จากนั้นจึงรับค่าในภายหลังในการทดสอบ UVM ตัวอย่างหนึ่งของการตั้งค่าและรับค่า 'T' คือ:

uvm_config#(T)::set(ขอบเขต, instance_path_name, field_name, ค่า);

uvm_config#(T)::get(ขอบเขต, instance_path_name, field_name, ค่า);

การเชื่อมต่อม้านั่งทดสอบ UVM กับอุปกรณ์ที่ทดสอบจะใช้ฐานข้อมูลการกำหนดค่าเพื่อส่งผ่านอินเทอร์เฟซเสมือน มีปัญหาสามประการในการใช้การกำหนดค่า UVM:

  • โค้ดขนาดใหญ่ โค้ดประมาณ 2,600 บรรทัด
  • ต้องมีการจับคู่ประเภทที่ตรงกัน ดังนั้น 'int' และ 'bit' จึงไม่เหมือนกัน
  • รหัสช้า

ลองพิจารณากรณีของโค้ดที่ช้า เนื่องจากการเรียกใช้ set() นับพันครั้งโดยใช้ชื่อที่มีไวด์การ์ดอาจใช้เวลานานถึง 30 นาทีในการทำให้เฟส 'set' และ 'get' เสร็จสมบูรณ์

เวลาที่ผ่านไป นาที

Rich เสนอโซลูชันใหม่สำหรับการกำหนดค่า UVM ที่มีความเร็วที่เร็วกว่ามาก โดยใช้เวลาเพียงไม่กี่วินาทีในการเปรียบเทียบ

โซลูชั่นใหม่ขั้นต่ำ

หากโค้ด UVM ของคุณหลีกเลี่ยงการใช้ไวด์การ์ดและมีคำสั่ง 'set' เพียงไม่กี่คำสั่ง โค้ดของคุณก็จะทำงานเร็วขึ้น

วิธีแก้ไขที่เป็นไปได้สำหรับปัญหาการกำหนดค่า UVM ได้แก่:

  • ใช้ตัวแปรร่วมแทน
  • ใช้การกำหนดค่า UVM กับหนึ่งชุด ()
  • ใช้การกำหนดค่า UVM กับชุดไม่กี่ชุด ()
  • ใช้แผนผังการกำหนดค่า
  • ลองทำสิ่งที่แตกต่าง

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

รายการการกำหนดค่าใหม่ของคุณถูกกำหนดไว้ในคลาสที่ได้รับจาก 'config_item' และตัวอย่างด้านล่างแสดง 'int value' เป็นคุณสมบัติที่กำลังตั้งค่า เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่อง คุณจะต้องเพิ่มฟังก์ชัน Pretty-print

คลาส my_special_config_item ขยาย config_item;
ฟังก์ชั่นใหม่ (ชื่อสตริง = "my_special_config_item");
super.ใหม่ (ชื่อ);
ฟังก์ชั่นสุดท้าย

ค่า int;

สตริงฟังก์ชันเสมือน Convert2string();
กลับ $sformatf("%s - value=%0d ", get_name(), value, super.convert2string());
ฟังก์ชั่นสุดท้าย
 คลาสสุดท้าย

'config_item' มีแอตทริบิวต์ชื่อ และชื่อนี้จะถูกค้นหา บวกกับชื่ออินสแตนซ์ วัตถุการกำหนดค่ายังมีฟังก์ชัน get_name() เพื่อส่งคืนชื่อ หากต้องการค้นหา “instance_name.field_name” ใดๆ ฐานข้อมูลการกำหนดค่าจะใช้อาร์เรย์ที่เชื่อมโยงเพื่อความเร็วในการค้นหาและการสร้างที่รวดเร็ว
สำหรับการตรวจสอบย้อนกลับ คุณสามารถค้นหาได้ว่าใครเป็นคนตั้งค่าหรือใครเป็นผู้เรียก get เนื่องจากชื่อไฟล์และหมายเลขบรรทัดเป็นฟิลด์ในการเรียกใช้ฟังก์ชัน set() และ get()

ชุด (null, "top.a.b.*", "ความเร็ว", my_speed_config, `__FILE__, `__LINE__)
รับ (null, "top.a.b.c.d.monitor1", "ความเร็ว", speedconfig, `__FILE__, `__LINE__)

สามารถพิมพ์คิวตัวเข้าถึงได้ในระหว่างการดีบักเพื่อดูว่าใครเป็นผู้เรียก set() และ get()

เพื่อรองรับไวด์การ์ด จำเป็นต้องเพิ่มกลไกการค้นหาโดยใช้คอนเทนเนอร์ พิจารณาชื่ออินสแตนซ์ 'top.a.b.c.d.*_0'

ต้นไม้คอนเทนเนอร์ขั้นต่ำ
ต้นไม้คอนเทนเนอร์

ส่วนไวด์การ์ดของชื่ออินสแตนซ์ได้รับการจัดการโดยใช้แผนผังคอนเทนเนอร์ แทนอาร์เรย์ที่เชื่อมโยง

สรุป

การแบ่งปันข้อมูลระหว่างโมดูล/อินสแตนซ์และโลกตามคลาสในเครื่องทดสอบ UVM สามารถทำได้โดยใช้ฐานข้อมูลการกำหนดค่า UVM เพียงระวังการชะลอตัวของความเร็ว หากวิธีการของคุณใช้การกำหนดค่าจำนวนมาก ให้ลองใช้แนวทางใหม่ที่นำเสนอซึ่งมีแพ็คเกจที่ใช้โค้ดประมาณ 300 บรรทัด แทนที่จะเป็นโค้ด 2,600 บรรทัดในไฟล์ฐานข้อมูลการกำหนดค่า UVM

อ่านบทความเต็ม 20 หน้า หลีกเลี่ยงความบ้าคลั่งในการกำหนดค่าด้วยวิธีง่ายๆ ที่ Siemens EDA

บล็อกที่เกี่ยวข้อง

แชร์โพสต์นี้ผ่าน:

ประทับเวลา:

เพิ่มเติมจาก กึ่งวิกิ