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