参考书:Verilog数字系统设计教程(第三版)夏宇闻等编著
本文学习Verilog语法中的结构语句、系统任务、函数语句和显示系统任务
文章目录
一、结构说明语句
Verilog中任何过程块都属于以下4中结构的说明语句。
(1)initial 说明语句
(2)always 说明语句
(3)task 说明语句
(4)function 说明语句
1. initial 语句
(1)格式
initial
begin
语句1;
语句2;
......
语句n;
end
(2)用法说明
- initial 块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。
- initial 语句对存储器初始化,整个初始化过程不需要任何仿真时间,即在0ns时间内,便可以完成存储器的初始化工作,一个模块可以有多个initial块,他们都是并行运行的。
(3)举例
【例1】用initial块对存储器变量赋初始值。
initial
begin
areg = 0; //初始化寄存器areg
for( index = 0; index < size; index = index +1 )
memory[index] = 0; //初始化一个memory
end
2. always 语句
(1)声明格式
always <时序控制> <语句>
(2)用法说明
- 一个always语句没有时序控制,将会使仿真器产生死锁。见下【例2】
- always 的时间控制可以是沿触发,也可以是电平触发;敏感信号可以是单个信号,也可以是多个信号(用or 或者 “,” 连接)。见下【例3】
- 敏感信号不可以是x或z,否则会阻挡进程
- 沿触发——时序逻辑:always @(posedge clk or negedge rst)
电平触发——组合逻辑:always @(*) - 电平敏感时序控制,后边语句需等待某个条件为真才执行。见下【例4】
- 一个模块中多个always块是并行运行的
(3)举例
【例2】基于延迟的时序控制
always areg = ~areg; \\生成0延迟的无效跳变,会发生仿真死锁
always #20 areg = ~areg; \\生成一个周期为40的信号波形。通常用来描述时钟信号,并作为激励信号。
【例3】基于事件的时序控制
//由两个沿触发的always块
always @ (posedge clock or negedge reset) //posedge表示上升沿 、negedge表示下降沿
begin
......
end
//由多个电平触发的always块
always @ (a or b or c )
begin
......
end
【例4】电平敏感时序控制
always
wait(count_enable) //wait 表示等待电平敏感的条件为真
#20 count = count +1
二、任务(task)和函数(function)说明语句
task和function语句分别用来由用户定义任务和函数;任务和函数往往是大的程序模块中在不同地点多次用到的相同的程序段;利用任务和函数可将一个很大的程序模块分解为许多较小的任务和函数,便于理解和调试;输入、输出和总线信号的值可以传入、传出任务和函数。
1. task 和 function 的不同点
任务(task) | 函数(function) | |
---|---|---|
目的与用途 | 常用于调试,或对硬件进行行为描述 | 常用于计算,或描述逻辑 |
变量类型 | 没有或者有多个任意类型的变量(包括inout型) | 至少有一个输入变量,但不能有任何output或inou |