จะนำเข้ามาโคร SystemVerilog ได้อย่างไร

ฉันกำลังพัฒนาจอภาพ SystemVerilog ที่ขยาย ovm_monitor และฉันต้องการทราบวิธีนำเข้ามาโคร ovm ที่ฉันใช้ ฉันใช้:

`ovm_component_utils_begin
`ovm_field_string
`ovm_component_utils_end

ฉันลองทำสิ่งต่อไปนี้ที่ด้านบนของไฟล์ ซึ่งทั้งสองอย่างนี้ไม่ได้คอมไพล์:

import ovm_pkg::ovm_monitor;
import ovm_pkg::ovm_macros;

และ

import ovm_pkg::ovm_monitor;
`include "ovm_macros.svh"

ข้อผิดพลาดในการคอมไพล์ VCS:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "my_monitor.svh", 58 (expanding macro): token is '#'
  `ovm_component_utils_begin(my_monitor)
                                        ^

ใช้งานได้ต่อไปนี้ แต่ฉันถือว่าเป็นแนวปฏิบัติที่ไม่ดีที่จะใช้ * ในคำสั่งนำเข้า:

import ovm_pkg::*

person Victor Lyuboslavsky    schedule 29.02.2012    source แหล่งที่มา
comment
ข้อผิดพลาดในการคอมไพล์ของคุณคืออะไร? คำสั่งนำเข้าไม่ส่งผลกระทบต่อคำสั่งตัวประมวลผลล่วงหน้า เครื่องมือจะต้องพบพวกเขาก่อนซอร์สโค้ดของคุณ   -  person    schedule 01.03.2012
comment
ข้อผิดพลาดในการคอมไพล์เกิดขึ้นเมื่อคอมไพเลอร์มาถึงหนึ่งในมาโคร ovm ที่ฉันใช้ เว้นแต่ว่าฉันใช้ import ovm_pkg::*   -  person Victor Lyuboslavsky    schedule 01.03.2012
comment
ใช่ แต่ข้อผิดพลาดในการคอมไพล์คืออะไร? คุณควรใส่ข้อความที่ตรงกันทุกประการในคำถามของคุณ   -  person    schedule 02.03.2012
comment
โปรดทราบว่าคุณไม่สามารถนำเข้าคำจำกัดความของแมโครได้ เนื่องจากเป็นคำสั่งของตัวประมวลผลล่วงหน้าของคอมไพเลอร์ที่ไม่ได้อยู่ในแพ็คเกจใดๆ   -  person dave_59    schedule 10.10.2013


คำตอบ (4)


การนำเข้าด้วย * เป็นแนวทางปฏิบัติที่ดีที่สุดจริงๆ

การนำเข้าด้วย * ทำให้มองเห็นเนื้อหาแพ็คเกจทั้งหมดได้ แต่จะไม่ทำการนำเข้าจริงจนกว่าจะใช้งาน การนำเข้าฟังก์ชันตามชื่อจะนำเข้าฟังก์ชันทันทีไม่ว่าจะใช้หรือไม่ก็ตาม (นั่นคือแนวทางปฏิบัติที่ด้อยกว่า)

ผู้ใช้ OVM หรือ UVM ได้รับคำสั่งไม่ให้กำหนดคลาสหรือมาโครที่ผู้ใช้กำหนดโดยใช้คำนำหน้า "ovm_" เนื่องจาก OVM เวอร์ชันอนาคตอาจเพิ่ม ovm_classes หรือ `ovm_macros เพิ่มเติม ดังนั้นการนำเข้าแพ็คเกจ OVM ด้วย * จึงปลอดภัย

หากคุณต้องการนำเข้าสองแพ็คเกจที่มี * และหากทั้งสองแพ็คเกจมีชื่อฟังก์ชันเดียวกันที่กำหนดไว้ หากโค้ดของคุณไม่ได้ใช้ฟังก์ชันดังกล่าว ก็ไม่มีปัญหา หากโค้ดของคุณต้องการฟังก์ชัน ให้นำหน้าฟังก์ชันด้วย pkg2::function_name ซึ่งเป็นแนวทางปฏิบัติที่ดีที่สุดอีกครั้ง

ขอแสดงความนับถือ - Cliff Cummings - Verilog & SystemVerilog Guru

person Cliff Cummings    schedule 27.06.2012
comment
การนำเข้าด้วย * เป็นเพียงแนวทางปฏิบัติที่ดีที่สุดสำหรับ SV โดยทั่วไปเราควรหลีกเลี่ยงมลภาวะเนมสเปซและการนำเข้าโดยใช้ * ละเมิดสิ่งนี้ SV+UVM ใช้งานไม่ได้เล็กน้อย - ควรใช้แพ็คเกจสำหรับการแยกเนมสเปซหรือแบบแผนการตั้งชื่อ (เช่น ovm_pkg::function() หรือ ovm_function()) แต่การใช้ทั้งสองอย่างนั้นน่าเกลียดมาก! - person Chiggs; 11.12.2013
comment
โอ้สำหรับเนมสเปซที่มีลำดับชั้นที่เหมาะสมเหมือนที่เรามีใน Python! ฉันส่งข้อเสนอ VHDL บางทีเราอาจได้รับสิ่งที่ดีกว่านี้ เข้าสู่มาตรฐาน SystemVerilog ถัดไปหรือไม่ - person Chiggs; 11.12.2013

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

class top extends blah;



   typedef ovm_component_registry #(top,"top") type_id; 
           ^
   static function type_id get_type(); 
     return type_id::get(); 
   endfunction  

   const static string type_name = "top"; 
   virtual function string get_type_name (); 
     return type_name; 
   endfunction  

   static bit m_fields_checked = 0; 
   function void m_field_automation (ovm_object tmp_data__=null, 
                                     int what__=0, 
                                     string str__=""); 
   begin 
     top local_data__; /* Used for copy and compare */ 
     string string_aa_key; /* Used for associative array lookups */ 
     /* Check the fields if not already checked */ 
     if(what__ == OVM_CHECK_FIELDS) begin 
       if(! top::m_fields_checked) 
         top::m_fields_checked=1; 
       else 
         return; 
     end 
     /* Type is verified by ovm_object::compare() */ 
     super.m_field_automation(tmp_data__, what__, str__); 
     if(tmp_data__ != null) 
       /* Allow objects in same hierarchy to be copied/compared */ 
       if(!$cast(local_data__, tmp_data__)) return; 
     if(what__ == OVM_CHECK_FIELDS) begin 
       m_field_array.delete(); 
     end 

     end 
   endfunction(top)


endclass
person Community    schedule 02.03.2012

นี่ควรเป็นความคิดเห็นเกี่ยวกับคำตอบของ Adam12 แต่ฉันไม่สามารถเพิ่มความคิดเห็นได้

@Victor Lyuboslavsky หากคุณไม่ต้องการใช้ import ovm_pkg::* คุณจะต้องดูส่วนขยายมาโครหรือโค้ดขยายที่สร้างโดยมาโคร และ import ตัวระบุที่จำเป็น เช่น ovm_component_registry, ovm_object, OVM_CHECK_FIELDS (ตามคำตอบของ Adam12)

อย่างไรก็ตาม ในอนาคตมาโคร ovm_component_utils_* หรือ ovm_field_* อาจเปลี่ยนแปลงให้มีตัวระบุ OVM มากขึ้น และคุณจะต้องแก้ไขโค้ดเป็น import ตัวระบุเพิ่มเติมเหล่านี้

person Paddu    schedule 17.05.2013

น่าเสียดายที่ไม่มีทางเลือกมากมายในการนำเข้า ovm_pkg::* OVM ไม่ได้กำหนดชื่อทั้งหมดด้วยชื่อแพ็คเกจเป็นการภายใน ดังนั้นจึงแทบเป็นไปไม่ได้เลยที่จะรับโค้ดเพื่อคอมไพล์หากไม่มีมัน

person Steve K    schedule 01.03.2012
comment
ฉันถือว่าคุณหมายความว่ามาโครไม่มีคุณสมบัติของชื่อ ไม่สำคัญว่ารหัสในแพ็คเกจจะไม่สำคัญ ฉันไม่เคยสังเกตมาก่อน แต่การไม่ใช้ชื่อที่มีคุณสมบัติครบถ้วนนั้นค่อนข้างกระจอก ฉันสงสัยว่า UVM ดีกว่านี้หรือไม่ - person Paul S; 02.03.2012