一、verilog语言概括
Verilog HDL是一种硬件描述语言,可以实现从行为级(包括算法级、系统级等)、RTL级、门级到开关级的多种抽象设计层级的数字系统建模。
二、verilog HDL基础部分
2.1基本框架
module 模块名(端口列表);
//端口声明,也称为1/0声明,关键字有input、output、inout
//参数定义(可选,用于定义模块内部使用的常量)
//内部信号声明,也被称为“数据类型”声明,可以是wire或reg等类型
/*模块内部Verilog HDL编程的主体部分,可以包含函数、任务、UDP的引用,
*也可以是低层次模块的引用;作为编程实现,还可以使用数据流建模(连续赋值*
*assign)和行为建模语句(过程块initial,always) */
//可选:任务或函数(task,function)
//可选:模块中还可以包含延迟说明块
endmodule
2.1.1模块
模块名称由首字母组合,可以取单词前几个字母
built in self test //可以命名为bist或者BIST
arithmatic logical unit//可以命名为alu或者ALI
transceivers/可以命名为tran或者Tran
Liquid Crystal on Silicon //可以命名为1cos或者Lcos
模块的内部结构
有点像C语言中的函数
modulemodule_name (port_list); //模块声明(端口声明列表)
input; //输入信号声明
output; //输出信号声明
inout; //输入/输出信号声明
//寄存器类型声明 regt
//线网类型声明 wire:
parameter; //参数声明
//主程序代码,建模结构部分,具体语法将在后续章节中讲述
gate level //门级建模
assign level //连续赋值建模
initial //行为级建模
always @(posedge clk and negedge reset)
udp structure;
sub_module u(out,input1,input2);
//被调用的子模块
function //函数
task //任务
endmodule
逻辑与门
/*第一种方法是逻辑门单元*/
module and_2(in1,in2,out);
input inl,in2; 输入信号
output out; //输出信号
and m1( out,inl,in2 );
//这是逻辑门实例化描述法,and是“逻辑与”的关键字,m1是设计者自定义的实例化名,括号内是
//逻辑门的输出和输入端口
endmodule
/*第二种方法是连续赋值法*/
module and_2( inl,in2,out );
input inl,in2; 输入信号
output out; //输出信号
assign out = inl&in2;
//assign是连续赋值语句的关键字,在后续章节中讲述
endmodule
2.2基本语法
Verilog HDL语言规定区分大小写,其中关键字全部为小写
标识符:
(1)一个简单的标识符应包含字母、数字、美元符号“$”和下划线“_”等。
(2)一个简单的标识符的第一个字符不能是“0,1.2,….9”或美元符号“$”,它可以是字母或下划线。
(3)标识符是区分大小写的。
(4)以美元符号开始的标识符是系统函数保留的标识符
module
input
parameter
always
begin
if
xor
pmos
end
endmodule
数字声明:
Verilog HDL语言包含整数数字和实数数字
<+/-><位宽>'<进制><数字>
二进制(B、b)例如:4‘b0100
八进制(O、o)
十进制(D、d)
十六进制(H、h)
注意问题:
1. 较长的数字将可用下划线分开,但不可以用在位宽和进制处,只能用在具体的数字之间,而且下划线不能用作首字符。
例如: 16’b1010_1011_1111_1010 //合法格式
8’b_0011_1010 //
非法格式
2.如果定义的位宽比实际位数长,通常在左边填 0 补位,但如果数最左边一位为 x或 z 值,就相应地用 x 或 z 在左边补位;如果定义的位宽比实际位数小,那么最9左边的位相应地被截断。
3.整数可以带符号,并且+/-号应写在最左边,而不可以放在位宽、进制和具体的
数之间。
例如:
-8’d5 //
这个表达式表示
5
的补数(用八位二进制数表示)
8’d-5 //
非法格式
注释:/**/ //
空格:\b
制表符:t
换行符号: 回车
2.3参数定义
parameter 定义常量
parameter 参数名 1=表达式,参数名 2=表达式,......,参数名 n=表达式;
2.4变量
wire型
wire
型数据用来表示以
assign
关键字指定的组合逻辑信号。
Verilog
程序模块中输入、输出
信号类型默认时自动定义为
wire
型。
wire
型信号可以用做任何方程式的输入,也可以用做
“
assign
”语句或实例元件的输出。
wire
型信号的格式如下:
wire [n-1
:
0]
数据名
1
,数据名
2
,„„,数据名
i
;
wire [n
:
1]
数据名
1
,数据名
2
,„„,数据名
i
;
//
共有
i
条总线,每条总线内有
n 条线路
reg型
改变寄存器储存的值,与改变触发器储存的值相当。
reg [n-1
:
0]
数据名
1
,数据名
2
,„„,数据名
i
;
reg [n
:
1]
数据名
1
,数据名
2
,„„,数据名
i
;
在
Verilog HDL
语言中没有多维数组存在。但是可以通过扩展
reg
型
数据的地址范围来生成
memory
型数据。其格式如下:
reg [n-1
:
0]
存储器名
[m-1
:
0]
;
reg [n-1
:
0]
存储器名
[m
:
1];
2.5条件语句和循环语句
2.5.1条件语句
if(条件)
else
或者
if(条件)
else if(条件)
case
语句是一种多分支选择语句,一般格式如下:
case(
表达式
)
分支表达式
1
:
语句
1
;
„„
分支表达式
m
:
语句
m
;
默认项(
default
项)
语句
n
;
endcase
2.5.2循环语句
forever
:连续的执行语句。
repeat
:连续执行一条语句
n
次。
while
:执行一条语句直到某个条件不满足,如果一开始就不满足则语句一次也不能被执行。
for
:执行语句直到某个条件不满足,实际上相当于
while
语句。
while(表达式)
begin
语句;
end
for(
循环变量赋初值;循环结束条件;循环变量增值
)
begin
语句 ;
end
2.6结构说明语句
initial
语句的格式如下:
initial
begin
语句 1;
语句 2;
语句 n;
end
initial
语句通常用来在仿真开始时对各变量进行初始化,或者用
initial
语句来生成激励波
形。
always
语句由于其不断重复执行特性,只有和一定的时序控制结合在一起才有用。其一般
格式如下:
always<时序控制
> 语句;或
always<时序控制
>
begin
语句 1;
语句 2;
end
function
语句的一般格式为:
function <
返回值位宽或类型说明
>
函数名;
端口声明;
局部变量定义;
其他语句;
endfunction
<
返回值位宽或类型说明
>
是一个可选项,如果缺省,则返回一位寄存器类型的数据。