当前位置: 首页 > news >正文

Verilog中的`define与`if的使用

一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。

语法

// Style #1: Only single `ifdef
`ifdef <FLAG>// Statements
`endif// Style #2: `ifdef with `else part
`ifdef <FLAG>// Statements
`else// Statements
`endif// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>// Statements
`elsif <FLAG2>// Statements
`elsif <FLAG3>// Statements
`else// Statements
`endif

         条件编译可以通过Verilog的  `ifdef 和 `ifndef 关键字来实现。 这些关键字可以出现在设计中的任何地方,并且可以相互嵌套。  它通常和预编译指令`define配套使用。 如果使用 `define定义了 称为`FLAG`的宏,那么关键字`ifdef会告诉编译器包含这段代码,直到下一个`else或`endif。
        关键字`ifndef只是告诉编译器,如果给定的名为FLAG的宏没有使用`define指令定义,则将这段代码包含在下一个`else "或`endif之前。

引入`define定义有两种方法:

方法1:直接在.v文件中使用`define定义
首先使用`define flag定义了flag,然后用下一段代码定义不同的parameter参数值,这时period的值为5.
        `ifdef flag 
                   parameter period =5;
          `else
                  parameter period =10;
         `endif

`timescale 1ns / 1ps`define flagmodule tb;`ifdef flag parameter period =5;`elseparameter period =10;
`endifreg clk;
reg rst;
reg [7:0] in;
wire out;initial beginclk=0;rst=0;#100 rst=1;@(posedge clk);in=8'b10101010;repeat(10) @(posedge clk);in=8'b11100110;endalways #period clk=~clk;top inst(
.clk(clk),
.rst(rst),
.in(in),
.out(out)  );endmodule

方法二:在.vh文件中使用`define定义,然后在.v文件中使用#include引用宏定义
步骤一:先在vivado中添加一个.vh头文件,文件名为inc.vh,在该文件中定义如下:

`define flagg

步骤二:在需要引用宏定义的.v文件开始,使用`include "xxx.vh",这样就可以访问.vh的宏定义了

`include "inc.vh"
`timescale 1ns / 1psmodule tb;`ifdef flag parameter period =5;`elseparameter period =10;`endifreg clk;
reg rst;
reg [7:0] in;
wire out;initial beginclk=0;rst=0;#100 rst=1;@(posedge clk);in=8'b10101010;repeat(10) @(posedge clk);in=8'b11100110;endalways #period clk=~clk;

  注意:`define   macro_name   参数    之后不能加任何东西!

补充:

  `define 与localparam和parameter最大的区别就是`define 可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。




 

http://www.lryc.cn/news/63285.html

相关文章:

  • 沃尔玛、亚马逊影响listing的转化率4大因素,测评补单自养号解析
  • 静态分析和动态分析
  • 代码随想录_贪心_leetcode 1005 134
  • 笔记:对多维torch进行任意维度的多“行”操作
  • 【VSCode】1、VSCode 如何连接服务器
  • AI工具:通过智能实现工作和学习效率的革命化
  • static 和构造方法
  • 【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖
  • Web安全 XSS靶场搭建(玩转整个XSS环境.)
  • 前端开发技术——DOM(上)
  • 银河麒麟v10服务器版安装OpenDDS
  • curl方式调用电商API接口示例 详细介绍
  • Duboo介绍与入门
  • 人工智能中(Pytorch)框架下模型训练效果的提升方法
  • 树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别
  • Parameters(in)、Parameters(out) and Parameters(inout)
  • jstat命令查看jvm内存情况及GC内存变化
  • java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
  • HCIA-RS实验-STP和RSTP(1)
  • Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点
  • Java-数据结构-并查集<二>
  • JSP网上教学资源共享系统(源代码+论文)
  • QT C++入门学习(1) QT Creator安装和使用
  • UE动画状态机的事件触发顺序测试
  • 数学建模的搜索技巧
  • 学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。
  • 某应用虚拟化系统远程代码执行
  • solaris-Oracle11g于linux-mysql相连
  • 大厂齐出海:字节忙种草,网易爱社交
  • 几个实用的正则表达式