Verilog语言快速入门(一)

组合逻辑的一般模板

时序电路的一般模板

模块总体结构

模块说明

 

功能描述

1、assign语句

 

1)算数型

 2)逻辑型

3)关系运算符

4) 等价运算符

 

 5)按位运算符

 6)缩减运算符

7) 移位运算符

8)拼接赋值运算符

9) 条件运算符

如果表达式1值为X,则结果为X。

 2、always

 激活条件由敏感信号条件表决定,当敏感条件满足时,过程块被激活。

敏感条件有两种,一种是边沿敏感,一种是电平敏感。

说明:

  • 过程块中的赋值目标必须是reg型的。
  • 由于always语句可以描述边沿变化,在设计时序电路中得到广泛应用。
  • always语句中还可以使用if  case  for循环等语句,其功能更加强大。

 assign语句和always语句的主要区别:

  • assign连续赋值语句总是处于激活状态,只要操作数有变化马上进行计算和赋值;
  • always过程赋值语句只有当激活该过程时,才会进行计算和赋值,如果该过程不被激活,即使操作数发生变化也不会计算和赋值。
  • verilog规定assign 中的赋值目标必须是wire型的,而always语句中的赋值目标必须是reg型的。

  • always语句块中除了可以使用表达式赋值以外,还可以使用if , case等行为描述语句,还能够描述边沿变化,因此其功能比assign语句更强大( assign语句不能使用if等语句,也不能描述边沿变化)

 always语句块中如果有多条赋值语句必须将其用begin    end包括起来, assign语句中没有begin end 

 begin end 之间的赋值语句有阻塞赋值非阻塞赋值之分·

 

  • 阻塞赋值的实质:右边表达式的计算和对左边的赋值是一个统一操作,之间不能再插入其他任何动作,即马上赋值

赋值目标1=表达式1;
赋值目标2=表达式2 ;

  • 非阻塞赋值的实质:按顺序计算右边表达式的值,但是并马上赋值,而是要等到过程结束时再按顺序赋值

赋值目标1<=表达式1;
赋值目标2<=表达式2 ;

应用:

  • 设计组合电路时常用阻塞赋值;
  • 设计时序电路时常用非阻塞赋值;
  • 但不是绝对的
  • 不建议在一个always块中混合使用阻塞赋值非阻塞赋值

 

 综合举例:        4位二进制加1计数器

     3、底层模块和门原语调用

端口映射有两种方法:

  • 端口名关联法(命名法)
  • 位置关联法(顺序法)

命名法格式:
 (.层端口名1(外接信号名1),.层端口名2(外接信号名2),...)

因为有名字对应,不必按底层模块的端口信号列表顺序

DFF dff1(.CLK(clk),.D(d1),.Q(q1));     底层

 顺序法格式:
(外接信号名1,外接信号名2,..….)

DFF dff2(q1,d,q);   

 必须严格按照底层模块的端口信号列表顺序书写

 门原语调用

Verilog语言提供已经设计好的门,称为门原语(primitive,共12个),这些门可直接调用,不用再对其进行功能描述。

门原语调用格式:        门原语名     实例名    (端口连接)
其中实例名可省略(和模块调用不同),端口连接只能采用顺序法,输出在前,输入在后。

 

 端口连接中第一个是输出,其余是输入,输入个数不限。

常见门

and
or
not
与非nand
同非nor
异或xor
同或xnor
缓冲器buf

 端口列表中前面是输出,最后一个是输入,输出个数不限。

模块的特点:

  • 模块是以关键词module开始,以关键词endmodule结束的一段程序。
  • 模块的实际意义是代表硬件电路的逻辑实体(即实现一定逻辑功能的电路)。
  • 每个模块都实现特定的功能,范围可以从一个简单的门到整个大的系统。
  • 模块的描逑方式有行为建模和结构建模(或两者结合)之分。
     

Verilog中的数据类型

Verilog中的数据类型分为两大类

  • 线网类( net类)
  • 变量类( variable类)

连续赋值语句过程赋值语句的激活特点不同,故赋值目标特点也不同,前者不需要保存,后者需要保存,因此规定两种数据类型;

  • net型用于连续赋值的赋值目标或门原语的输出,且仿真时不需要分配内存空间;
  • variable型用于过程赋值的赋值目标,且仿真时需要分配内存空间
net类中的数据类型
wire(线性)tri(三态)tri0(下拉电阻)supply0(地)
wand(线与)triand(三态与)tri1(上拉电阻)supply1(电源)
wor(线或)wrior(三态或)trireg(电容性线网)
variable类中的数据类型
reg(寄存器型)
integer(整型)time(时间型)
real(实型)realtime(实时间型)

将一个信号定义成net型还是varible型,由以下两方面决定:

  1. 使用何种赋值语句对该信号进行赋值,如果是连续赋值门原语赋值例化语句赋值,则定义成net型如果是过程赋值则定义成variable型
  2. 对于端口信号来说,input信号inout信号必须定义成net 型的; output信号可以是net型的也可以是variable型的,决定于如何对其赋值(同1) 

 

  •  对于端口信号来说,input信号inout信号必须定义成net型的;
  • output信号可以是net型的也可以是variable型的,决定于如何对其赋值

 

  • c决定于如何对其赋值;
  • d 如果是端口信号,则必须是net型的;如果来自其它驱动源则决定于如何对其赋值
  • e 、f 、g 、h必须是net型例化语句赋值,则定义成net型;

Verilog中数字的表示格式

注意有符号数是按照补码表示的,即第一位是符号位
比较: 8'b10111011 →(187)10  有区别
 

 逻辑值

Verilog语言中的逻辑值有四种
1逻辑1,高电平,数字1
0逻辑0,低电平,数字0

x

不确定
z高阻态

Verilog中的顺序语句

 1、if语句

if语句---举例

 

 在用if语句设计“组合电路”时要注意,如果条件不完整,会综合出寄存器

 使条件完整的两种方法:

 条件表达式格式         (计算表达式)

计算表达式:
条件表达式的结果只有0和1两种,如果计算表达式的值为0,则条件表达式的值为0,否则为1 。

2、case语句

 格式

功能

  • 如果表达式的值=取值1,则执行语句1;
  • 如果表达式的值=取值2,则执行语句2 ;
  • 如果表达式的值=取值3,则执行语句3 ;
  • 如果表达式的值和上述取值都不相等,则执行默认语句。default语句可以不带。

 

 Verilog语言的描述风格

 三种描述方式

  • 结构化描述(也称门级描述) (全部用门原语底层模块调用
  • 数据流级描述(全部用assign语句
  • 行为级描述(全部用always语句配合if 、 case语句等)

vivado中提到另外一种描述方式:RTL级描述方式

  • RTL级描述(数据流级+行为级+结构化描述三种混合的,可综合)

举例:用门级描述、数据流描述、行为描述分别设计数据选择器


        多路选择器Verilog门级描述

 例        多路选择器Verilog数据流级描述

 例        多路选择器Verilog行为级描述

 其它规定

(1)关键字

  • 关键字即Verilog语言中预定义的有特殊含义的英文词语

(2)标识符

  • 标识符即用户自定义的信号名﹑模块名等等;
  • 注意关键字不能作标识符;
  • Verilog区别大小写(关键字都是小写)。

(3)文件取名和存盘

  • Verilog文件扩展名为.v 
  • verilog不要求文件名和模块名一致,但最好是一致

(4)注释

  •   //   单行注释
  •   /*  */  多行注释
     

测试模块

如果设计阶段占用了20%的研发时间,那么需要花费80%的研发时间用于调试,才能使系统正常工作

编写测试文件(testbench)

  • 产生激励波形
  • 将输入加到测试模块并收集其输出响应
  • 将响应输出与期望值进行比较
     

Verilog HDL提供了一种灵活有效的产生输入信号波形的方式---写测试程序( test bench), 就是用一段程序产生激励信号,用语言描述信号的变化。
Test bench应当是被测模块的高层模块,它没有IO端口,而且内部有被测模块的实例。

 用Verilog HDL代码生成输入激励码test bench

 注意事项:

  • 时钟信号﹑置/复位信号与其它信号分开并分别加以处理

  • 注意各种(各组)输入信号的时序关系

  • 注意所采用的延时表示方式(绝对延时/相对延时)

  • 注意各种输入激励与时钟信号的关系

输入激励码产生方式:

  • 用单独的always语句assign赋值语句产生时钟信号
  • 用简单的initial语句块产生置/复位信号的激励
  • 在initial语句块中用循环语句块产生按一定规律变化的信号的激励码
  • 用Task过程产生特殊信号的输入激励; 

1、用单独的always语句或assign赋值语句产生信号

2、用简单的initial语句块产生置/复位信号的激励

非中文形式的符号

大小写要区分       clk

3、在initial语句块中用循环结构描述具有一定变化规则的输入激励信号

test bench程序结构

 test bench仿真文件样例

 

  • 57
    点赞
  • 260
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemVerilog是一种硬件描述语言(HDL),用于设计和验证数字电路。它是在Verilog HDL的基础上扩展而来的,提供了很多新的功能和特性。 SystemVerilog在设计和验证电路方面提供了很大的灵活性和便利性。它支持面向对象的编程,可以使用类的概念来表示设计中的对象,并使用对象的方法和属性进行操作和控制。这种面向对象的编程风格使得设计变得更加模块化和可重用。 SystemVerilog还引入了新的数据类型和数据结构,如bit、byte、shortint、int、longint等,以及数组、结构体、联合体等,使得设计和验证更加方便和直观。同时,它还支持枚举类型、动态数组和队列等高级数据结构,提供了更多的工具和方法来处理和操作数据。 此外,SystemVerilog还增加了一些用于验证的特性,比如约束和随机化。通过使用约束语言,可以指定设计中信号和变量的取值范围和关系,从而自动化驱动测试向量的生成。同时,SystemVerilog还引入了随机化的概念,可以在给定的约束条件下,生成随机测试向量,以增加测试的覆盖率和多样性。 对于初学者来说,学习SystemVerilog可以从掌握基本的语法和语义开始。了解如何定义模块、端口和信号,如何进行时序和组合逻辑的建模,以及如何进行模拟和仿真。同时,了解如何使用面向对象的编程风格,以及如何使用新的数据类型和数据结构,也是很重要的。 综上所述,SystemVerilog是一种功能强大且灵活的硬件描述语言。它提供了丰富的特性和工具,可以方便地进行数字电路的设计和验证。对于想要进入硬件设计和验证领域的人来说,学习SystemVerilog是一个很好的入门选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值