Verilog 预编译
Verilog 语言支持宏定义(`define),参数 parameter,局域参数(localparam)以及`include等内容。这些数据常量的支持极大方便数字系统设计、仿真与验证。这些参数是预编译的。
预编译
所谓预编译就是在系统编译之前,将定义的宏常量,参数等先对系统文件扫描一边,将文件中引用的宏和参数以实际值替代,对`include 文件的引用,将实际文件复制到对应位置,然后才对系统进行编译,这一点和具有编译运行的软件编译处理是一致的,如C语言,C++语言等。
宏定义
`define 关键字
宏定义的关键字是`define, 在预编译阶段,`define 用于文本替换,类似于 C 语言中的 #define。一旦 `define 指令被定义,其在整个翻译过程中都会有效。例如,在一个文件中定义:
`define DATA_DW 32 //含义是 DATA_DW=32, 在编写文件时使用`DATA_DW,在系统编译时,首先将所有`DATA_DW 出现的地方都替换成32,然后再编译。
则在另一个文件中也可以直接使用 `DATA_DW。当然这和编译工具的设定有关,建议一个文件中定义的宏只在该文件中使用。
使用宏的好处是,在全局中使用宏定义的常量,将来如果该常量有变化,直接改动宏定义就可以改动所有使用宏的地方。
宏定义也可以是一个表达式方式, 例如:
`define low_pos(w,b) ((w)*64 + (b)*8)
例:
设计文件 mul8.v
`define PW 8 module mul8 ( input [`PW-1:0] a, input [`PW-1:0] b, output [`PW*2-1:0] p ); assign p = a * b; endmodule
 
仿真文件 tb.v
`timescale 1 ns/1 ps
`define PW 8
module tb
(
 
);
 
parameter PERIOD = 10 ;
reg CLK;
initial
begin
CLK = 1'b0;
#(PERIOD/2);
 
forever
#(PERIOD/2) CLK = ~CLK;
end
 
reg [`PW-1:0] a, b;
 
wire [`PW*2-1:0] p;
 
initial
begin
a = `PW'b0;
b = `PW'b0;
end
 
always @(posedge CLK)
begin
a = a + 1;
 
if(a == 2**(`PW)-1 ) //对于求幂运算符**,只能是2的幂,指数部 //分必须是常量
b = b + 1;
end
 
mul8 mul8_dut
(
.a (a),
.b (b),
.p (p)
);
 
endmodule
`undef 关键字
利用`undef 关键字可以中止当前宏常量的定义。
如: `undef PW
文件在这条语句之后 就不能再以`PW 替代8 使用。
`ifdef, `ifndef, `elsif, `else, `endif
`elsif, `else 编译指令对于 `ifdef 指令是可选的,即可以只使用 `ifdef 和 `endif 组成一次条件编译指令块。
例:缺省对32位数据处理,如果定义宏,则按宏定义处理
`ifdef DATA_DW
reg [`DATA_DW-1:0] data_a;
reg [`DATA_DW-1:0] data_b;
reg [`DATA_DW-1:0] data_c;
`else
reg [31:0] data_a;
reg [31:0] data_b;
reg [31:0] data_c;
`endif
注: 宏一般在定义时大小写字符都可以使用,而且大小写是区分的,也就是大写字符定义的宏与小写字符定义宏虽然只有大小写之分,却代表了不同的宏
如:
`define data_w 8 与`define DATA_W 32 定义的宏,可以分别使用,互不冲突。一般习惯宏都是用大写字母。
参数 parameter与局部参数localparam
parameter 与localparam都可以定义参数常量,但使用范围不同:
localparam定义的参数仅限于本module内部使用,模块例化不可调用,相当于局部常量。状态机状态常量定义,而且只能在定义的位置之后使用。
parameter定义的参数不仅能在本文件中使用,还能利用module 例化后起到参数传递的作用。parameter经常在module接口,以及在设计文件中多处使用特定常数的地方使用。
 
举例:
设计文件 para_fadder.v
module para_fadder
#(
parameter WDTH = 4
)
(
input ci,
input [WDTH-1:0] a,
input [WDTH-1:0] b,
output [WDTH-1:0] sum,
output co
);
 
assign {co, sum} = a + b + ci;
 
endmodule
Testbench 文件 tb.v
`timescale 1ns/1ps
 
module tb
(
);
 
parameter WDTH = 16;
 
reg ci;
reg [WDTH-1:0] a, b;
 
wire [WDTH-1:0] sum;
wire co;
 
initial
begin
a ='b0;
b ='b0;
ci = 0;
 
#10
 
a ='d100;
b ='d33;
ci = 0;
#10
 
a ='d101;
b ='d37;
ci = 1;
end
 
 
 
para_fadder
#(
.WDTH(WDTH)
)
para_fadder_dut
(
.ci (ci),
.a (a),
.b (b),
.sum (sum),
.co (co)
);
 
endmodule
Modelsim仿真波形
 
 
 
说明: 在设计文件中定义了 参数 WDTH=4,而在例化中传递的参数为16,那么最终在设计文件中的参数的具体数值由传递值决定,本例中WDTH的最终为16,最终例化了16位全加器。如果在例化中没有给参数传递值,则WDTH=4变成缺省值,即例化4位全加器。如例化如下:
para_fadder para_fadder_dut ( .ci (ci), .a (a), .b (b), .sum (sum), .co (co) );
将例化成4位全加器。
 
module中 parameter 的格式如下:
 
设计文件
module para_fadder #( parameter WDTH = 4, parameter WDTH1 = 4 //最后一个参数没有分隔符 )
 
多个参数采用逗号 “,”隔开,最后一个参数没有分隔符 。
例化端类似的格式:
 
para_fadder #( .WDTH (WDTH), .WDTH1 (WDTH1) )
 
如果只有一个参数,则为
para_fadder #( .WDTH(WDTH) )
 

Verilog 预编译的更多相关文章

  1. 警惕!高版本VS发布时预编译导致Mono中Razor找不到视图

    早前一段时间,一位朋友在Q群里面找到我,说它按照<Linux.NET学习手记>的操作,把一个ASP.NET MVC 4.0的项目部署到Mono之后出现Razor无法找到视图的现象.当时费了 ...

  2. .NET MVC Razor模板预编译(二)

    在前面一片文章:<.NET MVC4 Razor视图预编译(一)> 里面我采用的是PrecompiledMvcViewEngineContrib组件进行预编译视图的虚拟地址注册,但是这个组 ...

  3. .NET MVC4 Razor视图预编译(一)

    在平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去. 但是VS并不提供razor的预编译,如果 ...

  4. JDBC_part2_DML以及预编译_编写DBUtil工具类

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! jdbc day02 DML语法 比起插叙语句,没有R ...

  5. javascript中的预编译问题

    Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1.    // ...

  6. DelphiXE10.1项目中增加预编译的方法

    操作: 菜单选择Proceject->Options->Delphi Compilerz在Conditional Defines(第一行)中添加预编译标识.例:VCL代码:uses{$IF ...

  7. C语言的傻瓜式随笔(二):全局变量、预编译、goto

    函数的作用:可以实现代码的重用. 函数只需要定义1次,那么函数中的代码就可以随意的调用.       -某不知出处的基本概念 学而时习之,如有误笔,请指正 一.goto跳转语句 goto在C语言的作用 ...

  8. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  9. 关于JavaScript预编译和执行顺序以及函数引用类型的思考

    昨晚在对项目中的一部分做模块化处理的时候,遇到了一个问题,一个重新定义的function对一个通用类中的function进行赋值覆盖的时候,失败了.问题抽象出来是这样的: <script > ...

  10. ObjC宏定义-预编译小功能

    以前看来#号,好像只是预编译,原来它还可以有跟Swift中"\( )"的拼接功能 例如: #define string(x) #x 意思就是 string(x) = "x ...

随机推荐

  1. 越权检测 burp插件 autorize 使用

    Autorize 官方描述 Autorize 是 Burp Suite 的自动授权强制检测扩展.它是由应用程序安全专家 Barak Tawily 用 Python 编写的.Autorize 旨在通过执 ...

  2. kafka日志数据清理策略

    vim /kafka/server.properties # 日志清理策略优先级是谁先满足条件. # 保留7天的日志数据 log.retention.hours=168 # 日志数据总大小保留100G ...

  3. chklist

    1. 重复检查的必要性.一段代码如果在测试期间没问题,也要间隔几天再去观察是否有问题.2. 如果是集群式的服务,使用定时任务要采用分布式锁,或使用工具随机发送一台都可以.3. 如果任务跑失败,需要支持 ...

  4. 在VSCODE的终端运行Python时汉字乱码问题处理

    问题描述 在VSCODE的终端运行Python时,打印输出中文时汉字出现乱码, 文件编码都是UTF-8 解决步骤 1.打开Settings配置窗口(Ctrl+,) 2.搜索:code-runner.e ...

  5. docker镜像的获取、查看、删除、docker镜像管理、docker容器管理

    在不想弄乱本地及其环境下该如何进行系软件的安装? 下载安装docker工具 获取该软件的docker镜像(你以后想要用各种工具,基本都能够搜索docker search nginx:版本号到合适的镜像 ...

  6. ID生成器实现方式的优缺点比较以及最优的ID生成器原理剖析

    引用:https://blog.csdn.net/luoyang_java/article/details/90679456 本文的重点主要是ID发号器相关的知识,介绍了雪花算法,以及他的基本原理和实 ...

  7. dendrogram

    https://ww2.mathworks.cn/help/stats/dendrogram.html

  8. C++书写的第一个类

    1.建立Student.h头文件 #ifndef STUDENT_H #define STUDENT_H #include <string> using namespace std; cl ...

  9. 2019-2020-1 20199318《Linux内核原理与分析》第十一周作业

    <Linux内核原理与分析> 第十一周作业 一.预备知识 什么是ShellShock? Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全 ...

  10. 小米手机MIUI12获取hci.log的方法记录

    按照之前的方式,开发者选项打开获取蓝牙HCI的log开关,但是在本地一直找不到log. 在网上查了很久资料,终于找到有用的方法了.记录一下. 感谢大佬 https://www.jianshu.com/ ...