Verilog HDL常用的行为仿真描述语句

                                                                                                        一、循环语句

1、forever语句

forever语句必须写在initial模块中,主要用于产生周期性波形。

2、利用for、while循环语句完成遍历

for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:

[c-sharp:nogutter]  view plain copy
  1. parameter mode_num = 5;  
  2. initial begin  
  3.     // 各种不同模式的参数配置部分  
  4.     for(i=0; i<mode_num-1; i=i+1) begin  
  5.         case (i)  
  6.             0: begin  
  7.                .  
  8.                .  
  9.                end  
  10.             1: begin  
  11.                .  
  12.                .  
  13.                end  
  14.         .  
  15.         .  
  16.         endcase  
  17.     end  
  18.   
  19.     // 各种模式共同的测试参数  
  20.     .  
  21.     .  
  22. end  

3、利用repeat语句来实现有次数控制的事件,其典型示例如下:

 

[c-sharp]  view plain copy
  1. initial begin  
  2.     // 初始化  
  3.     in_data = 0;  
  4.     wr = 0;  
  5.   
  6.     // 利用repeat语句将下面的代码执行10次  
  7.     repeat(10) begin  
  8.         wr = 1;  
  9.         in_data = in_data + 1;  
  10.         #10;  
  11.         wr = 0;  
  12.         #200;  
  13.     end  
  14. end  

4、用disable实现循环语句的异常处理,其典型示例如下:

[c-sharp]  view plain copy
  1. begin : one_branch  
  2.     for(i=0; i<n; i=i+1) begin : two_branch  
  3.         if (a==0)  
  4.             disable one_branch;  
  5.         if (a==b)  
  6.             disable two_branch;  
  7.     end  
  8. end  

                                                                                              二、force和release语句

force/release语句用来跨越进程对一个寄存器或一个电路网络进行赋值。

force语句可为寄存器类型和线网类型变量强制赋值。

当应用于寄存器变量时,寄存器当前值被force覆盖;当release语句应用于寄存器变量时,寄存器当前值将保持不变,知道重新赋值。

当force语句应用于线网变量时,数值立即被force覆盖;当release语句应用于线网变量时,线网数值立即恢复到原来的驱动值。

                                                                                 三、wait语句

wait语句是一种不可综合的电平触发事件控制语句,有如下两种形式:

  1.  
    1. wait(条件表达式) 语句/语句块;
    2. wait(条件表达式);

对于第一种形式,语句块可以是串行块(begin…end)或并行块(fork…join)。当逻辑表达式为“真”时,语句块立即得到执行;否则,暂停进程并等待,直到逻辑表达式变为“真”,再开始执行。

对于第二种形式,当仿真执行到wait语句时,如果条件表达式为真,那么立即结束该语句的执行,仿真程序继续往下执行;否则,仿真程序进入等待状态,直到条件表达式为真。

                                                                             四、事件控制语句

在仿真程序中,可以通过“@(事件表达式)”来完成单次事件的触发。分电平触发和信号跳变沿(posedge上升沿和negedge下降沿)触发两大类。


                                                                          五、task和function语句

task语句和function语句可以将固定操作封装起来,配合延时控制语句,可精确模拟大多数常用的功能模块。

 

例:

[c-sharp]  view plain copy
  1. 'timescale 1ns / 1ps  
  2.   
  3. module tb_tri;  
  4.     parameter bsize = 8;  
  5.     parameter clk_period = 2;  
  6.     parameter cac_delay = 6;  
  7.     reg [(bsize-1):0] din;  
  8.     reg [(3*bsize-1):0] dout;  
  9.       
  10.     // 定义完成3次方运算的task  
  11.     task tri_demo;  
  12.         input [(bsize-1):0] din;  
  13.         output [(3*bsize-1):0] dout;  
  14.         #cac_delay dout = din*din*din;  
  15.     endtask  
  16.       
  17.     // 在串行语句块中调用task  
  18.     initial begin  
  19.         din = 0;  
  20.     end  
  21.       
  22.     always #clk_period begin  
  23.         din = din + 10;  
  24.         // 任务调用语句  
  25.         tri_demo(din, dout);  
  26.     end  
  27.       
  28. endmodule  

                                                                   六、串行激励与并行激励语句

begin…end语句用于启动串行激励,fork…join语句用于启动并行激励。

fork…join语句语法格式如下:

fork : <>

    时间控制1 行为语句1;

    …

    时间控制n 行为语句n;

join

其中,fork…join块内被赋值的语句必须为寄存器型变量。其主要特点如下:

  1. 并行块内语句是同时开始执行的。
  2. 并行块语句中指定的延时控制都是相对于程序流程进入并行块时刻的延时。
  3. 当并行块中所有语句都执行完之后,仿真程序才跳出并行块。整个并行块的执行时间等于块中执行时间最长的那条语句的执行时间。
  4. 并行块和串行块可以混合嵌套使用。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值