Verilog系列【5】`ifdef和generate的差异

使用Verilog进行数字设计,经常需要对部分代码进行切换编译或者针对不同的配置选择不同的代码进行编译的情况,使用Verilog的条件编译方法和generate可以实现Verilog代码的选择。关于generate可参考之前发布的topic(链接:关于generate用法的总结),本文主要对条件编译命令和条件编译命令与generate的区别进行示例分析。

1. `ifdef-`endif 和`ifndef-`endif

因为`ifdef和`ifndef作用类似,只是成立条件相反,以下仅对`ifdef进行说明。

格式一:

     `ifdef 宏名标识符

     ......   // 程序段s1

     `else

     ......   // 程序段s2

     `endif

格式二:

     `ifdef 宏名标识符

     ......   // 程序段s1

     `endif

格式三:

    格式一与格式二的各种嵌套组合,嵌套方式和结构类似于C语言等其他语言中“if-else”。。

     条件编译的作用是当宏名标识符被定义过,那么编译“程序段s1”,此时忽略“程序段s2”,反之编译“程序段s2”,此时忽略“程序段s1”。

这里需要注意以下几点:

  • 宏名标识符指定方式:仿真器的编译命令;编译命令“`define 宏名标识符”;

  • 被忽略的代码也要符合Verilog语法规范;

  • 条件同时只能有一个成立,其结构类似于一般“if-else”结构,即分支选择是互相排斥的,但是其中内容可以类似等;

  • 条件编译一般在预编译阶段完成,就是在进行编译的第一遍词法扫描和语法分析之前进行的工作;

【示例】

                           

当在指定了标识符u1_dut,则编译时对u1_dut例化,选择u2_dut则仅对u2_dut进行例化。

2. `ifdef与generate区别

`ifdef

generate

应用范围:可应用于“module-endmodule”之内或者之外。

应用范围:只能应用于“module-endmodule”之内。

宏名标识符可来自于“`define”或者“编译命令+define+宏名标识符”等。

generate结构中使用的变量需要通过genvar进行声明。

该结构仅在编译时对设计结构进行确认,即一次仿真中不会多次进行结构选择。

generate结构可以多次循环执行。

执行阶段:预编译阶段

执行阶段:仿真阶段

合理使用两种结构均可以优化代码结构,特别是在特定条件下生成特定设计结构。


全部评论

相关推荐

10-21 00:37
已编辑
门头沟学院 C++
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务