verilog学习--1、语言要素

先看一个例子

/*This is first Verilog progaram*/
·timescale 1ns/1ns
module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry;
/**/assign #2 Sum=A^B;assign #5 Carry=A&B;
endmodule; 

Verilog以module为单位编写,每个文件一个module,文件名与module名相同

  • 第1行为注释;
  • 第2行为编译指令;
  • 第3行为模块声明开始,模块的名称为halfAdder,模块有4个端口;
  • 第4、5行对端口的类型进行了声明;
  • 第6、7、8对模块的行为进行了描述(或定义或设计);
  • 第9行声明模块结束

一个模块的基本语法如下:

module module_name (port_list);Declarations:reg, wire, parameter,input, output, inout,function, task, . . .Statements:Initial statementAlways statementModule instantiationGate instantiationUDP instantiationContinuous assignment
endmodule

    这些语句在模块中出现的顺序无关紧要,这些语句是并发的。

    1.注释:

    有两种形式---与C语言相同

    /*第一种形式:可以扩展至多行 */
    //第二种形式:在本行结束。

    2.编译指令

    `(反引号)开始的某些标识符是编译器指令。在 Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。

    完整的标准编译器指令如下 :
    • `define, `undef
    • `ifdef, `else, `endif
    • `default_nettype
    • `include
    • `resetall
    • `timescale
    • `unconnected_drive, `nounconnected_drive
    • `celldefine, `endcelldefine

    2.1`define 和`undef

    `define指令用于文本替换,它很像 C语言中的#define 指令

    2.2 `ifdef, `else, `endif

    这些编译指令用于条件编译

    2.3`default_nettype

    该指令用于为隐式线网指定线网类型。也就是将那些没有被说明的连线定义线网类型。
    `default_nettype wand
    该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中没有说明的连线,那么该线网被假定为线与类型。

    2.4`include

    `include 编译器指令用于嵌入内嵌文件的内容。

    2.5 `resetall

    该编译器指令将所有的编译指令重新设置为缺省值。

    2.6 `timescale

    在Verilog HDL 模型中,所有时延都用单位时间表述。

    2.7 `unconnected_drive和`nounconnected_drive

    在模块实例化中,出现在这两个编译器指令间的任何未连接的输入端口或者为正偏电路状态或者为反偏电路状态。
    `unconnected_drive pull1
    . . .
    /*在这两个程序指令间的所有未连接的输入端口为正偏电路状态(连接到高电平) */
    `nounconnected_drive
    `unconnected_drive pull0
    . . .
    /*在这两个程序指令间的所有未连接的输入端口为反偏电路状态(连接到低电平) */
    `nounconnected_drive

    2.8 `celldefine 和 `endcelldefine

    这两个程序指令用于将模块标记为单元模块。它们表示包含模块定义,如下例所示。
    `celldefine
    module FD1S3AX (D, CK, Z) ;
    . . .
    endmodule
    `endcelldefine
    某些PLI例程使用单元模块。

    3.常量

    3.1基本型:4种

    0、1、x、z

    3.2数值型:整型和实型

    3.2.1 整型

    两种表示方法:

    1.简单的十进制格式

    2.基数格式

    这种形式的整数格式为:
    [size ] 'base value

    s i z e 定义以位计的常量的位长; b a s e为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一; v a l u e是基于 b a s e的值的数字序列。值 x和z以及十六进制中的 a到f不区分大小写。

    • 基数格式计数形式的数通常为无符号数。
    • 如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。
    • 如果定义的长度比为常量指定的长度长,通常在左边填 0补位。但是如果数最左边一位为x或z,就相应地用x或z在左边补位。
    • 如果长度定义得更小,那么最左边的位相应地被截断。
    • ?字符在数中可以代替值z在值z被解释为不分大小写的情况下提高可读性

    3.2.2 实型

    两种表示方法:

    1.简单的十进制格式

    2.科学计数法

    Ve r i l o g语言定义了实数如何隐式地转换为整数。实数通过四舍五入被转换为最相近的整
    数。

    3.3字符串型

    字符串是双引号内的字符序列。字符串不能分成多行书写。

    5.变量

    5.1.标识符

    Verilog HDL中的标识符(identifier)可以是任意一组字母、数字、 $符号和_(下划线)符号的
    组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。

    *转义标识符:

    转义标识符以 \(反斜线 )符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。

    *关键字:

    Verilog HDL 定义的一系列保留字,注意只有小写的关键字才是保留字。

    5.2变量的类型

    2类:net 和 register

    5.2.1 线网类型net type

    具体又分为6大类11种

    net type 表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为 z。

    简单的线网类型说明语法为:
    net_kind [msb:lsb] net1, net2, . . . , netN;
    n e t _ k i n d 是上述线网类型的一种。 m s b和l s b 是用于定义线网范围的常量表达式;范围定义是可选的;如果没有定义范围,缺省的线网类型为 1位。

    • 1.wire和tri

    • 2.wand和triand

    • 3.wor和trior

    • 4.trireg

    • 5.tri0和tri1

    • 6.supply0和supply1

    supply0用于对“地”建模,即低电平 0;s u p p l y 1网用于对电源建模,即高电平 1;例如:
    supply0 Gnd, ClkGnd;
    supply1 [2:0] Vcc;

    5.2.2 寄存器类型 register type

    具体有5种:reg、integer、time、real、realtime

    • 1.reg寄存器类

    register type表示一个抽象的数据存储单元,它只能在 always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有 x的缺省值。

    寄存器数据类型 reg是最常见的数据类型。 reg类型使用保留字 reg加以说明,形式如下:
    reg
    [ msb: lsb] reg1, reg2, . . . regN;

    • 2存储器类型:

    存储器是一个寄存器数组。存储器使用如下方式说明:

    reg [ msb: lsb] memory1[ upper1: lower1], memory2[ upper2: lower2], . . . ;

    • 3.integer整数寄存器类

    • 4.time类

    • 5.real和realtime类

    6.参数

    参数是一个常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。参数说明形式如下:
    parameter param1 = const_expr1, param2 = const_expr2, ...,paramN = const_exprN;

    7.行为描述方式

    7.1数据流描述

    用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。 连续赋值语句的语法为 :
    assign [delay] LHS_net = RHS_ expression;

    7.2行为描述方式

    设计的行为功能使用下述过程语句结构描述:
    1) initial语句:此语句只执行一次。

    2) always语句:此语句总是循环执行 , 或者说此语句重复执行

    只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原
    有值不变。所有的初始化语句和 always语句在0时刻并发执行。

    7.3结构化模式方式

    在Verilog HDL中可使用如下方式描述结构 :
    1) 内置门原语 (在门级);
    2) 开关级原语 (在晶体管级 );
    3) 用户定义的原语 (在门级);
    4) 模块实例 (创建层次结构)。
    通过使用线网来相互连接。

    7.4混合描述方式

    在模块中,结构的和行为的结构可以自由混合。也就是说,模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及 a l w a y s语句和 i n i t i a l语句的混合。它们之间可以相互包含。来自 a l w a y s语句和 i n i t i a l语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。
     

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76158.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    AC 自动机 洛谷P3808 P3796 P5357

    洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

    C++蓝桥杯实训篇(二)

    片头 嗨咯~小伙伴们&#xff01;今天我们来一起学习算法和贪心思维&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 第1题 数位排序 对于这道题&#xff0c;我们需要自己写一个排序算法&#xff0c;也就是自定义排序&#xff0c;按照数位从小到大进行排序。 举一…

    redisson常用加锁方式

    RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下&…

    Go 微服务框架 | 路由实现

    文章目录 不用框架实现web接口实现简单的路由实现分组路由支持不同的请求方式支持同一个路径的不同请求方式前缀树应用前缀树完善路由代码 不用框架实现web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

    zabbix中通过模板实现自动发现对tcp端口批量监控

    主要为了解决监控大量端口&#xff0c;避免繁琐的重复操作监控项和触发器 诸位~ 仅供参考哈 自动发现监控参考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先创建一个模板 自定义名称和群组 创建自动发现规则 模板——自动发现——创建发现规则…

    Mysql备忘记录

    1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

    【蓝桥杯】15届JAVA研究生组F回文字符串

    一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…

    X 进制减法

    题目链接&#xff1a; 思路&#xff1a; X进制数321怎么转换为十进制数为65&#xff1f;如下图&#xff1a; ①题目要求我们求 A - B 的最小值&#xff0c;对第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;当进制越小的时候差值越小&#xff0c;但进制要比 max&…

    java线程安全-单例模式-线程通信

    首先看看单例模式的写法 首先我们先来回顾一下饿汉式单例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

    大数据技术之SPARK

    Spark Core 什么是 RDD 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性&#xff1a;内存与磁盘的自动切换&#xff1b; 容错的弹性&#xff1a;数据丢失可以自动恢复&#xff1b; 计算的弹性&#xff1a;…

    Go 语言范围 (Range)

    Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言&#xff0c;由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中&#xff0c;range 是一个非常有用的关键字&#xff0c;用于遍历数组、切片、字符串以及通道&#xff08;channe…

    VUE中数据绑定之OptionAPI

    <template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

    react动态路由

    框架的权限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 权限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在该文件中 export default 一个函数&#xff0c;定义用户拥有的权限 该文件需要返回一个 functi…

    Android里面如何优化xml布局

    在 Android 开发中&#xff0c;以下是系统化的优化方案&#xff0c;从基础到高级分层解析&#xff1a; 一、基础优化策略 1. 减少布局层级 问题&#xff1a;每增加一层布局&#xff0c;测量/布局时间增加 1-2ms 解决方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

    基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计

    一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…

    二分算法的入门笔记

    二分查找 使用前提&#xff1a;有序。可理解为枚举的一种技巧。时间复杂度&#xff1a; l o g ( n ) log(n) log(n) 基础模版代码 使用时根据情景进行相应的变化。注意跳出条件and分支处理方式and返回答案&#xff0c;三者之间的配合&#xff0c;不要进入死循环。可以在模拟…

    轻量级Java跨包调用(完全解耦)

    Java函数式命令模式 轻量级跨包调用解耦方案&#xff0c;让跨包调用就像调用本地接口那样简单。适用与具有公共依赖的两个jar包&#xff0c;但是又不想相互引入对方作为依赖。 函数式命令模式&#xff0c;很好地实现了跨包调用解耦的目标&#xff0c;并且通过泛型JSON动态转换保…

    离散数学问题集--问题5.9

    问题 5.9 综合了计算机组成原理、数字逻辑和离散数学中的关键概念&#xff0c;旨在帮助学生理解二进制算术运算的硬件实现、逻辑门与算术运算的关系&#xff0c;以及如何使用数学方法来验证数字系统的正确性。它强调了从规范到实现再到验证的完整过程。 思想 函数抽象&#xf…

    OpenLayers:海量图形渲染之矢量切片

    最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。在咨询了许多朋友之后发现矢量切片似乎是行业内最常用的一种解决方案&#xff0c;于是我便开始研究它该如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用栅格切片的方式把矢…

    神经网络入门—自定义网络

    网络模型 定义一个两层网络 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F# 定义神经网络模型 class Net(nn.Module):def __init__(self, init_x0.0):super().__init__()self.fc1 nn.Linear(1, 10)self.fc2 nn.Linear(…