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 

 

posted on 2021-05-12 18:01  QzZq  阅读(1852)  评论(0)    收藏  举报

导航