顺序块:块中的语句按从前到后一条接一条执行
begin
.
.
.
end
并行块:块中的语句同时开始执行
fork
.
.
.
join
repeat循环:一个存储器的初始化也可以用repeat
reg [7:0] mem [3:0];
initial begin
i=0;
repeat(4)
begin
mem[i]=0;
i=i+1;
end
end
forever循环 :表示 永远循环,直到仿真结束, 与always的区别是,forever 必须在initial或always结构中使用。
initial begin
clk=0;
forever #10 clk=~clk;
end
非阻塞性赋值:
特点是:1.同一时间点,前面语句的赋值不能立刻被后面的语句使用。 2.所以的赋值是在一个时间点结束的时候统一完成的。
如下面的代码,仿真器的执行结果是:
在仿真0时刻,将赋值语句右侧的值0赋给某个临时寄存器中,a并未被赋值。 在仿真0时刻,将赋值语句右侧的值1赋给某个临时寄存器中,b并未被赋值。 在仿真0时刻,将赋值语句右侧的值{a,b}赋给某个临时寄存器中,但是a,b并未真正赋值,所以c得到的是a,b的旧值。 在仿真结束时,将临时寄存器的值赋值给左侧。
initial begin
a<=0;
b<=1;
c<={a,b};
end
task任务
task 任务名称;
input [宽度声明] 输入信号名;
output [宽度声明] 输出信号名;
inout [宽度声明] 双向信号名;
reg 任务所用变量声明;
begin
任务包含的语句
end
endtask
举例说明,4位全加器的任务
task add4;
input [3:0] x,y;
input cin;
output [3:0] s;
output cout;
begin
{cout,s}=x+y+cin;
end
endtask
对任务进行调用,abcde按顺序给x y cin s cout进行赋值
add4(a,b,c,d,e);
函数:函数不可以调用任务,组合逻辑仅可以写成函数,函数至少需要一个输入信号,没有输出信号。
//函数的声明格式
function 返回值的类型和范围 函数名;
input [端口范围] 端口声明;
reg、 interge等变量声明;
begin
阻塞赋值语句块
end
endfunction
举例说明,计算阶乘的函数
function integer factorial;//定义为整型
input [3:0] a;//定义输入信号
integer i;//定义函数内部变量
begin
factorial=1;
for(i=2;i<=a;i=i+1)
factorial=i*factorial;
end
endfunction
函数的调用
out=function(a);
随机函数
语法形式,seed是一个32位有符号的整型数值
$random(seed);
举例说明,给1024个存储器给随机值
integer i;
reg [7:0] men [0:1023];
initial begin
i=0;
repeat(1024)
begin
men[i]=$random;
i=i+1;
end
end
假如想生成某个范围的数值,得到一个-63——+63的随机数。
rand=$random%64;
可以用以下方法,得到0-63的数值
reg [7:0] rand;
rand={$random}%64;
条件编译指令 `ifdef `else `endif
一般情况下源程序所有的行都要参加编译,但有时候希望对其中的一部分内容只有在满足条件时才进行编译,也就是对一部分内容指定编译的条件,即“条件编译”,当满足条件时对一组语句进行编译,当条件不满足时编译另一部分.
条件编译的几种形式
当宏名已经被定义过,用·define定义,则对程序段1进行编译,否则对程序段2进行编译
`ifdef 宏名(标识符) 程序段1 `else 程序段2 `endif
其中`else部分可以没有
`ifdef 宏名(标识符) 程序段1 `endif