verilog之不常用语句

前言

verilog是硬件描述语言,其主要特点是针对硬件逻辑的描述;在FPGA上实现时,常用的语句往往和硬件有直接的关联。比如assign,原理图上的连线,如果不省略,应该是最频繁的语句。再如always,寄存器的驱动逻辑,作为时序的主要描述方式,成为verilog最有效的代码。然后是条件语句,完成各种控制结构。其次是计算结构,实现数据的数学转化。前面四个语法,基本占据了verilog的绝大部分的工作。在熟练掌握这四类语法后,如何熟悉应用其他语法以提高效率是需要考虑的。最好的方法就是熟悉不常用的语法,为设计提供备选项。

generate  | endgenerate

verilog中压缩代码的利器,尤其是和for配合使用时,能够起到事半功倍的效果。对于generate,需要注意的是,这个关键字声明了一个可以使用genvar驱动的结构的区域。作为变量,genvar可以驱动各种条件和循环结构。目前支持的if和for是使用较多的。其中generate if和ifdef的功能基本重叠(效率可能低于预编译),使用频率略低。generate for实际上是对某个模块或功能进行重复声明,这在硬件电路中是非常重要的。使用genvar描述模块的变化,如位宽,可以实现动态的位宽调整。这只是最初级的应用。实际上,generate结构中包含always时,条件结构可以嵌入其中,这个时候提供了一个genvar和reg变量交互的空间,可以实现寄存器根据参数实现最大化的合并。

function | endfunction

和C中函数遍地走不同,verilog中函数出现的比例十分低。这里最大的原因是函数内不能包含时序逻辑,也就是函数只能输出组合逻辑所能实现的功能。而受制于FPGA的硬件特性,组合逻辑是不能过于复杂的,否则时序会十分紧张。这就导致verilog的函数无法像C中代码逐条执行一样实现函数的反复调用。不过,函数可以作为内部计算模块,用于实现参数的自动计算。这样就不需要考虑硬件特性,只需要完成参数的计算结果输出即可。也就是说,将verilog的函数用于常量的计算可能是最好的使用方式。尤其是函数内部支持interger形式的计算,可以方便地实现某些固定公式的参数转化。如log2,exp2等函数都可以使用函数在verilog忽略硬件实现参数计算。

task | endtask

task和函数类似,不过内部可以支持时序逻辑,所以使用频率略高。在不使用参数时,task就是一段代码的换个区域书写。task内部使用的左变量和task的应用环境相关。在使用参数时,task可以实现多环境调用。task作为一段特殊的区域,可以实现function所无法实现的功能。一方面,task内部支持for结构,不过需要使用interger作为驱动变量;另一方面,支持always的赋值语句(在always内部调用)。这就提供了一种可能,在always内部使用for循环实现代码的精简。不过,这种精简必须满足硬件特性,因为task在always内部时使用的是时序逻辑。

小结

这里介绍了verilog中使用较少的三种语法。这三种语法有一定的共同处,即都支持与条件结构和循环结构的嵌入。同时也可以嵌入assign和always或者被嵌入。为了方便理解,可以将其理解为区域。generate是genvar的区域。function和task都是interger的区域。三者的区别和共同点有很多,这里只是简单列举了比较突出的点。实际应用中,需要考虑的往往是使用情景。一般在代码精简中,function用于常量计算,generate用于控制结构近似的情况,task用于参数形式近似的情况。

verilog之不常用语句的更多相关文章

  1. SQL server 常用语句

    SQL Server中常用的SQL语句   1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10. ...

  2. mysql常用语句总结

    1.创建语句 CREATE DATABASE database_name //创建数据库 //删表 DROP TABLE IF EXISTS `t_social_user_extend`; //建表C ...

  3. JS常用语句

    JavaScript常用语句 1.document.write("");    输出语句 2.JS中的注释为   // 3.传统的HTML文档顺序是:     document-& ...

  4. velocity常用语句速查表

    velocity常用语句 * 变量定义 #set($directoryRoot = "www" ) * #if($!list.size() != 0) //判断list不为空 #f ...

  5. MySQL 常用语句 (汇集)

    原文地址:MySql常用语句作者:wuyanle 一.mysql常用语句 创建,删除和最基本查询: 显示数据库  mysql->show databases; 创建数据库  mysql-> ...

  6. mysql数据库常用语句2

    关于mysql常用语句的整理,上一篇涉及到ddl.dml以及一些简单的查询语句. 1:mysql分页查询 select * from table_name limit 5,10;   从下标为5元素查 ...

  7. mysqldump的常用语句及各参数详解

    mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...

  8. mysql学习一 常用语句

    操作系统为windows  1 启动关闭mysql服务 //windows mysqld --console //开启mysql服务 mysqladmin -uroot shutdown //关闭my ...

  9. mo系统常用语句

    mo系统常用语句 一.总结 一句话总结: 1.语言:双语设置(繁体,英语)语句? {:chooseLanguage("確定要刪除么","Are you sure you ...

  10. MySQL 常用语句大全

    MySQL 常用语句大全 一.连接 MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例 1:连接到本机上的 MYSQL. 首先在打开 DOS 窗口,然后进入目录 my ...

随机推荐

  1. idea 报错: Unable to import maven project: See logs for details

    错误再现: idea 工具日志: 1) No implementation for org.apache.maven.model.path.PathTranslator was bound. whil ...

  2. Swoole从入门到入土(25)——多进程[进程间无锁计数器]

    Atomic 是 Swoole 底层提供的原子计数操作类,可以方便整数的无锁原子增减.原子计数器有如下特点: - 使用共享内存,可以在不同的进程之间操作计数 - 基于 gcc/clang 提供的 CP ...

  3. 《.NET物联网从零开始系列》-开篇

    近日搞硬件网关时,那些残存的数电.模电和通信原理的记忆时常在脑海中萦绕: 想起来多年前看张高兴的博客学会了.netcore+树莓派进行物联网开发. 使用dragonboard(龙板)搭载windows ...

  4. springboot项目读取自定义的properties文件

    现在我们要在某个地方读取config.properties里的这几个属性值 这里使用三个注解即可读取自定义的配置文件内容(注意这里需要写他的setter和getter方法) @Component #注 ...

  5. Java Enumeration接口详解

    二话不说,来看官方文档: public interface Enumeration<E> An object that implements the Enumeration interfa ...

  6. spring boot整合spring security自定义登录跳转地址

    说明 在博客用户登录后我想跳转到各自用户的博客首页,我们知道这个地址是动态的. 例如: http://localhost:8080/blog/zhangsan, 每个用户地址不一样.这时候我就用到了自 ...

  7. win32 - wsprintfW的使用

    文档:将格式化的数据写入指定的缓冲区.根据格式字符串中相应的格式说明,将转换任何参数并将其复制到输出缓冲区.该函数在其写入的字符后附加一个终止空字符,但返回值的字符计数中不包含终止空字符. 例子: # ...

  8. 【Android 逆向】【攻防世界】android2.0

    这是一道纯算法还原题 1. apk安装到手机,提示输入flag,看来输入就是flag 2. jadx 打开apk查看 this.button.setOnClickListener(new View.O ...

  9. mac上安装vue

    安装node.js brew install nodejs node -v #查看版本 给nodejs模块安装目录设置访问权限 sudo chmod -R 777 /usr/local/lib/nod ...

  10. 【LeetCode回溯算法#04】组合总和I与组合总和II(单层处理位置去重)

    组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target ...