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
浙公网安备 33010602011771号