淺析SystemVerilog之package


https://zhuanlan.zhihu.com/p/106486751
http://blog.eetop.cn/blog-1561828-2316833.html

  • SV中的module,interface,program,checker,都提供declaration空間,內部定義都local當前的那個scope,相互之間的building block不影響,不識別。
  • package也可以提供一個declaration的空間,可以被其他的building block共享,Package declaration可以被import到其他的building block中,或者package中。
  • package中不能再包含module,interface,program,checker等帶有declare屬性的聲明

import與include的區別?

  • include將文件中所有文本原樣插入包含的文件中。這是一個預處理語句,`include在import之前執行。
  • import不會復制文本內容。但是import可package中內容引入import語句所在的作用域。

package的使用方法

我們通過一個簡單的例子來進行一下說明。

package my_pkg;
    int y = 10;
    task common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*;

   initial begin
     $display("y = %0d",y);
     common();
   end

endprogram

運行結果:

 y = 10
 In my_pkg,Calledfrom somewhere
  • package中一般會定義一些變量,struct、function、task等,用於不同的scope之間共享。
  • 隱式import:😗
  • 顯式import::y;import::common();
  • 這里的顯式和隱式import都是可以的;

問題一:當需要import多個package的時候,有同名的變量的時候

package my_pkg_0;
    int x = 25;
    task common();
            $display("In my_pkg_0,Calledfrom somewhere");
    endtask
package my_pkg;
    int y = 10;
    task common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*;
   import my_pkg_0::*;

task common();
   $display("In program,Calledfromsomewhere");
endtask
   initial begin
     $display("x = %0d",x);
     $display("y = %0d",y);
     common();
     my_pkg::common();
     my_pkg_0::common();
   end

endprogram

運行結果:

x = 25
y = 10
In program.Calledfromsomewhere
In my_pkg.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
  • import多個package的時候,有同名函數或者變量的時候,一定要指名是哪個package的函數或者變量,否則的話,會報錯;
  • 頂層import的時候一定要全;

問題二:當需要多個package嵌套的時候,又要怎么處理呢?

package my_pkg_0;
    int x = 25;
    task common();
            $display("In my_pkg_0,Calledfrom somewhere");
    endtask
package my_pkg;
    import my_pkg_0::*;
    export my_pkg_0::x;
    export my_pkg_0::common;
    int y = 10;
    task common_0();
            common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*

task common();
   $display("In program,Calledfromsomewhere");
endtask
   initial begin
     $display("x = %0d",x);
     $display("y = %0d",y);
     common();
     my_pkg::common();
     my_pkg_0::common();
   end

endprogram

運行結果:

x = 25
y = 10
In program.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
In my_pkg.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
  • 一個package調用另一個package,需要import:😗;
  • 並且一定要顯示調用export::x,export::common(如果是function/task的export,可以用隱式調用export my_pkg_0:😗)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM