Verilog HDL学习记录(1~2章)

学习书籍为:《Verilog HDL数字集成电路设计原理与应用》

观看视频为:https://www.bilibili.com/video/BV12y4y1v7V3/?p=3&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=ffc2523832e6b028990c9435b7b31665

目录

1.Verilog HDL数字集成电路设计方法概述

1.1定义

1.2主要功能

1.3Verilog HDL与VHDL区别

(1)本节疑问

(1)RTL是什么

(2)IP是什么

(3)D触发器已经忘了:

2.Verilog 基本语法

2.1符号

2.1.1空白符

2.1.2注释符

2.1.3标识符和转义标识符

2.1.4关键字

2.1.5数值

1.整数及其表示

2.实数及其表示

3.字符串及其表示

2.2 数据类型

2.2.1物理数据类型

(2)本节疑问

1.Verilog中十进制数字字符集不包括 'X' 和 'Z',而其他进制却包含了这些字符。

2.①数字没有说明位宽时,默认为32位。②若没有定义一个整数的位宽,其宽度为相应值中定义的位数。这两句话不冲突吗?

3.关于进制的一些相互转换,包括小数点。

2.2.1续物理数据类型

1.连线型

2.寄存器型

2.2.2.连线型和寄存器型数据类型的声明

1.连线型数据类型的声明

2.寄存器型数据类型声明

3.物理数据类型声明示例

2.2.3 存储器型 

2.2.4 抽象数据类型

1.整型

2.时间型

3.实型

4.参属型

2.3 运算符

2.3.1 算术运算符

2.3.2 关系运算符

2.3.3相等关系运算符

​编辑 2.3.4逻辑运算符

2.3.5按位运算符

2.3.6归纳运算符

2.3.7移位运算符

2.3.8 条件运算符

2.3.9连接和复制运算符 


1.Verilog HDL数字集成电路设计方法概述

1.1定义

硬件描述语言HDL(Hardware Description Language,HDL),是一种高级程序语言,通过对数字电路和系统的语言描述,可以对数字集成电路进行设计和验证。

1.2主要功能

数字集成电路设计工程师可以根据电路结构的特点,采用层次化的设计结构,将抽象的逻辑功能用电路的方式进行实现。

1.3Verilog HDL与VHDL区别

(1)Verilog更容易上手,VHDL难度高一点;

(2)在设计范围方面,Verilog HDL和 VHDL,Verilog HDL可以描述系统级(System)、算法级(Algorithm)、寄存器传输级(RTL)、门级(Gate)和开关级(Switch)电路,而 VHDL则不具备开关级电路描述能力。但在大型的数字电路设计中,VHDL的语言更加严谨,bug更少。

(1)本节疑问

(1)RTL是什么

"RTL" 指的是 "寄存器传输级"(Register Transfer Level),这是描述数字硬件的一种方式。在RTL级描述中,设计者关注的是数据如何在寄存器之间传输,并且描述了这些数据在各个点是如何被处理的。这种级别的描述通常包括了算术运算、逻辑操作、数据路径选择等细节。

(2)IP是什么

IP核是具有知识产权核的集成电路芯核的总称,是经过反复验证的、具有特定功能的宏模块,且该模块与芯片制造工艺无关,可以移植到不同的半导体工艺中。

(3)D触发器已经忘了:

D触发器为什么应用广泛,它有什么典型应用_哔哩哔哩_bilibili

2.Verilog 基本语法

Verilog HDL语法与C语言类似。程序的语言要素也称为词法,是由符号、数据类型、运算符和表达式构成的,其中符号包括空白符、注释符、标识符和转义标识符、关键字、数值等。

2.1符号

2.1.1空白符

空白符包括空格符(\b)、制表符(\t)、换行符(\n)、换页符(\f)。

2.1.2注释符

同C语言中的注释符号一致

2.1.3标识符和转义标识符

标识符(Identifier)被用来命名信号、模块、参数等,它可以是任意一组字母、数字、$符号和_(下划线)符号的组合,标识符的字母区分大小写,第一个字符必须是字母或者下划线。例子如下图所示:

 转义标识符(Escaped Identifier),可以在一条标识符中包含任何可打印的字符,以“\”符号开头,以空白结尾(空格、制表字符、换行符)。

2.1.4关键字

Verilog HDL 内部已经使用的词称为关键字或保留字,是事先定义好的确认符,用来阻止语言结构。所有关键字都是小写,例如ALWAYS不是关键字,是标识符,always是关键字。以下是常见的关键字:

2.1.5数值

Verilog HDL 有四种基本的逻辑数值状态,通过数字/字符表达式表达数字电路中传送的逻辑状态和存储信息。其中,x和z都不区分大小写,即0x1z=0x1Z。四值电平逻辑如下表所示:

 在数值中,下划线符号_除了不能放在数值的首位外,可以随意的用在整型数与实型数中。16'b1011000110001100=16'b1011_0001_1000_1100。

1.整数及其表示

整数可以是二进制(b/B)、八进制(o/O)、十进制(d/D)、十六进制(h/H),基数符号与数字字符集如下表所示:

整数的表示形式:

+/-<size>'<basw_format><number>

+/-:正数与负数标示;

size:换算过后的二进制数的宽度;

':基数格式表示的固有字符,不能缺省;

<base_format>:基数符号

<number>:可以使用的数字字符集

注意:

(1)数字没有说明位宽时,默认为32位。

(2)x/z在二进制中代表1位x/z,在八进制中代表3位x/z,在16进制中代表4位x/z,其代表的宽度取决于所用的进制。如:

8'b1011xxxx=8’hBx

(3)若一个整数常量的位宽没有定义,其宽度为相应值中定义的位数。如:

'o642  // 位宽为9位

(4)若定义的位宽比实际的位数大,在左边补0。定义的位宽比实际的位宽小,最左边的的位被截断。

(5)“?”=z,是等价的,可相互替代。

(6)负数表示为2进制的补码形式。

(7)如果位宽和进制都缺省,则代表10进制数。

(8)数字中不能有空格,但在表示进制的字母两侧可以有空格。

2.实数及其表示

(1)十进制表示法,小数点两边必须有数字;

(2)科学计数法,564.2e2=56420.0

3.字符串及其表示

字符串是指用双引号括起来的字符序列,它必须包含在同一行中,不能分行书写。

2.2 数据类型

Verilog HDL 数据类型分为两大类:物理数据类型(连线型及寄存器型)和抽象数据类型(整型、时间型、实型及参数类型)。物理数据类型与实际硬件电路的映射关系比较明显,抽象数据类型是进行辅助设计和验证的数据类型。

2.2.1物理数据类型

使用4值逻辑电平和8种信号强度对实际的硬件电路建模。4值逻辑电平是对信号的抽象表达方式,信号强度表示不同强度的驱动源,用于解决不同驱动强度下的赋值冲突,驱动强度从supply到highz依次递减,如下表所示。

(2)本节疑问

1.Verilog中十进制数字字符集不包括 'X' 和 'Z',而其他进制却包含了这些字符。

十进制数字本质上是用来表示数值的,从0到9。而 'X' 和 'Z' 在Verilog中用来表示逻辑状态,而不是具体的数值。在二进制或十六进制的位串中,'X' 和 'Z' 可以用来标记那些不确定或高阻态的位置。

2.①数字没有说明位宽时,默认为32位。②若没有定义一个整数的位宽,其宽度为相应值中定义的位数。这两句话不冲突吗?

不冲突:

在Verilog代码中声明了一个整数类型(integerint 类型)的变量,并且没有明确指定位宽时,该变量会被认为是32位的。

integer my_var;

在Verilog代码中使用了一个数值常量,并且这个常量没有显式地指定位宽,那么它的位宽将由你实际赋予的数值决定。

reg [7:0] byte_var = 8'hFF; // 这里8'hFF是一个8位的十六进制数

3.关于进制的一些相互转换,包括小数点。

如视频中提及的2.5(D)—10.1(B),小数点前,2=10,小数点后0.5×2=1......,即0.5=1。10进制的小数点右边转换为2进制,即一直×2的值,小数点左边的值为1时,该二进制位为1,余下的小数点后面的值继续×2。如果小于1,该二进制位为0,余下的小数点继续×2。最后一位的值根据4舍5入的原则进行。

正数的反码、补码都是原码。负数的反码为负数取反(符号位不变),补码在该基础上+1。负数表现为2进制的补码形式,-4=4b'1100

2.2.1续物理数据类型

1.连线型

连线表示逻辑单元的物理连接,对应电路中的物理信号连线,这种变量类型不能保持电荷(trireg除外)。连线型变量必须要有驱动源,一种是连接到一个门或者模块的输出端,一种是用assign连续赋值语句对它进行赋值。若没有驱动源,将保持高阻态z。

(1)wire和tri

wire(连线)和tri(三态线)是最常见的两种连线型数据类型,它们语法和语义一致。不同之处在于:wire 型变量通常用来表示单个门驱动或连续赋值语句驱动的连线型数据,tri型变量则用来表示多驱动器驱动的连线型数据,主要用于定义三态的线网。(多驱动还不太理解)

(2)wor和trior

(3)wand和triand

(4)tri0和tri1

tri0(tri1)的特征是:若无驱动源驱动,其值为0(tri1的值为1)。在多个驱动源情况下,tri0/tri1 的真值表如表 2.2-6 所示。

(5)supply0和supply1

supply0用于对“地”建模,低电平0;supply1用于对电源建模,为高电平1。

(6)trireg线网

能够存储数值。

2.寄存器型

reg型变量是重要的寄存器型数据类型,对应的硬件电路具有状态保持作用,能够存储数据(触发器、锁存器)。reg型数据保持最后一次的赋值,wire需要有持续的驱动。一般情况下,reg型数据默认初始值为不定值x,缺省时位宽为1位。reg型变量一般为无符号数,若赋负数,则其自动转换成2进制补码的形式。在过程块内被赋值的每一个信号都必须定义成 reg 型,并且只能在 always 或 initial 过程块中赋值,大多数 reg 型信号常常是寄存器或触发器的输出。

2.2.2.连线型和寄存器型数据类型的声明

1.连线型数据类型的声明

<net_declaration><drive_strength><range><delay>[list_of_variables];

其中,net_declaration和list_of_variables为必选项。

net_declaration:网络型数据类型,可以是wire、tri、wand等中的任意一种。

list of variables:变量名称,一次可定义多个名称,逗号隔开。

2.寄存器型数据类型声明

<reg><range><list_of_register_variables>

range:为可选项,它指定了reg型变量的位宽,缺省时为1位。

list_of_register_variables:变量名称列表,一次可以定义多个名称,用逗号隔开。

3.物理数据类型声明示例

2.2.3 存储器型 

存储器型(memory)本质上还是寄存器型变量阵列,只是用reg型变量建立寄存器组(数组)实现存储器的功能,扩展reg型数据地址范围。

reg<range1><name_of_register><range2>;

range:可缺省,缺省时为1。

range1:存储器中寄存器的位宽,格式为[msb:lsb]。
range2:寄存器的个数,格式为[msb:lsb],即有msb-lsb+1个。
name_of_register:变量名称列表,一次可以定义多个名称,之间用逗号分开。

注意memory型和reg型数据的区别。一个由n个1位寄存器构成的存储器和一个n位寄存器的意义是不同的。

1个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。例如,对于上例可以进行“reg a=0;”的赋值操作,而不能进行“mem1=0;”的赋值操作。如果想对存储器中的存储单元进行读写操作,则必须指定该单元在存储器中的地址。

另外,进行寻址的地址索引可以是表达式,这样就可以对存储器中的不同单元进行操作。 

2.2.4 抽象数据类型

抽象数据类型包括:整型(integer)、时间型(time)、实型(real)及参数型(parameter)。只是纯数学的抽象描述,不能与实际硬件电路相映射。

1.整型

整型视为有符号数, 寄存器数据视为无符号数。

2.时间型

时间型是64位无符号数,主要用于对模拟时间的存储与计算。

3.实型

表示浮点型数据,用于延迟时间的计算。

4.参属型

参数型属于常量,仿真之前进行赋值,仿真过程中保持不变。常用于定义延迟时间和变量的位宽。

parameter 参数名x=表达式x;

表达式既可以是常数,也可以是表达式,参数定义完后,程序中出现的所有参数名会被替换为相应的表达式,其实就是编译的时候等价。

对于同一个模块来说,参数一旦被定义就不能够通过其它语句对它重新赋值。若要改变参量的值,可通过模块之间的参数传递来实现。

2.3 运算符

2.3.1 算术运算符

算术运算符包括: + - * / %

算术运算结果长度由等号左端的长度决定。

“B+C”的位宽由B、C中长的位宽决定,结果位宽由A决定。在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在 D[5:4]。

reg有无符号需要根据实际情况决定。

2.3.2 关系运算符

 关系运算符有大于(>)、小于(<)、大于等于(>=)和小于等于(<=)几种。

在进行关系比较时,如果成立则结果为1'b1,否则返回的结果为1'b0;若不确定则回结果为不定值(x)。长度短的操作数应在左边用0补齐。

2.3.3相等关系运算符

Verilog HDL有四种相等关系运算符,等于(==)、不等于(!=)、全等(===)、非全等(!==)。这四种相等运算符的优先级别是相同的。

“==”和“!=”称为逻辑等式运算符,其结果由两个操作数的值决定,也就是最后算出来的值,位数可以不完全一致。若某些位可能是不定值x或z,结果为不定值x。

“===”和“!==”运算符则是对操作数进行按位比较,两个操作数必须完全一致,其结果才是1,否则为0。但是,若两个操作数对应位出现不定值x和高阻值z,则可认为是相同的。

 2.3.4逻辑运算符

逻辑运算符有三种,分别是逻辑与(&&)、逻辑或(Il)、逻辑非(!)。逻辑运算符的操作数只能是逻辑0或者逻辑1。

在逻辑运算符的操作过程中,如果操作数是1位的,那么1就代表逻辑真,0就代表逻辑假;如果操作数是由多位组成的,则当操作数每一位都是0时才是逻辑0值,只要有某一位为1,这个操作数就是逻辑1值。相当于只要换算成十进制为0才为0,换算成十进制不为0,就是非0。若操作数中存在x,则任何逻辑运算都是x。

2.3.5按位运算符

按位运算符包括:按位取反(~)、按位与(&)、按位或(1)、按位异或(^)、按位同或(^~)。

两个不同长度的数据进行位运算时,会自动地将两个操作数按右端对齐,位数少的操作数会在高位用0补齐,然后逐位进行运算,运算结果的位宽与操作数中的位宽较大者相同。

这里对~a有疑惑,为什么等于这个值。

2.3.6归纳运算符

归约运算符按位进行逻辑运算,缩位运算符包括&(与)、I(或)、^(异或)以及相应的非操作~&、~|、~^,运算的结果是产生1位逻辑值。即操作数的每一位从左到右依次进行相应的操作。

2.3.7移位运算符

移位运算符有两种:差移位运算符(<<)、右移位运算符(>>)。运算过程是将左边(右边)的操作数向左(右移,所移动的位数由右边的操作数来决定,然后用0来填补移出的空位。这个用得不是很多,注意例子中的e,因为它位宽为8位,装得下,所以没有裁掉。

2.3.8 条件运算符

条件运算符(?:)是Verilog HDL里唯一的三目运算符达式,其表达形式如下:
<条件表达式>?表达式1><表达式2>
当条件表达式的结果为真时:执行表达式1。当条件表达式的结果为假时,执行表达式2。如果条件表达式的运算结果为不定态x,将按位对表达式1的值与表达式2的值进行比较。

2.3.9连接和复制运算符 

VerilogHDL中还有两个特殊的运算符:连接运算符({ })和复制运算符({ { } })。
连接运算符是把位于大括号({ })中的两个或两个以上信号或数值用逗号“,”分隔的小表达式按位连接在一起,最后用大括号括起来表示一个整体信号,形成一个大的表达式。其格式如下:

{信号1的某几位,信号2的某几位,...,信号n的某几位}
重复运算符({ { } })将一个表达式放入双重花括号中,复制因子放在第一层括号中,应该是表示复制几次。

2.4模块

模块(module)是Verilog HDL的基本单元,一个电路包括多个模块。一个模块的基本结构如下图所示:

一个模块主要包括模块的开始与结束、模块端口定义、 模块数据类型说明和模块逻辑功能描述几个基本部分。

(1)模块的开始与结束:以关键词module开始、以endmodule结束的一段程序,其中模块开始语句必须以分号结束。 模块的开始部分包括模块名(name)端口列表(port_list),模块名是模块唯一性的标识符,而端口列表是由模块各个输入、输出和双向端口变量组成的一张列表,这些端口用来与其它模块进行连接。
(2)模块端口定义:定义端口列表哪些变量是输入,输入和双向端口及位宽。

(3)模块数据类型说明:wire、reg、memory和parameter等类型。module的input缺省定义为wire,output为wire/reg型,inout为tri型。

(4)模块逻辑功能描述:产生各种逻辑,包括initial、always语句等。一个模块可在另一个模块中被调用。

“module dff(din,clk,q);”和“endmodule”标志着模块的开始和结束,“input din,clk和“output q;”为端口定义部分,“reg q:”为数据类型说明部分,“always@(posedgeclk)和“q<=din;”为逻辑功能描述部分。

din 和 clk 被声明为 wire 类型,这表明它们是用来传递信号的。

q 被声明为 reg 类型,这是因为reg类型可以在过程块(如always块)中被赋值,而wire不能直接在过程块中赋值。

always语句会根据某些条件不断地重复执行。

always:开始一个过程块。

@(posedge clk):敏感列表,指定了always块何时会被激活。这里的posedge是一个事件控制表达式,表示当clk信号从0变到1(即上升沿)的时候。每当clk出现上升沿时,就将din的当前值锁存到q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值