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语句内被赋值的语句必须为寄存器类型变量。其主要特点为:并行块内语句是同时、独立开始执行;并行块语句中指定的延时控制都是相对于程序流程进入并行块的时刻的延时;整个并行块的执行时间等于执行时间最长的那条语句所执行的时间;并行块可以和串行块混合嵌套使用。
- FPGA学习笔记:面向验证和仿真的行为描述语句(2)
- FPGA学习笔记:面向验证和仿真的行为描述语句(1)
- FPGA学习笔记:面向验证和仿真的行为描述语句(3)
- xilinx fpga 学习笔记6:行为仿真
- Verilog HDL常用的行为仿真描述语句(一)
- Verilog HDL常用的行为仿真描述语句(二)
- Verilog HDL常用的行为仿真描述语句(三)
- Verilog HDL常用的行为仿真描述语句(四)
- Verilog HDL常用的行为仿真描述语句(五)
- Verilog HDL常用的行为仿真描述语句(六)
- Verilog HDL常用的行为仿真描述语句
- FPGA编程基础(二)--常用行为仿真描述
- FPGA仿真--前仿真和后仿真
- FPGA仿真--前仿真和后仿真
- FPGA学习笔记 Verilog HDL语句(基础)
- FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真
- FPGA开发之modelsim和ISE的联合仿真
- FPGA 学习之路(四) modesim仿真方法
- HTTP_REFERER和HSTS
- How does a HashMap work in JAVA
- mybatis中resultMap使用之返回分组数据
- 个税案例算法
- 指定jre运行jar程序
- FPGA学习笔记:面向验证和仿真的行为描述语句(2)
- #ifdef __cplusplus extern "C" { #endif /* __cplusplus */
- reducer中处理数组数据的赋值
- Mybatis使用maven打包出现的问题
- web中ajax传值乱码的情况
- SCOI 2007 压缩 C++
- Outline of Machine Learning created by Andrew Ng on Coursera
- 安卓手机数据即使丢失了也可以这样找回来,操作攻略走起!
- php不输出错误信息解决办法