三、3【Verilog HDL】基础知识之基本概念

参考书籍:《Verilog HDL 数字设计与综合》第二版,本文档为第三章的学习笔记。

学习目标

  • 一些常用的词法约定
  • 定义逻辑值集合和数据类型
  • 系统任务控制
  • 基本编译指令

3.1 词法约定

Verilog是大小写相关的,其中关键字全部为小写。

3.1.1 空白符

空白符由空格(\b)、制表符(\t)和换行符组成。除了字符串中的空白符,Verilog中的空白符仅仅用于分割标识符,在编译阶段被忽略。

3.1.2 注释

// 单行注释

/* 多行注释 */

3.1.3 操作符

单目、双目、三目操作符,优先级逐渐变低

3.1.4 数字声明

  • 指明位数的数字

格式:<size> ' <base format> <number>

  • 不指明位数的数字

默认为十进制,“ 'hc3 ”仅未指明位数,其位数与仿真器和计算机本身有关

  • X和Z值

X表示不确定值 ;Z表示高阻值

  • 负数

3.1.5 字符串、标识符和关键字、转义字符

和C语言基本类似,注意关键字全为小写

3.2 数据类型

3.2.1 值的种类

  • 四种逻辑值

0、1、x、z

  • 八种信号强度

    强度等级
    强度等级类型强度等级
    supply驱动8
    strong驱动7
    pull驱动6
    large存储5
    weak驱动4
    medium存储3
    small存储2
    highz高阻1
    如果有两个不同强度的信号驱动同一线网,则竞争结果值为高强度信号值。同强度信号间发生竞争则结果为不确定。只有trireg类型的线网可以具有存储强度,强度large、medium、small。

3.2.2 线网

线网表示硬件单元之间的链接。就像在真实电路中一样,线网由其连接器件的输出端连续驱动。

线网一般用关键字wire进行声明,如果没有规定位宽,则默认为1。线网在未赋值时默认值为Z(teireg类型的线网例外,其默认值为X)

其他线网关键字:wire、wand、wor、tri、triand、trior、trireg

3.2.3 寄存器

寄存器表示存储元件,他会保持数值,直到被改写。与线网不同,寄存器不需要驱动源,而且不像硬件寄存器那样需要时钟信号。仿真时任意时刻都可以改变其值。

关键字reg,默认值为x。

可以进行带符号声明:reg signed [63 : 0]  m;  // 64位带符号值

                                    integer i ;    //32位带符号值

3.2.4 向量

线网和寄存器类型的数据均可以声明为向量(变量的位宽大于1)。

语法:[high# : low# ]或 [ low# : high#],方括号中左边的数总是代表向量的最好有效位。

  • 向量域的选择
wire [7:0]  bus ; //8位总线变量
bus[7];           //bus的第7位
bus[2:0];         //向量bus的最低3位

reg [0:40] virtual_addr;  //向量寄存器,41位的虚拟地址,这里最高有效位依然是第0位
virtual_addr[0:1];        //向量virtual_addr的两个最高位
  • 可变的向量域的选择

动态域选择的两个专用操作符:

[<starting_bit> + : width] :从起始位开始递增,位宽位width

[<starting_bit> - : width] :从起始位开始递减,位宽位width

reg [255:0] data1;
reg [0:255] data2;
reg [7:0] byte;

//通过变量选择部分向量
byte = data1[31-:8];   //从31位起,位宽减8位,相当于data1[31:24]
byte = data1[24+:8];   //从24位起,位宽加8位,相当于data2[31:24]

byte = data2[31-:8];   //从31位起,位宽减8位,相当于data1[24:31]
byte = data2[24+:8];   //从24位起,位宽加8位,相当于data2[24:31]

//起始位可以是可变量,因此可以使用for循环选取向量长度
for (j=0; j<=31; j=j+1)
    byte = data1[(j*8)+:8];    //每8位取一次值

//可变向量赋值
data1[(byteNum*8)+:8] = 8'b0;   //如果byteNum=1;共有8位被清零,[15:8]

3.2.5 整数、实数和时间寄存器数据类型

  • 整数:

关键字integer进行声明。整数的默认位宽为主机的字的位数,但最小应为32位。reg通常声明的是无符号的,而integer则为有符号的。

integer counter;   //一般用途的变量,作为计数器
initial
    counter = -1;  //把-1存储到计数器中
  • 实数 

关键字real来声明,赋值时可以用科学计数法。实数声明时没有位宽范围,其默认值为0。如果将一个实数赋值给一个整数则实数会被取整为最接近的整数。

real delta;   //定义一个名为delta的实型变量
initial
begin
    delta = 4e10;
    delta = 2.13;
end

integer i;

initial
    i = delta;   //则i=2
  • 时间寄存器

关键字time来声明,位宽与具体实现有关,通过调用系统函数$time可以得到当前的仿真时间

time save_sim_time;
initial
    save_sim_time = $time;      //把当前仿真时间记录下来   

3.2.6 数组 

 与c语言类似,形式<数组名>[<下标>],注意不要将向量与数组混淆

reg     [63:0]    array_4d [15:0][7:0][7:0][255:0];     //四维64位寄存器型数组

数组赋值:

array_4d [0][0][0][0]  [15:0];     //把四维数组索引[0][0][0][0]的寄存器单元的[15:0]位置都赋值为0

3.2.7 存储器

再数字电路仿真中,人们常常需要对寄存器文件,RAM和ROM建模。

reg mem1bit[0:1023];   //1K的1位寄存器mem1bit
reg [7:0] membyte[0:1023]; //1K的字节存储器membyte
membyte[511]  //取出存储器membyte中地址511处的所存的字节

3.2.8 参数(常数)

关键字parameter来声明,可以通过参数重新定义改变其内存储的值:通过模块实例化或使用的defoaram语句改变。

局部参数声明使用关键字localparam来定义,其内的值不可以改变。

3.2.9 字符串

3.3 系统任务和编译指令

3.3.1 系统任务

常用的系统任务(系统函数)

$display 显示变量或字符串

例:$disply("y = %d" , bus);

$monitor监视变量变化,再变量发生变化时对数据进行打印输出

$monitor监视任务的执行;$monitoroff暂停监视

$stop暂停仿真 ;$finish 结束仿真

3.3.2 编译指令

`define

 用于Verilog中的文本宏定义,类似于C语言中的#define

`define WORD_SIZE  32

`include

用于在此文件中包含其他文件

`include header.v

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值