verilog編譯指令詳解
以`(反引號(hào))開(kāi)始的某些標(biāo)識(shí)符是編譯器指令。在Verilog 語(yǔ)言編譯時(shí),特定的編譯器指令在整個(gè)編譯過(guò)程中有效(編譯過(guò)程可跨越多個(gè)文件),直到遇到其它的不同編譯程序指令。完整的標(biāo)準(zhǔn)編譯器指令如下:
1、`define 和`undef
`define指令用于文本替換,它很像C語(yǔ)言中的#define 指令,如:
一旦`define 指令被編譯,其在整個(gè)編譯過(guò)程中都有效。例如,通過(guò)另一個(gè)文件中的`define指令,MAX_BUS_SIZE 能被多個(gè)文件使用。
`undef 指令取消前面定義的宏。例如:
2、 `ifdef、`else 和`endif
這些編譯指令用于條件編譯,如下所示:
在編譯過(guò)程中,如果已定義了名字為WINDOWS的文本宏,就選擇第一種參數(shù)聲明,否則選擇第二種參數(shù)說(shuō)明。
`else 程序指令對(duì)于`ifdef 指令是可選的。
3、`default_nettype
該指令用于為隱式線網(wǎng)指定線網(wǎng)類(lèi)型。也就是將那些沒(méi)有被說(shuō)明的連線定義線網(wǎng)類(lèi)型。
`default_nettype wand
該實(shí)例定義的缺省的線網(wǎng)為線與類(lèi)型。因此,如果在此指令后面的任何模塊中沒(méi)有說(shuō)明的連線,那么該線網(wǎng)被假定為線與類(lèi)型。
4、`include
`include 編譯器指令用于嵌入內(nèi)嵌文件的內(nèi)容。文件既可以用相對(duì)路徑名定義,也可以用全路徑名定義, 例如:
5、`resetall
該編譯器指令將所有的編譯指令重新設(shè)置為缺省值。
`resetall
例如,該指令使得缺省連線類(lèi)型為線網(wǎng)類(lèi)型。
6、`timescale
在Verilog HDL 模型中,所有時(shí)延都用單位時(shí)間表述。使用`timescale編譯器指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián)。該指令用于定義時(shí)延的單位和時(shí)延精度。`timescale編譯器指令格式為:
`timescale time_unit / time_precision
time_unit 和time_precision 由值1、10、和100以及單位s、ms、us、ns、ps和fs組成。例如:
`timescale 1ns/100ps
表示時(shí)延單位為1ns, 時(shí)延精度為100ps。`timescale編譯器指令在模塊說(shuō)明外部出現(xiàn), 并且影響后面所有的時(shí)延值。例如:
//規(guī)定了上升及下降時(shí)延值。
endmodule
編譯器指令定義時(shí)延以ns為單位,并且時(shí)延精度為1/10 ns(100 ps)。因此,時(shí)延值5.22對(duì)應(yīng)5.2ns, 時(shí)延6.17對(duì)應(yīng)6.2 ns。如果用如下的`timescale程序指令代替上例中的編譯器指令,
`timescale 10ns/1ns
那么5.22對(duì)應(yīng)52ns, 6.17對(duì)應(yīng)62ns。
在編譯過(guò)程中,`timescale指令影響這一編譯器指令后面所有模塊中的時(shí)延值,直至遇到另一個(gè)`timescale指令或`resetall指 令。當(dāng)一個(gè)設(shè)計(jì)中的多個(gè)模塊帶有自身的`timescale編譯指令時(shí)將發(fā)生什么?在這種情況下,模擬器總是定位在所有模塊的最小時(shí)延精度上,并且所有時(shí) 延都相應(yīng)地?fù)Q算為最小時(shí)延精度。例如,
在這個(gè)例子中,每個(gè)模塊都有自身的`timescale編譯器指令。`timescale編譯器指令第一次應(yīng)用于時(shí)延。因此,在第一個(gè)模塊中,5.22對(duì)應(yīng)5.2 ns, 6.17對(duì)應(yīng)6.2 ns; 在第二個(gè)模塊中5.21對(duì)應(yīng)52 ns, 10.4對(duì)應(yīng)104 ns, 15對(duì)應(yīng)150 ns。如果仿真模塊TB,設(shè)計(jì)中的所有模塊最小時(shí)間精度為100 ps。因此,所有延遲(特別是模塊TB中的延遲)將換算成精度為100 ps。延遲52 ns現(xiàn)在對(duì)應(yīng)520*100ps,104對(duì)應(yīng)1040*100 ps,150對(duì)應(yīng)1500*100 ps。更重要的是,仿真使用100 ps為時(shí)間精度。如果仿真模塊AndFunc,由于模塊TB不是模塊AddFunc的子模塊,模塊TB中的`timescale程序指令將不再有效。
7、`unconnected_drive和`nounconnected_drive
在模塊實(shí)例化中,出現(xiàn)在這兩個(gè)編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態(tài)或者為反偏電路狀態(tài)。
8、`celldefine 和`endcelldefine
這兩個(gè)程序指令用于將模塊標(biāo)記為單元模塊。它們表示包含模塊定義,如下例所示。
某些PLI例程使用單元模塊。
verilog編譯器指示語(yǔ)句(數(shù)字IC)
設(shè)計(jì)者在寫(xiě)設(shè)計(jì)代碼時(shí),有時(shí)可能針對(duì)仿真寫(xiě)一些語(yǔ)句,這些語(yǔ)句可能是不為DC所接受,也不希望DC接受;設(shè)計(jì)者如果不對(duì)這些語(yǔ)句進(jìn)行特殊說(shuō)明,DC讀入設(shè)計(jì)代碼時(shí)就會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤。另一種情況是,設(shè)計(jì)者在寫(xiě)設(shè)計(jì)代碼,有些設(shè)計(jì)代碼是為專(zhuān)有的對(duì)象寫(xiě)的(如公司內(nèi)部),這些專(zhuān)有的設(shè)計(jì)代碼可能不希望被綜合。Synopsys提供了引導(dǎo)語(yǔ)句,設(shè)計(jì)者可以使用這些引導(dǎo)語(yǔ)句控制DC綜合的對(duì)象
可以利用HDL描述中的一些特定的注釋語(yǔ)句來(lái)控制綜合工具的工作,從而彌補(bǔ)仿真環(huán)境和綜合環(huán)境之間的差異,這些注釋語(yǔ)句稱(chēng)為編譯器指示語(yǔ)句。
Verilog編譯器指示語(yǔ)句
1、translate_off/ translate_on
這組語(yǔ)句用來(lái)指示DC停止翻譯 “//synopsys.。.translate_off”之后的Verilog描述,直至出現(xiàn) “//synopsys translate_on”。當(dāng)Verilog代碼鐘含有供仿真用的不可綜合語(yǔ)句時(shí),這項(xiàng)功能能使代碼方便地在仿真工具與綜合工具之間移植。
例1(translate_off/ translate_on指示語(yǔ)句的使用):
//synopsys translate_off
//synopsys translate_on
2、parallel_case/ full_case
DC可能使用帶優(yōu)先級(jí)的結(jié)構(gòu)來(lái)綜合Verilog的case語(yǔ)句,為避免這種情況,可以使用“//synopsys.。.parallel_case”指示DC將case語(yǔ)句綜合為并行的多路選擇器結(jié)構(gòu)。
(parallel_case指示語(yǔ)句的使用):
always @ (state)
case (state) //synopsys parallel_case
2’b00: new_state = 2’b01;
2’b01: new_state = 2’b10;
2’b10: new_state = 2’b00;
default: new_state = 2’b00;
endcase
另外,Verilog允許case語(yǔ)句不覆蓋所有可能情況,當(dāng)這樣的代碼由DC綜合時(shí)將產(chǎn)生鎖存器。為避免這種情況,可以使用“//synopsys full_case”指示DC所有可能已完全覆蓋。
例2 (full_case指示語(yǔ)句的使用):
always @ (sel or a1 or a2)
case (sel) //synopsys full_case
2’b00: z = a1;
2’b01: z = a2;
2’b10: z = a1 & a2;
endcase
-
Verilog
+關(guān)注
關(guān)注
28文章
1365瀏覽量
111480 -
編譯器
+關(guān)注
關(guān)注
1文章
1652瀏覽量
49730 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8450
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
你知道Verilog HDL編譯器指令都有哪些嗎
循環(huán)模型編譯器Verilog和System Verilog語(yǔ)言支持指南
NICE自定義指令如何被編譯生成匯編文件和.verilog二進(jìn)制文件?
C語(yǔ)言編譯器常見(jiàn)的預(yù)編譯指令詳細(xì)資料說(shuō)明

Verilog可綜合的循環(huán)語(yǔ)句
Verilog教程之Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式

如何使用Icarus Verilog+GTKWave來(lái)進(jìn)行verilog文件的編譯和仿真

Verilog HDL 編譯器指令說(shuō)明

交叉編譯器安裝教程
Verilog中的If語(yǔ)句和case語(yǔ)句介紹

介紹下Verilog系統(tǒng)完整的8種編譯指令
Triton編譯器功能介紹 Triton編譯器使用教程
Triton編譯器與其他編譯器的比較
Triton編譯器的優(yōu)化技巧
FPGA Verilog HDL語(yǔ)法之編譯預(yù)處理

評(píng)論