拼接符
在Verilog HDL语言有一个特殊的运算符:位拼接运算符{},用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。
基本信息
- 中文名
拼接符
- 领域
Verilog HDL语言
简介
在Verilog HDL语言有一个特殊的运算符:位拼接运算符{},用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。位拼接也可以用重复法来简化表达式,还可以用嵌套的方式来表达。
Verilog运算符
Verilog的许多运算符和C语言类似,但是有一部分运算符是特有的,例如拼接运算符、缩减运算符、带有无关位的相等运算符等。
按位
按位取反(~):1个多位操作数按位取反。例如:a=4'b1011,则~a的结果为4'b0100
按位与(&):2个多位操作数按位进行与运算,各位的结果按顺序组成一个新的多位数。例如:a=2'b10,b=2'b11,则a&b的结果为2'b10
按位或(|):2个多位操作数按位进行或运算,各位的结果按顺序组成一个新的多位数。例如:a=2'b10,b=2'b11,则a|b的结果为2'b11
按位异或(^):2个多位操作数按位进行异或运算,各位的结果按顺序组成一个新的多位数。例如:a=2'b10,b=2'b11,则a^b的结果为2'b01
按位同或(~^或^~):2个多位操作数按位进行同或运算,各位的结果按顺序组成一个新的多位数。例如:a=2'b10,b=2'b11,则a~^b的结果为2'b10
逻辑
逻辑取反(!):对1个操作数进行逻辑取反,如果这个操作数为0,则结果为1;如果这个操作数不为0,则结果为0
逻辑与(&&):对2个操作数进行逻辑与,如果二者同为0或同不为0,则结果为1,否则为0。例如:3 && 0的结果为0。
逻辑或(||):对2个操作数进行逻辑或,如果二者其中至少有一个不为0,则结果为1,否则为0。例如:3||0的结果为1。
缩减
缩减与(&):对一个多位操作数进行缩减与操作,先将它最高位与次高位进行与操作,其结果再与第二次高位进行与操作,直到最低位。例如:&(4'b1011)的结果为0
缩减与非(~&):对一个多位操作数进行缩减与非操作,先将它最高位与次高位进行与非操作,其结果再与第二次高位进行与非操作,直到最低位。例如:~&(4'b1011)的结果为1
缩减或(|):对一个多位操作数进行缩减或操作,先将它最高位与次高位进行或操作,其结果再与第二次高位进行或操作,直到最低位。例如:|(4'b1011)的结果为1
缩减或非(~|):对一个多位操作数进行缩减或非操作,先将它最高位与次高位进行或非操作,其结果再与第二次高位进行或非操作,直到最低位。例如:~|(4'b1011)的结果为0
缩减异或(^):对一个多位操作数进行缩减异或操作,先将它最高位与次高位进行异或操作,其结果再与第二次高位进行异或操作,直到最低位。例如:^(4'b1011)的结果为1
缩减同或(~^or^~):对一个多位操作数进行缩减同或操作,先将它最高位与次高位进行同或操作,其结果再与第二次高位进行同或操作,直到最低位。例如:~^(4'b1011)的结果为0
算术
加(+):2个操作数相加
减(-):2个操作数相减或取1个操作数的负数(二进制补码表示)
乘(*):2个操作数相乘
除(/):2个操作数相除
求幂(**)}}:2个操作数求幂,前一个操作数为底数,后一个操作数为指数
关系
大于(>):比较2个操作数,如果前者大于后者,结果为真
小于(<):比较2个操作数,如果前者小于后者,结果为真
大于或等于(>=):比较2个操作数,如果前者大于或等于后者,结果为真
小于或等于(<=):比较2个操作数,如果前者小于或等于后者,结果为真
逻辑相等(==):2个操作数比较,如果各位均相等,结果为真。如果其中任何一个操作数中含有x或z,则结果为x
逻辑不等(!=):2个操作数比较,如果各位不完全相等,结果为真。如果其中任何一个操作数中含有x或z,则结果为x
case相等(===):2个操作数比较,如果各位(包括x和z位)均相等,结果为真
case不等(!==):2个操作数比较,如果各位(包括x和z位)不完全相等,结果为真
移位
逻辑右移(>>):1个操作数向右移位,产生的空位用0填充
逻辑左移(<<):1个操作数向左移位,产生的空位用0填充
算术右移(>>>):1个操作数向右移位。如果是无符号数,则产生的空位用0填充;有符号数则用其符号位填充
算术左移(<<<):1个操作数向左移位,产生的空位用0填充
拼接({,}):2个操作数分别作为高低位进行拼,例如:{2'b10,2'b11}的结果是a'b1011
重复({n{m}}):将操作数m重复n次,拼接成一个多位的数。例如:A=2'b01,则{2{A}}的结果是4'b0101
条件(?:):根据?前的表达式是否为真,选择执行后面位于:左右两个语句。例如:(a>b)?(a=a-1):(b=b-2),如果a大于b,则将a-1的值赋给a,否则将b-2的值赋给b
Verilog其他语言要素
Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯。一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受。不过,Verilog与C语言还是存在许多差别。另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器、过程中的非阻塞赋值等。总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言。
空白符
空白符是指代码中的空格(对应的转义标识符为\b)、制表符(\t)和换行(\n)。如果这些空白符出现在字符串里,那么它们不可忽略。除此之外,代码中的其他空白符在编译的时候都将会被视为分隔标识符,即使用2个空格或者1个空格并无影响。不过,在代码中使用合适的空格,可以让上下行代码的外观一致(例如使赋值运算符位于同一个竖直列),从而提高代码的可读性。
注释
为了方便代码的修改或其他人的阅读,设计人员通常会在代码中加入注释。与C语言一样,有两种方式书写注释。第一种为多行注释,即注释从/*开始,直到*/才结束;另一种为单行注释,注释从//开始,从这里到这一行末尾的内容会被系统识别为注释。
某些电子设计自动化工具,会识别出代码中以特殊格式书写、含有某些预先约定关键词的注释,并从这些注释所提取有用的信息。这些注释不是供人阅读,而是向第三方工具提供有关设计项目的额外信息。例如,某些逻辑综合工具可以从注释中读取综合的约束信息。
大小写敏感性
Verilog是一种大小写敏感的硬件描述语言。其中,它的所有系统关键字都是小写的。
标识符及保留字
Verilog代码中用来定义语言结构名称的字符称为标识符,包括变量名、端口名、模块名等等。标识符可以由字母、数字、下划线以及美元符($)来表示。但是标识符的第一个字符只能是字母、数字或者下划线,不能为美元符,这是因为以美元符开始的标识符和系统任务的保留字冲突。
和其他许多编程语言类似,Verilog也有许多保留字(或称为关键字),用户定义的标识符不能够和保留字相同。Verilog的保留字均为小写。变量类型中的wire、reg、integer等、表示过程的initial、always等,以及所有其他的系统任务、编译指令,都是关键字。可以查阅官方文献以完整的关键字的列表。
转义标识符
转义标识符(又称转义字符),是由\开始,以空白符结束的一种特殊编程语言结构。这种结构可以用来表示那些容易与系统语言结构相同的内容(例如"在系统中被用来表示字符串,如果字符串本身的内容包含一个与之形式相同的双引号,那么就必须使用转义标识符)。下面列出了常用的几种转义标识符。除此之外,在反斜线之后也可以加上字符的ASCII,这种转义标识符相当于一个字符。常用的转义标识符有\n(换行)、\t(制表位)、\b(空格)、\\(反斜杠)和\"(英文的双引号)等。