Verilog的编译指令

编译指令

编译指令特性:

  • 编译指令是以 ` 为前缀,ASCII为0x60,而不是单引号 ’ ,单引号的ASCII为0x27
  • 编译指令从处理它的位置就一直保持有效,除非后面被自己或者其他编译指令覆盖或者取消掉

`celldefine 和 `endcelldefine

  1. `celldefine 和 `endcelldefine 用于将模块标记为单元(cell),一般在标准单元库中使用,一般来说写的代码都是模块,很少去把它标记为单元
  2. 最好在模块外面使用这两条指令
  3. 想到再说
`celldefine 

module abc(...); //此时的我是一个单元,不是一个模块
...
endmodule

`endcelldefine

`default_nettype

  1. `default_nettype 用于指定隐含声明线网的类型。类型可以是none 、wire 、wand 、 wor 、 tri 、triand 、trior 、tri0和tri1
  2. `default_nettype只能在模块外部使用
  3. 多次使用的`default_nettype的话,最新定义的才起作用
  4. 如果不设置默认状态是wire
  5. 如果把`default_nettype设置为none,那么所有的线网都要清晰的声明,如果没有,那就一定会报error

在Verilog-1995中,用于端口声明和端口连接的1-bit线网可以不必声明,但是由连续赋值驱动的而且不是端口的1-bit的线网必须声明;但是在Verilog-2001中就去掉了这个限制,任何1-bit的线网都可以不必声明,并且`default_nettype编译指令增加了一个"none"的选项,嘛意思呢,下面展示`default_nettype设置为none的情况

`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,在VCS中跑的时候会报以下错误

Identifier 'enable' has not been declared yet. If this error is not 
expected, please check if you have set `default_nettype to none

一目了然,下一个

`define 和 `undef

`define用于定义一个宏定义,`undef用于取消一个宏定义。

  1. 宏定义可以定义在模块内,也可以定义在模块外,效果都一样,而parameter只能定义在模块内。
  2. 可以定义设计参数和常量,如延时、位长、宽度、地址和状态等等
//我可以定义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;
  1. 如果只在模块里面使用,没有全局的意义,那用localparam
  2. 可以提高代码的可读性和可维护性

PS:如果在两个文件里面的宏定义都使用了同一个名字,那你发财了,这个只是会报warning,不会报error,建议看清楚,VCS遇到这种情况会报如下的warning,遇到建议改掉,不然有可能芯片就等着做第二版了

Warning-[TMR] Text macro redefined

`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+./../,然后直接这么写好吧

`timescale

`timescale用于指定后续模块的仿真时间单位(time_unit)和时间精度(time_precision)

  1. 使用格式为:`timescale <time_unit>/<time_precision>
  2. time_unit是用于仿真时间和延迟值的测量单位
  3. time_precision是用于仿真时间和延迟值的测量精度,当延迟值超出精度时,先舍入再使用
  4. time_unit当然不能小于time_precision啦
  5. time_unit和time_precision差别也不能太大啦,不然仿真速度会大受影响,你可以试试`timescale 1s/1fs,一个仿真跑一天,一天跑一个仿真,下班,哦吼
  6. 可以使用$printtimescale显示模块的时间单位和时间精度
  7. 单位可以是s、ms、us、ns、ps、fs
`timescale 10ns / 1ns
//1. 这个模块的时间单位是10ns,时间精度为1ns
//2. 延时若为1.55ns时,舍入那就是16ns,以1ns为精度

`unconnected_drive 和`nounconnected_drive

对于模块未连接的input端口,`unconnected_drive用于指定这些端口的上落下状态。

  1. `unconnected_drive 和`nounconnected_drive要在模块外面使用
  2. `unconnected_drive可以取值为pull1或者pull0

PS:我觉得没什么卵用的指令,我input端口我不给数据那就是我代码有问题,这就是一个冗余的端口信号,不如删了直接在模块内部定一个一个wire信号然后长期接0或者接1

`begin_keywords和`end_keywords

  1. 用于说明对一块源代码使用哪一个保留关键字集合。
  2. `begin_keywords的取值为这几种:1364-1995、1364-2001、1364-2001-noconfig、1364-2005。
  3. 只能在模块或者原语外面使用。

PS:没有例子,我能找到上面这个资料我已经觉得我很牛逼了,没用过

`pragma

???一条改变Verilog源程序解释的指令???

PS:救命,我真的没找到这个相关的资料

最后的最后,如果对本篇文章有疑问或者有意见,欢迎加WX一起探讨:lmf_AlwaysOnline

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟花一时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值