FPGA学习笔记:面向验证和仿真的行为描述语句(2)

来源:互联网 发布:矩阵lu分解例题3*3 编辑:程序博客网 时间:2024/06/06 08:36

常用的行为仿真描述语句
介绍一些在Testbench中经常使用到的行为描述语句,以设计出高效、规范的测试代码。
1、循环语句(功能仿真)
(1)forever语句
连续执行过程语句,若要跳出此循环,中止语句可与过程语句共同使用。在过程语句中应使用某种形式的时序控制,以防死循环。forever语句必须写在initial模块中,主要用于产生周期性波形。
语法格式:

forever   begin      ...   end

例如:

initial   begin      forever         begin            if(d) a=b+c;            else a=0;         end   end

(2)利用循环语句完成遍历
当设计代码包含多种工作模式,就需要对各种模式都进行遍历测试,利用循环下标来传递各种模式的配置,其典型应用模板如下:

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

在多分支情况下,使用for循环来简化代码的编程难度,并且降低其出错率。
(3)利用循环语句实现次数控制
repeat语句主要实现有次数控制的事件,典型事例:

initial   begin      //初始化      in_date=0;      wr=0;      repeat(10)//利用repeat语句将下面代码执行10次         begin            wr=1;            in_date=in_date+1;            #10;            wr=0;            #200;         end   end

2、force和release语句
force和release语句可以用来跨越进程对一个寄存器或电路网络赋值,一般用于强制特定的设计行为。force语句可为寄存器类型或者线网型变量强制赋值,当应用于寄存器时,寄存器当前值被force覆盖,当release语句用于寄存器时,寄存器当前值将保持不变,直到被重新赋值;当用于线网时,数值立即被force覆盖,当release语句用于线网时,线网值立即恢复到原来的驱动值。例如:

'timescale 1ns / 1psmodule tb_force;reg [7:0] q0_out;wire [7:0] q1_out;initial   begin      q0_out=0;      #100;      force q0_out=0;      #100;      relase q0_out;   endalways #10 q0_out=q0_out+1;initial   begin      #100;      force q1_out=0;      #100;      relase q1_out;   endassign q1_out=127;endmodule

3、wait语句
wait语句是一种不可综合的电平触发控制语句,语法格式:
wait(条件表达式) 语句/语句块
说明:语句块可以是串行块(begin…end)或者并行块(fork…join),当条件表达式为真(逻辑值为“1”)时,语句块立即执行,否则语句块要等到条件表达式为真时再执行。
wait(条件表达式)
说明:当仿真执行到wait语句时,如果条件表达式为真,那么立即结束该语句,仿真继续往下进行;如果为假,则仿真进入等待状态,直到条件表达式为真仿真才继续进行。例如:

'timescale 1ns /1psmodule tb_wait;reg [7:0] q0_out;reg flag;initial//初始化语句块1   begin      flag=0;      #100 flag=1;      #100 flag=0;   endinitial//初始化语句块2   begin      q0_out=0;      wait(flag==1)         begin            q0_out=100;            #100;         end      q0_out=255;   endendmodule

4、事件控制语句
仿真中也存在电平触发和信号跳变沿触发两大类,可以通过“@(事件表达式)”事件来完成单次事件的触发。单次事件触发例程:

'timescale 1ns/ 1psmodule tb_event;reg [7:0] cnt0;reg [7:0] cnt1;reg clk;initial   begin      forever          begin             clk=0;             #5;             clk=1;             #5;          end    end initial//捕获信号上升沿    begin       cnt=0;       forever          begin             @(posedge clk)//捕获脉冲沿事件                cnt0=cnt0+1;          end    end initial//捕获信号电平    begin       cnt1=0;       forever          begin             @(clk)//捕获电平事件                begin                   if(clk==1) cnt=cnt1+1;                   end          end    end endmodule   

5、task和function语句
task语句和function语句可以将固定操作封装起来,配合延时控制语句,可以精确模拟大部分常用的功能模块,具备良好的可重性。例程:

'timescale 1ns/ 1psmodule tb_tri;parameter bsize=8;parameter clk_period=2;parameter cac_delay=6;reg [(bsize-1):0] din;reg [(3*bsize):0] dout;task tri_demo;//定义完成三次方运算的task   input [(bsize-1):0] din;   output [(3*bsize):0] dout;   #cac_delay dout=din*din*din;endtaskinitial//在串行语句块中调用完成三次方运算的task   begin      din=0;   end   always # clk_priod   begin      din=din+10;      tri_demo(din,output);//任务调用语句   endendmodule

6、串行激励与并行激励语句
与可综合语句一样,begin…end用于启动串行激励,fork…join用于启动并行激励,其语法格式为:

fork   时间控制1  行为语句1   ...   时间控制n  行为语句njoin

其中,fork…join语句内被赋值的语句必须为寄存器类型变量。其主要特点为:并行块内语句是同时、独立开始执行;并行块语句中指定的延时控制都是相对于程序流程进入并行块的时刻的延时;整个并行块的执行时间等于执行时间最长的那条语句所执行的时间;并行块可以和串行块混合嵌套使用。

阅读全文
0 0
原创粉丝点击