|
一、循环语句
1、forever语句
forever语句必须写在initial模块中,主要用于产生周期性波形。
2、利用for、while循环语句完成遍历
for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:
-
parameter mode_num = 5;
-
initial begin
-
-
for(i=0; i<mode_num-1; i=i+1) begin
-
case (i)
-
0: begin
-
.
-
.
-
end
-
1: begin
-
.
-
.
-
end
-
.
-
.
-
endcase
-
end
-
-
-
.
-
.
-
end
3、利用repeat语句来实现有次数控制的事件,其典型示例如下:
-
initial begin
-
-
in_data = 0;
-
wr = 0;
-
-
-
repeat(10) begin
-
wr = 1;
-
in_data = in_data + 1;
-
#10;
-
wr = 0;
-
#200;
-
end
-
end
4、用disable实现循环语句的异常处理,其典型示例如下:
-
begin : one_branch
-
for(i=0; i<n; i=i+1) begin : two_branch
-
if (a==0)
-
disable one_branch;
-
if (a==b)
-
disable two_branch;
-
end
-
end
二、force和release语句
force/release语句用来跨越进程对一个寄存器或一个电路网络进行赋值。
force语句可为寄存器类型和线网类型变量强制赋值。
当应用于寄存器变量时,寄存器当前值被force覆盖;当release语句应用于寄存器变量时,寄存器当前值将保持不变,知道重新赋值。
当force语句应用于线网变量时,数值立即被force覆盖;当release语句应用于线网变量时,线网数值立即恢复到原来的驱动值。
三、wait语句
wait语句是一种不可综合的电平触发事件控制语句,有如下两种形式:
-
- wait(条件表达式) 语句/语句块;
- wait(条件表达式);
对于第一种形式,语句块可以是串行块(begin…end)或并行块(fork…join)。当逻辑表达式为“真”时,语句块立即得到执行;否则,暂停进程并等待,直到逻辑表达式变为“真”,再开始执行。
对于第二种形式,当仿真执行到wait语句时,如果条件表达式为真,那么立即结束该语句的执行,仿真程序继续往下执行;否则,仿真程序进入等待状态,直到条件表达式为真。
四、事件控制语句
在仿真程序中,可以通过“@(事件表达式)”来完成单次事件的触发。分电平触发和信号跳变沿(posedge上升沿和negedge下降沿)触发两大类。
五、task和function语句
task语句和function语句可以将固定操作封装起来,配合延时控制语句,可精确模拟大多数常用的功能模块。
例:
-
'timescale 1ns / 1ps
-
-
module tb_tri;
-
parameter bsize = 8;
-
parameter clk_period = 2;
-
parameter cac_delay = 6;
-
reg [(bsize-1):0] din;
-
reg [(3*bsize-1):0] dout;
-
-
-
task tri_demo;
-
input [(bsize-1):0] din;
-
output [(3*bsize-1):0] dout;
-
#cac_delay dout = din*din*din;
-
endtask
-
-
-
initial begin
-
din = 0;
-
end
-
-
always #clk_period begin
-
din = din + 10;
-
-
tri_demo(din, dout);
-
end
-
-
endmodule
六、串行激励与并行激励语句
begin…end语句用于启动串行激励,fork…join语句用于启动并行激励。
fork…join语句语法格式如下:
fork : <>
时间控制1 行为语句1;
…
时间控制n 行为语句n;
join
其中,fork…join块内被赋值的语句必须为寄存器型变量。其主要特点如下:
- 并行块内语句是同时开始执行的。
- 并行块语句中指定的延时控制都是相对于程序流程进入并行块时刻的延时。
- 当并行块中所有语句都执行完之后,仿真程序才跳出并行块。整个并行块的执行时间等于块中执行时间最长的那条语句的执行时间。
- 并行块和串行块可以混合嵌套使用。
|