一、循环语句

1、forever语句

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

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

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

  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. end

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

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

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

  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. wait(条件表达式) 语句/语句块;
    2. wait(条件表达式);

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

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

四、事件控制语句

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

五、task和function语句

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

例:

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

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

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

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

fork : <>

时间控制1 行为语句1;

时间控制n 行为语句n;

join

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

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

Verilog HDL常用的行为仿真描述语句的更多相关文章

  1. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  2. Verilog HDL的程序结构及其描述

    这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出. 一.Verilog ...

  3. Verilog HDL常用综合语法

    前面已经记录了一些组成Verilog的基本组成,可以用这些基本组成来构成表达式.这一节,就来记录一下把这些表达式构成一个文件的各种行为描述语句. ①这里用Verilog基本要素进行的行为描述主要是针对 ...

  4. 你知道Verilog HDL程序是如何构成的吗

    本节通过硬件描述语言Verilog HDL对二十进制编码器的描述,介绍Verilog HDL程序的基本结构及特点. 二十进制编码器及Verilog HDL描述 二十进制编码器是数字电路中常用的电路单元 ...

  5. Sublime Text 2 和 Verilog HDL

    Sublime Text 2 和 Verilog HDL Date  Fri 04 July 2014 Tags Sublime Text / Vivado Sublime Text 代码编辑器之于程 ...

  6. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  7. 写自己的第二级处理器(3)——Verilog HDL行为语句

    我们会继续上传新书<自己动手写处理器>(未公布),今天是第七章,我每星期试试4 2.6 Verilog HDL行为语句 2.6.1 过程语句 Verilog定义的模块一般包含有过程语句,过 ...

  8. 关于初次使用Verilog HDL语言需要懂的基本语法

    关于初次使用Verilog HDL语言需要懂的基本语法 1.常量 数字表达式全面的描述方式为:<位宽><进制><数字> 8’b10101100,表示位宽为8的二进制 ...

  9. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)

    本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...

随机推荐

  1. bzoj2506

    不知道该给这题贴什么标签了,但是这是一道好题1.注意这道题的询问是满足区间减法的,我们可以把一个询问拆成两个询问离线搞搞,这个思想在后面会见到2.分类的思想,这道题的求相同余数看似很烦,实际上我们发现 ...

  2. 7 个面向Web开发者的实用CSS3教程推荐

    通过CSS来创建精细.复杂的效果,成为了Web前端开发的未来趋势.世界各地的设计师认为CSS3是一项非常具有潜力的技术,未来将会创造更多不可思议的美妙设计. 本文为Web开发者带来了一些与CSS3相关 ...

  3. 年末促销 Windows Azure在线充值送微软商城硬件大礼包

    春节前充值,尽享云端体验, 缤纷好礼持续进行时.即日起至2015年2月13日, 充值1000元以上即享好礼.您可以查阅WindowsAzure 官网活动页面,即刻参与活动:http://www.win ...

  4. C# GC.Collect()

    用C#写了一个运用ICE组件进行接口通信的服务程序,程序运行很正常,可是在客户端调用ICE接口时出现了大量的数据丢失,而且偶尔还通信不上,服务端最明显的现象就是telnet服务的通信端口时不通(cmd ...

  5. 终于写好了SR4000的一个实用类了

    /*----------------------------------------------------------------------------- *   *   版权声明: *   可以 ...

  6. oracle 分区和分区索引

    一.个人理解:建表时一般都会指定在一个表空间上,但是可能随着表空间扩大,查询越来越慢,分区表就是将一个表实际存在不同的表空间,oracle存储分为块,断,表空间.新建一个表,会给表分配指定大小的段,段 ...

  7. git引用^和~的区别

    这篇git文章必转:解答我一直的疑惑 http://www.cnblogs.com/hutaoer/archive/2013/05/14/3078191.html 一. 引子 在git操作中,我们可以 ...

  8. 路由器中pppoe,动态IP,静态IP的区别

    路由器中pppoe,动态IP,静态IP的区别 要把路由器设置得能上网,无非就是设置WAN外网接口连接而已.WAN接口能上网,则连接的电脑就能上网,反之则上不了网.只不过WAN接口往往有pppoe,动态 ...

  9. Hadoop概念学习系列之如何去找到历史版本的Hadoop发行包(三十四)

    如何去找到历史版本的Hadoop发行包 找到Hadoop历史版本 这里我需要的Hadoop版本是2.0.3.打开hadoop的下载页面 http://www.apache.org/dyn/closer ...

  10. Learning JavaScript Design Patterns The Constructor Pattern

    In classical object-oriented programming languages, a constructor is a special method used to initia ...