verilog语言中的过程块都是由一下四个结构语句构成:
1)initial说明语句(只执行一次)
2)always说明语句(敏感参数触发的时候调用)
3)task说明语句(调用的时候执行)
4)function 说明语句(调用的时候执行)
不同的initial,always 之间都是并行执行
initial语句例子
initial
begin
areg=0;// 初始化寄存器为0
for(index=0;index<10;index=index+1)
areg=index; // 循环给areg 修改值
end
initial
begin
areg=0;// 初始化寄存器为0
#10 areg=1;// 延迟10个周期后为1
#10 areg=2;// 再延迟10个周期后为2
#10 areg=3;// 再延迟10个周期后为3
#10 areg=4;// 再延迟10个周期后为4
end
always 模块
基本格式always 触发条件 执行的语句
最简单的always always #10 a= ~a;// 产生一个方波
常用的形式为 always@(敏感列表)语句
如 always@(posedge clock or posedge rest) //在时钟上升沿或者rest 上升沿的时候才会触发always后面跟随的语句 or 也可以使用‘,’代替。
如果对于有很多输入的模块 可以通过* 来代替手写敏感列表
always@* 或者always@(*)
always@(*) //always@(a or b or c or d or e)
begin
yout=a+b+c+d+e;// 对a b c d e 进行相加
end
verilog 中task和function 可以构成一个单独的功能块,用于被其他地方调用,但是我个人理解
task 类似c中的函数 funtion 更类似c中的宏定义
task<任务名>;
<端口及数据类型声明语句>
<语句>
endtask
实例:
task my_task;
input a,b;
inout c;//既是输入又是输出
output d,e;
c=a;
d=b;
e=a*b;
endtask
调用的时候 my_task(v,w,x,y,z)//和上面端口定义的顺序匹配
funtion<返回值类型或者范围> 函数名;
端口说明
变量定义
语句
endfuntion
funtion[7:0] getbyte;
input[15:0] address;
begin
getbyte=.......;//函数名直接作为返回值
end
endfunction