verilog之不常用语句
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之不常用语句的更多相关文章
- SQL server 常用语句
SQL Server中常用的SQL语句 1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10. ...
- mysql常用语句总结
1.创建语句 CREATE DATABASE database_name //创建数据库 //删表 DROP TABLE IF EXISTS `t_social_user_extend`; //建表C ...
- JS常用语句
JavaScript常用语句 1.document.write(""); 输出语句 2.JS中的注释为 // 3.传统的HTML文档顺序是: document-& ...
- velocity常用语句速查表
velocity常用语句 * 变量定义 #set($directoryRoot = "www" ) * #if($!list.size() != 0) //判断list不为空 #f ...
- MySQL 常用语句 (汇集)
原文地址:MySql常用语句作者:wuyanle 一.mysql常用语句 创建,删除和最基本查询: 显示数据库 mysql->show databases; 创建数据库 mysql-> ...
- mysql数据库常用语句2
关于mysql常用语句的整理,上一篇涉及到ddl.dml以及一些简单的查询语句. 1:mysql分页查询 select * from table_name limit 5,10; 从下标为5元素查 ...
- mysqldump的常用语句及各参数详解
mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...
- mysql学习一 常用语句
操作系统为windows 1 启动关闭mysql服务 //windows mysqld --console //开启mysql服务 mysqladmin -uroot shutdown //关闭my ...
- mo系统常用语句
mo系统常用语句 一.总结 一句话总结: 1.语言:双语设置(繁体,英语)语句? {:chooseLanguage("確定要刪除么","Are you sure you ...
- MySQL 常用语句大全
MySQL 常用语句大全 一.连接 MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例 1:连接到本机上的 MYSQL. 首先在打开 DOS 窗口,然后进入目录 my ...
随机推荐
- 【Unity3D】广告牌特效
1 前言 广告牌特效是指:空间中的一个 2D 对象始终(或尽可能)面向相机,使得用户能够尽可能看清楚该 2D 物体.广告牌特效一共有以下 3 种: 正视广告牌:广告牌始终以正视图姿态面向相机,即广 ...
- java使用Timer定时器在指定时间执行程序
下面是一个利用Timer定时器在每天指定时间执行批处理程序的例子. 有关 java.util.Timer 详细知识请参考API. 值得注意的一点是Timer是单线程顺序执行多个任务的. package ...
- SetWindowHookEx的复习
#include <Windows.h> #include <iostream> using namespace std; HHOOK keyboardHook; LRESUL ...
- C++ STL学习
C++ STL学习 目录 C++ STL学习 容器库概览 对可以保存在容器中的元素的限制 容器支持的操作 所有容器都支持的操作或容器成员 迭代器 迭代器的公共操作 迭代器的类型 迭代器的const属性 ...
- 【Android逆向】滚动的天空中插入smali日志
1. 编写一个MyLog.java 放到一个android工程下,编译打包,然后反编译拿到MyLog的smali代码 package com.example.logapplication; impor ...
- Python笔记五之正则表达式
本文首发于公众号:Hunter后端 原文链接:Python笔记五之正则表达式 这一篇笔记介绍在 Python 里使用正则表达式. 正则表达式,Regular Expression,可用于在一个目标字符 ...
- mysql-数据类型,类型约束,联合唯一约束,表与表之间的关系,存储引擎---day36
# ### char varchar(补充) char 字符长度 255个 varchar 字符长度 21845个 # ### part1 数据类型 -时间 date YYYY-MM-DD 年月日(结 ...
- proc_sys_reset 复位时序
proc_sys_reset 模块时序 下面为仿真时序,这里做一个record , 后面有使用问题可以参考该时序: 点击查看代码 module test( ); bit slowest_sync_cl ...
- Taurus.MVC WebMVC 入门开发教程7:部分视图和页面片段(结束篇)
本系列的目录大纲为: Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行 Taurus.MVC WebMVC 入门开发教程2:一个简单的页面呈现 Taurus.MVC WebM ...
- BeanShell 如何加密加签?
一 首先我们要搞清楚接口签名步骤: **第一步:初步实现接口****第二步:找开发拿到算法和key** * key:sAHDRNJg0ZevmEn7HwBfbw== * 算法:HmacMD5 咱们就找 ...