tomako123

导航

verilog预编译处理(ieee标准)

`celldefine

`endcelldefine

在ieee中的描述如下:

  这两个指令用于将模块标记为单元模块,它们表示包含模块定义。某些PLI使用单元模块用于这些应用,
如计算延迟。该命令可以出现在源代码描述中的任何地方。但是,推荐将其放在模块定义的外部。

但是具体还不知道怎么用,没实践过。

`default_nettype:

该指令用于为隐含网络指定网络类型,也就是为那些没有被说明的连线定义网络类型。 

如果没有出现’default_netype指令,或者如果指定了’resetall指令,则隐含的网络类型是wire。

当default_netype设置为none时,需要明确地声明所有网络;如果没有明确地声明网络,则产生错误。

`define 宏定义

使用格式:`define 标识符(宏名) 字符串(宏内容)
作用很简单,就是为了在编译预处理时,把程序中在该命令之后的所有宏名替换成宏内容。

可以通过这种方式将一个很长的字符串用很短的宏名替代,或者用有意义的宏名去代替一个
没有意义的数字或符号。通过修改宏定义中的宏内容可以实现大规模修改,更加简洁。

关于使用宏定义的7点说明:

  1.建议宏名均使用大写,以便更好地和变量区分。

  2.`define可以写在模块外和模块内,有效范围为定义之后到原文件结束。通常将其定义在module外,
     作为程序的一部分,在此程序内都有效。

  3.在引用已定义的宏名时,必须在宏名的前面加上符号`,表示该名字是一个经过宏定义的名字。

  4.宏定义是用宏名代替字符串,也就是做简单的置换,不做语法检查。只有在编译已经被宏展开
    后的源程序时才报错。
  
  5.宏定义不是verilog HDL语句,不必在行末加分号,加分号则分号也被当成宏内容字符串进行替换。

  6.宏定义可以嵌套,定义一个新的宏定义时可以引用之前定义过的宏定义进行嵌套。

  7.宏名和宏内容必须在同一行进行声明,宏内容中如果有注释行,注释行不会被替换。

`undef 宏定义取消:

用于取消之前声明过的宏定义。

条件编译:

  `ifdef,`elsif,`else,`endif,`ifndef
  当FLAG1被定义过了,执行FLAG1,没有被定义过就检查下一个,有点类似ifelse
  其中`ifndef是没有被定义过才执行,`endif是结束语句。

    `ifdef <FLAG1>
   // Statements
    `elsif <FLAG2>
   // Statements
    `elsif <FLAG3>
   // Statements
    `else
   // Statements
    `endif

什么时候使用等后续用上了再更新

`include:文件包含处理

一般形式为:

  `include"文件名"

    文件包含的意思是一个源文件可以将另一个源文件的内容全部包含进来:将目标文件的全部内容复制
  插入到`include命令出现的地方。

    这个功能十分有用:可以将一些常用的宏定义命令或task组成一个文件,然后用`include命令将这些
  宏定义和task拿到自己的源文件中,相当于工业上的标准元件拿来使用。另外在verilogHDL文件中,一
  个源文件可能要用到另外几个源文件中的模块,遇到这种情况即可用`include命令将所需模块的源文件
  包含进来(但是一般在一个项目中可以直接用模块名)。

`timescale 时间尺度:

  格式:`timescale 时间单位/时间精度,有效值和单位为1,10,100以及s,ms,us,ns,ps,fs
  (时间精度可以理解为在仿真时设置时间的最小精度,比如#100.11和#100.1就是精度差1个单位

`resetall:

   该编译器遇到`resetall指令时,会将所有的编译指令重新设置为默认值。推荐在源文件的开始放
   置`resetall.将`resetall命令放置在模块内或者UDP声明中是非法的。

`unconnected_drive和'nounconnected_drive

  这个指令的作用是将指令间未连接的端口上拉或者下拉:
  `unconnected_drive pull1/pull0
   ......
  `nounconnected_drive
  其中pull1为上拉,pull0为下拉。

posted on 2024-01-25 17:50  甜豆莎的辣白菜  阅读(39)  评论(0编辑  收藏  举报