verilog常用语法---常用编译预处理语句

编译预处理语句

  • 编译预处理 是verilog hdl编译系统的一个组成部分。编译预处理语句是以esc下方波浪线中的(`)开头

  • 在编译时,编译系统先对编译预处理语句进行预处理,然后将处理结果和源程序一起进行编译

define语句

  • 宏定义语句-用一个指定的标识符(即宏名)来代表一个字符串(即宏内容)

  • 格式

`define 标识符 (即宏名)字符串 (即宏内容)

ps编译预处理语句,写完后面是无分号的

例:

`define IN ina+inb+inc+ind

宏展开---在编译预处理时将宏名替换为字符串的过程

宏定义的作用:

  • 以一个简单的名字代替一个长的字符串或复杂表达式;

  • 以一个有含义的名字代替没有含义的数字和符号;

  • 宏名尽量用大写字母来表示,以与变量名相区别

  • `define可以写在module的前面也可以写在module的里面。宏名的有效范围为定义命令之后到源文件结束

module test;
    reg a,b,c,d,e,out;
    define expression a+b+c+d //一定不能加;,不然后面引用时,out = a+b+c+d;+e会报错
    assign out = `expression + e;
endmodule
  • 进行宏定义时,可引用已定义的宏名,来实现层层置换;

module test;
    reg a,b,c;
    wire out;
    `define aa a+b //不能有分号
    `define cc c+'aa //引用宏名`aa来定义宏`cc
    assign out = `cc;
endmodule

宏定义与parameter的区别

范围

`define

整个工程

parameter

本module内有效

localparam

本module内有效,不可用于参数的传递

`include语句

  • 文件包含语句,一个源文件可将另一个源文件的全部名称包含进来

  • 格式:`include <文件名>相对于sim的相对路径或者为该文件的真实路径

ps:相当于将file2.v全部内容赋值插入到`include"file2.v"命令出现的地方

  • 一个include语句只能指定一个被包含的文件:若要包含n个文件,需要n个include语句

`include "aa.v""bb.v"//这样写是不对的,可以写为以下的形式
`include "aa.v"
`include "bb.v"
  • `include语句可出现在源程序的任何地方,被包含的文件弱于包含文件不在同一子目录,必须指明器路径

  • `include "parts/count.v"

作用

可以减少程序开发人员重复性的劳动

用include语句设计16位加法器

//1'bit adder
moudule adder (cout,sum,a,b.cin);
    parameter size = 1;
    input [size-1:0]a,b;//位宽是1
    input cin;
    output sum;
    output cout;
    assign {cout,sum} = a + b + cin;cout存进位的值,sum存低位的和,{cout,sum}是位拼接
endmodule

`include "adder.v"
module adder_16b (cout,sum,a,b,cin);
    output cout;
    parameter my_size = 16;
    output [my_size-1:0] sum;
    input  [my_size-1:0] a,b;
    input cin;
    adder #(my_size) my_adder(cout,sum,a,b,cin);//对adder进行模块实例化,my_adder中的parameter变为my_size=16
endmodule 

adder #(my_size) my_adder(cout,sum,a,b,cin);可以用名称或者位置传参

加入是多个参数可以用位置或者名称传参

adder #(my_size1,my_size2) my_adder(cout,sum,a,b,cin);//此方式为位置传参

adder #(.size1(my_size1),.size2(my_size2)) my_adder(cout,sum,a,b,cin);//此方式为名称传参

monitor用法

http://t.csdn.cn/0iQM6

`timescale语句

  • 用于定义跟在该命令后模块的时间单位和时间精度

  • 格式:`timescale<时间单位>/<时间精度>

  • 时间单位:用于定义模块中仿真时间和延迟时间的基准单位;

  • 时间精度:用于声明模块的仿真时间和延迟时间的精确程度;

  • 在同一程序设计里,可以包含采用不同时间单位的模块。(此时用最小的时间精度值决定仿真的时间单位

  • 时间精度至少要和时间单位一样精确,时间精度值不能大于时间单位值!

  • 在timescale语句里,用来说明时间单位和时间精度参量值的数字必须是整数

  • 其有效数字为1、10、100;

  • 单位为秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)、皮秒(ps)、毫皮秒(fs)

eg:

`timescale 10ns/1ns//时间单位为10ns,时间精度为1ns
.....
reg sel;
initial begin
    #10 sel = 0;//延迟10个时间单位
    #10 sel = 1;//延迟10个时间单位
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值