verilog編碼指令


`celldefine 和 `endcelldefine

`celldefine 和 `endcelldefine 用於將模塊標記為單元(cell),一般在標准單元庫中使用,一般來說寫的代碼都是模塊,很少去把它標記為單元

`celldefine 

module abc(...); //此時的我是一個單元,不是一個模塊
...
endmodule

`endcelldefine

`default_nettype

  • `default_nettype 用於指定隱含聲明線網的類型。類型可以是none 、wire 、wand 、 wor 、 tri 、triand 、trior 、tri0和tri1
  • `default_nettype只能在模塊外部使用
  • 多次使用的`default_nettype的話,最新定義的才起作用
  • 如果不設置默認狀態是wire
  • 如果把`default_nettype設置為none,那么所有的線網都要清晰的聲明,如果沒有,那就一定會報error
`default_nettype wire  //相當於一句廢話,因為默認狀態下就是wire
//`default_nettype none
module abc (...);
...
// wire  enable; //此時enable信號沒有被聲明
a u_a (
    ...
    .enable(enable), //此時我是a模塊的輸出1bit信號enable
    ...
);
b u_b (
    ...
    .enable(enable), //此時我是b模塊的輸入1bit信號enable
    ...
);
endmodule

上面這份代碼,`default_nettype沒有被設置為none,因此1bit線網可以不需要聲明,在這種情況下,編譯abc是不會報錯的

`default_nettype wire  //相當於一句廢話,因為默認狀態下就是wire
`default_nettype none  //后來居上,上面那句被這句話覆蓋了
module abc (...);
...
// wire  enable;//此時enable信號沒有被聲明
a u_a (
    ...
    .enable(enable), //此時我是a模塊的輸出1bit信號enable
    ...
);
b u_b (
    ...
    .enable(enable), //此時我是b模塊的輸入1bit信號enable
    ...
);
endmodule

上面這份代碼的時候,`default_nettype被設置為none,會報錯。

 `resetall

將所有編譯器指令設置為缺省值

`timescale

`timescale用於指定后續模塊的仿真時間單位(time_unit)和時間精度(time_precision)

  • 使用格式為:`timescale <time_unit>/<time_precision>
  • time_unit是用於仿真時間和延遲值的測量單位
  • time_precision是用於仿真時間和延遲值的測量精度,當延遲值超出精度時,先舍入再使用
  • time_unit當然不能小於time_precision啦
  • time_unit和time_precision差別也不能太大啦,不然仿真速度會大受影響,你可以試試`timescale 1s/1fs,一個仿真跑一天,一天跑一個仿真,下班,哦吼
  • 可以使用$printtimescale顯示模塊的時間單位和時間精度
  • 單位可以是s、ms、us、ns、ps、fs
`timescale 10ns / 1ns
//1. 這個模塊的時間單位是10ns,時間精度為1ns
//2. 延時若為1.55ns時,舍入那就是16ns,以1ns為精度

`define 和 `undef

`define用於定義一個宏定義,`undef用於取消一個宏定義。

  • 宏定義可以定義在模塊內,也可以定義在模塊外,效果都一樣,而parameter只能定義在模塊內。

可以定義設計參數和常量,如延時、位長、寬度、地址和狀態等等

//我可以定義SDF反標文件
`define SDF_FILE "chip.sdf.gz"
//狀態
`define SPI_IDLE   2'b00
`define SPI_TX     2'b01
`define SPI_RX     2'h10
`define SPI_FINISH 2'h11
//位寬
`define WIDTH  8
reg [`WIDTH-1:0] data;

`ifdef 、 `else 、 `elsif 、 `endif 、 `ifndef

和C的#ifdef和#endif用法相似,用於編譯時有選擇地包含某些代碼行,一般和`define一起用

在使用Synopsys的Design Compiler時,SYNTHESIS是綜合工具預定義的宏,用來把那些你仿真一定要用到但是又不能綜合的代碼包圍起來,當然//sysnosys translate_on 和//sysnosys translate_off效果是一樣的

`ifndef SYNTHESIS
    initial $dislplay("Hello World"); //這行我不綜合了,你跳過吧
`endif

`include

`include 用於在源文件中插入另一個文件,要插入的內容可以是全局使用的宏定義,也可以是經常使用的任務和函數,便於Verilog文件的管理和維護。
最好不要在文件名包含絕對路徑和相對路徑,在編譯時把路徑名+incdir+進來就行了朋友,然后代碼就可以像下面這樣子

//`include"./../define.v"   //非常不建議這么寫
`include"define.v" //在VCS吃進去的file.lst加入+incdir+./../,然后直接這么寫好吧

`unconnected_drive 和`nounconnected_drive

對於模塊未連接的input端口,`unconnected_drive用於指定這些端口的上落下狀態。

  • `unconnected_drive 和`nounconnected_drive要在模塊外面使用
  • `unconnected_drive可以取值為pull1或者pull0
`unconnected_drive pull1
. . .
 / *在這兩個程序指令間的所有未連接的輸入端口為正偏電路狀態(連接到高電平) * /
`nounconnected_drive
`unconnected_drive pull0
. . .
 / *在這兩個程序指令間的所有未連接的輸入端口為反偏電路狀態(連接到低電平) * /
`nounconnected_drive 

 


免責聲明!

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



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