日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SystemVerilog声明的位置

發(fā)布時間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SystemVerilog声明的位置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SystemVerilog聲明的位置

1、包(package)
(1)包的定義
SystemVerilog的包在package和endpackage之間定義
包中可以包含的可綜合的結(jié)構(gòu)有
(1)parameter和localparam常量定義
(2)const變量定義
(3)typedef用戶定義類型
(4)全自動task和function定義
(5)從其他包中import語句
(6)操作符重載定義

在包中還可以進行全局變量聲明、靜態(tài)任務(wù)定義和靜態(tài)函數(shù)定義。但是這些是不可綜合的。

包是一個獨立的聲明空間,不需要包含在Verilog模塊中。

package definitions;paramter VERSION = "1.1";typedef enum{ADD,SUB,MUL} opcodes_t;typedef struct{logic [31:0] a,b;opcodes_t opcode;}instruction_t;function automatic [31:0] multiplier(input [31:0] a,b);//用戶定義的32位乘法return a*b;endfunction endpackage

包中的參數(shù)不能重新定義
包中可能包含parameter、localparam和const等常量定義。paramter和localparam常量是Verilog結(jié)構(gòu)。const常量是SystemVerilog常量。在Verilog中,模塊(module)的每個實例可以對paramter常量重新定義,但不能對localparam常量重新定義。但是在包中的paramter不能被重新定義,因為它不是模塊實例的一部分。在包中,parameter和localparam是相同的。

(2)引用包的內(nèi)容
模塊和接口可以用四種方式引用包中的定義個聲明
(1)用范圍解析操作符直接引用
(2)將包中特定子項導入到模塊或接口中。
(3)用通配符導入包中的子項到模塊或接口中
(4)將包中子項導入到$unint聲明域中

::用來引用包中的子項

使用作用域解析操作符進行包的引用
相對于Verilog,SyetemVerilog增加了作用域解析操作符“::”。這一操作符允許通過包的名稱直接引用包,然后選擇包中特定的定義或聲明。包名和包中子項由雙冒號(::)隔開。

使用::作用域解析操作符進行包的引用(有利于源代碼的可讀性,但是,當包中的一項或多項需要在模塊中多次引用時,每次顯示地引用包的名稱太過于麻煩了,我們可能希望將包中子項導入到設(shè)計塊中)

module ALU ( input definitions::instruction_t IW,input logic clock,output logic[31:0] result ); always_ff @(posedge clock) begincase(IW.opcode)definitions::ADD : result = IW.a + IW.b;definitions::SUB : result = IW.a - IW.b;definitions::MUL : result = definitions::multiplier(IW.a,IW.b);endcase end endmodule

導入包中的特定子項
SystemVerilog允許用import語句將包中特定子項導入到模塊中。當包中定義或聲明導入到模塊或接口中時,該子項在模塊或接口內(nèi)是可見的,就好像它是該模塊或接口內(nèi)是可見的,就好像它是該模塊或接口中的一個局部定義名一樣,這樣就不需要每次引用包中子項時都顯示引用包名。導入包定義或聲明可以簡化模塊中的代碼。

module ALU ( input definitions::instruction_t IW,input logic clock,output logic[31:0] result ); import definitions::ADD; import definitions::SUB; import definitions::MUL; import definitions::multiplier; always_comb @(posedge clock) begincase(IW.opcode)ADD : result = IW.a + IW.b;SUB : result = IW.a - IW.b;MUL : result = multiplier(IW.a,IW.b);endcase end endmodule

注意:導入枚舉類型定義并不導入那個定義使用的元素

import definitions::opcode_t //該導入語句不會起作用

這個導入語會使用戶定義的類型opcode_t在模塊中可見。但是它不會使opcode_t中使用的枚舉元素可見。為了使元素在模塊內(nèi)成為可見的局部名稱,每個枚舉元素必須顯示導入。當有許多子項需要從包中導入時,使用通配符導入更使用。

包中子項的通配符導入
SystemVerilog允許包中子項使用統(tǒng)配符導入,而不用指定包中子項名稱,通配符記號是一個星號(*)

import definitions::*;//通配符導入 //通配符導入可使包中所有子項都成為可見的 //通配符導入并不自動導入整個包

當使用通配符導入包中子項時,只有在模塊或接口中實際使用子項才會被真正導入。沒被引用的包中的定義和聲明不會被導入。
模塊或接口內(nèi)的局部定義和聲明優(yōu)先于通配符導入。包中指定子項名稱的導入也優(yōu)先于通配符導入。從設(shè)計者的角度來看通配符導入只是簡單地將包添加到標識符(identifier)搜索規(guī)則中。軟件工具先搜索局部聲明,然后在通配符導入的包中搜索,最后工具將在$unit聲明域中搜索。

module ALU ( input definitions::instruction_t IW,input logic clock,output logic[31:0] result ); import definitions::*;//通配符導入always_comb @(posedge clock) begincase(IW.opcode)ADD : result = IW.a + IW.b;SUB : result = IW.a - IW.b;MUL : result = multiplier(IW.a,IW.b);endcase end endmodule

對于模塊中端口IW,包名仍須顯示引用,因為不能在關(guān)鍵字module和模塊端口定義之間加入一個import語句。但是有一種方法可以避免在端口列表中顯示引用包的名稱,那就是使用$unit聲明域。

為了綜合,包中的任務(wù)和函數(shù)必須是自動的
當模塊引用一個包中定義的任務(wù)或函數(shù)時,綜合會復制該任務(wù)或函數(shù)的功能并把它看做是已經(jīng)在模塊中定義了的。為了能夠綜合,包中定義的任務(wù)和函數(shù)必須聲明為automatic,并且不能包含靜態(tài)變量。這是因為自動任務(wù)和函數(shù)的儲存區(qū)在每次調(diào)用時才會分配。因此引用包中自動任務(wù)或函數(shù)的每個模塊看是不是被其他模塊共享的該任務(wù)或函數(shù)儲存區(qū)的唯一副本。這就保證了綜合前對包中任務(wù)或函數(shù)引用的仿真行為與中和后的行為相同,綜合后,這些任務(wù)或函數(shù)的功能就在引用的一個或多個模塊中實現(xiàn)。
綜合不支持包中變量聲明。仿真時,包中的變量會被導入該變量的所有模塊共享。一個模塊向量寫值,另一模塊看到的就將是新值。這類不通過模塊端口傳遞數(shù)據(jù)的模塊間通信是不可綜合的。

總結(jié)

以上是生活随笔為你收集整理的SystemVerilog声明的位置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。