Verilog编译指令

编译指令

编译指令(Compiler directive)能够让仿真器和综合工具执行一些特殊的操作。特点:

  1. 以`(重音符号)为前缀
  2. 从处理位置一直保持有效,除非被其他指令覆盖或者取消
  3. `resetall指令将所有编译指令复位成默认值

主要的编译指令:

  1. celldefine和endcelldefine:
  • 用于将模块标记为单元(cell),一些PLI程序可能会使用到。目前不常用。
  1. default_nettype
  • 用于指定隐含声明线网(Implicit net declaration)的类型。类型可以是none, wire, wand, wor, tri, triand, trior, tri0, tri1.
  • 只能在模块外部使用。
  • 默认类型是wire。
  • 如果设置为`default_nettype none,那么所有的线网都要清晰申明,否则会报错。
  1. define和undef
  • 前者用于定义一个宏替换,后者用于取消一个宏替换,resetall对define不起作用。
  • 可以在模块内外,效果都是一样的,parameter就只能在模块内。
  • 看看这个讲解,很基础,很清晰。
  • 宏定义的还可以这样使用:
    `define macro_name(arguements) text_string(arguements)
//Compare two 32-bit signed number
`define gt(x,y) ((x[32] == 0 && y[31] == 0) ? (x[30:0] > y[30:0]) : \
                 (x[31] == 1 && y[31] == 1) ? (x[30:0] > y[30:0]) : \
                 (x[31] == 0 && y[31] == 1) ? 1 : 0)
//pay attention that there is no ";" next to the ending of `define sentence!
reg [31:0] pig,dig;

if (`gt(pig,dog)) $display ("Info : Pig is greater than dog");
  1. include
  • include用于在源文件中插入另一个文件,要插入的内容可以是全局宏定义,也可以是经常使用的任务和函数。
  • 最好不要在文件名中使用绝对路径和相对路径,而是在编译时使用+incdir指定路径名。
  • resetall对include不起作用
  • 一个include不能插入多个文件,必须用多条include语句来实现。
  • include "../../primitive.v"插入的文件必须使用""括起来。
  1. ifdef,else,elsif,endif,ifndef
  • 用到再说
  1. resetall
  • 在编译中碰到resetall,所有指令恢复默认值。
  • resetall不能在模块和UDP中使用。
  1. line
  • 没懂
  1. timescale
  • 用于指定后续模块的仿真时间单位(time_unit)和时间精度(time_precision)。
  1. unconnected_drive和nounconnected_drive
  • 对于模块为连接的input端口,unconnected_dirve pull1/pull0,用于指定这些端口的上拉(1),下拉(0)
  • resetall = nounconnected_drive
  1. begin_keywords和end_keywords
  • 说明对一块源代码块使用哪一个保留关键字集合。
  1. pragma
  • 改变verilog源程序解释的指令。

掌握常用的编译指令就好

posted @   xing-uestc  阅读(714)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示