Skip to content

Verilog 基础:语法、运算符与语句

Verilog
Contents

三篇入门笔记合在一起:基本语法、运算符、语句。每节下面是当时的写作日期。

Verilog 基本语法

2024-03-25

模块结构

逻辑功能定义

assign语句和元件例化(instantiate)

  • 经典行为描述方法,从信号逻辑触发,得到结果,并未描述电路是怎样连接的


1. assign语句

~ 	  //按位取反
&     //按位与
| 	  //按位或
^ 	  //按位异或
^~    //按位同或
2. 元件例化(instantiate)

3.always块语句(常用)
  • always常描述时序逻辑电路,一般情况下,不描述组合逻辑电路

理解:

  • 以上例子always语句中输出信号out不能定义为reg型(触发器,要实现保持的功能),组合逻辑电路不具备保持功能
  • wire型:输入变化,wire随之变化
  • reg型:输入变化,CLK未触发时,reg型实现保持功能

端口定义

端口定义,信号说明,信号类型声明的格式类型:

模块如何例化

位置关联法和信号名关联法

  • 模块(module)是Verilog HDL的基本单位,除了编译指令,其它所有的设计代码都必须放在一个或多个模块中

  • 一个模块内部可以使用其它模块,称为实例。上层模块可以引用底层任意层次模块的变量,引用方法为: 实例名.[第二层实例名.]


关键字

  • 事先定义好的确认符,用来组织语言结构;
  • 或者用于定义Verilog HDL提供的门元件(如and,not, or, buf)
  • 用小写字母定义!


数据类型

  • 数据类型是用来表示数字电路中的数据存储和传送单元。

  • Verilog HDL中共有19种数据类型;

  • 其中4个最基本的数据类型为:

    • integer型
    • parameter型
    • reg型
    • wire型
  • 若未定义,则默认未wire型


常量

​ 在程序运行过程中,其值不能被改变的量,称为常量

  • 数字(包括整数,x和z值,负数)

  • parameter常量(或称符号常量)

整数型常量(即整常数)的4种进制表示形式:
  • 二进制整数(b或B)
  • 十进制整数(d或D)
  • 十六进制整数(h或H)
  • 八进制整数(o或O)
1. 整常数的3种表达方式:

注意:

  • 下面的两种方法都不可使用,必须完整定义
  • 上表数字8代表位宽为8位,只针对二进制而言。冗余保证数据不会溢出,一般定16或32位
2. x和z值
  • X是不定值(态)Z是高阻值(态)

不定态:当触发器不明确0和1时

高阻态:不导电不通电的状态为高阻态

3. 负数

在位宽前加一个减号,即表示负数,如-8‘d5

4.parameter常量
  • 用parameter来定义一个标识符,代表一个常量——称为符号常量

  • Verilog中用parameter来定义常量,即用parameter来定义一个标识符来代表一个常量,称为符号常量,即标识符形式的常量。——提升程序的可读性和可维护性

  • 常用于定义位宽或时间延迟(易变)


变量

1. Nets type——wire型变量(相当于物理的连线)

wire型变量是被给的,wire自己本身变不了,对应响应结果

2. register type(寄存器型)变量

assign wire =~s  //assign语句只能用wire, 等号右边为输入,左边为输出

always reg,等式左边必须为reg   //always里面,必须为reg

草图是一个与门:两个输入一个是reg、一个是wire,输出是wire。对应到assign语句,等号右边的输入可以是reg也可以是wire,左边被驱动的输出只能是wire。

2.1 reg型变量(相当于触发器)

reg ,往往代表触发器,自发的产生变化

wire和reg区别总结:
reg型变量wire型变量
自发产生变化本身不能产生变化
可生成及处罚,也可生成组合逻辑只能生成组合逻辑
3.数组(memory type)

  • RAM和ROM——储存芯片

  • mem(自己命名)后面跟的数值是指 有多少个reg


测试基本概念

测试的对象:RTL模块

  • tb需要包含需要测试的全部rtl内容

  • tb没有端口信号列表

tb的搭建:

Verilog 运算符

2024-03-27

运算符按功能分类

逻辑运算符

算术运算用于数值计算,逻辑运算用于逻辑判断和控制

  • !逻辑非
  • &&逻辑与
  • || 逻辑或

位运算符:

位运算符
~	//按位取反      
&	//按位与
|	//按位或(bitwise OR)操作符,它对两个数的所有位执行逻辑或操作
||    //逻辑或(logical OR)操作符,它对两个表达式执行逻辑或操作
^	//按位异或
^~,~^	//按位同或
  • 注意区分&&和&(按位与)的区别

关系运算符

<  //小于
<=
>
>=

运算结果为真,则结果为1,否则为0。若某操作数为不定值x,则返回值x

缩减运算符

单目运算符

&	//与
~&	//与非
|	//或
~|	//或非
^	//异或
~^,^~	//同或

注意:缩减运算符写在操作数左边,结果是一位的

例:

reg[3:0] a: b= | a 
			// b=(a[0] | a[1] | a[2] | a[3])

移位运算符

>>	//右移  缩小;右移一位的操作是将每一位数字向右移动一个位置。这个过程中,最右边的位(最低位)被丢弃,然后左边填充0

<<	//左移  放大,左移几位在后面添几个零,左移会扩充位数

用法:A>>n // 将操作数右移n位,同时用n个0填补移出的空位。

例: 4’b1001>>3 = 4b’0001; 4’b1001>>4 = 4b’0000 4’b10111>>1 = 4’b01011

4‘b1001<<1= 5’b10010 4’b1001<<2 = 6’b100100;

位拼接运算符(重点)

还有一些简化写法:如

  • {4{w}}
  • {b,{3{a,b}}}

注意:在位拼接表达式中,不允许存在没有指明位数的信号,必须指明信号的位数;若未指明,则默认为32位的二进制数!

  • 如{1,0}=64’h00000001_00000000(32位的1和32位的0作拼接),注意{1.0}不等于2‘b10

等式运算符

== 	//等于——
		两个操作数逐位相等,结果才是1,若某些位有x,则结果为x
!= 	//不等于
=== 	//全等
		完全相等,如两个xx,则结果也是1
!== 	//不全等

注意:==和===的区别

条件运算符

  • 属于三目运算符

信号=a?表达式1 : 表达式2

如果a为真,则选表达式1,否则表达式2

运算符的优先级

  • 不用单独记忆,括号里面先运算

延迟四个单位,对ain取值,%取余

例化 (名随便取)

逗号后面打一个空格,来连接信号,提高可读性

表示0-15的数,ain和bin能取到的最大值

没有finish的话仿真会一直执行下去,看不到波形

  1. 声明

  2. 赋初值

  3. 时钟信号规律

  4. 波形“输入”的变化取值

  5. 开始是时候结束

  6. 例化

Verilog 语句

2024-03-27

注: 黑色可综合,可写到RTL中,蓝色都是不可综合的。黄色在部分工具可综合,当作不可综合

  • 上表中,注明不可综合的语句,通常用在测试文件中;未注明的语句均是可综合的。

  • 表 中 有 4 种 语 句 (f o r k _ j o i n , i n i t i a l ,’include,’timescale)是不可综合的,它们通常用在测试模块中。


一、块语句

用来将两条或多条语句组合在一起,使其在格式上更像一条语句,以增加程序的可读性。(中间相当于括号)

两种块语句

  1. begin_end——标识顺序执行的语句

特点:

  • 块内的语句是顺序执行的;

  • 每条语句的延迟时间是相对于前一条语句的仿真时间而言的;

  • 直到最后一条语句执行完,程序流程控制才跳出该顺序块。

tips:RTL中不用#,但是在tb中可以用#

  1. fork_join——标识并发执行的语句——不可综合

声明方式与begin_end相同

  1. begin_end和fork_join语句的区分

    begin  //顺序执行
    #50	r='h35;
    #50 r='hE2;
    end
    
    
    fork_join   //并发
    #50	r='h35;
    #100 r='hE2;
    join 
       		//以上两种代码代表的情况一致

注意:顺序块和并行块可以相互嵌套使用

eg:

begin
x=1’b0
	fork
	...
	join
	#12 w = {y,z};
end

二、结构语句

结构语句也叫过程语句

  • initial说明语句——只执行一次,不可综合
  • always说明语句——不断重复执行,直到仿真结束

1. always

2. initial

参考

Discussion

Loading comments…

Checking sign-in…