Verilog的数据类型

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

整数是一种通用的寄存器数据类型,用于对数量进行操作,使用integer进行声明。

integer counter;       //一般用途的变量用作计数器

initial

         counter = -1;    //-1存储到寄存器中

实数:实常量和实数寄存器数据类型使用关键字real来声明,可以用十进制或科学计数法来表示。实数声明不能带有范围,其默认值为0.如果将一个实数赋予一个整数,那么实数将会被取为最接近的整数。

real delta;         //定义一个名为delta的实型变量

时间寄存器:仿真是按照仿真时间进行的,verilog使用一个特殊的时间寄存器数据类型来保存仿真时间。时间变量通过使用关键字time来声明,其宽度与具体实现无关,最小为64位。通过调用系统函数$time可以取得当前的仿真时间。

2           数组

Verilog中允许声明regintegertimerealrealtime及其向量类型的数组,对数组的维数没有限制,即可声明任意维数的数组。线网数组也可用于连接实例的端口,数组中的每个元素都可以作为一个标量或者向量,以同样的方式来使用,形如<数组名>[<下标>]

Integer     count[0:7];       //由八位计数变量组成的数组

reg  bool [31:0];              //321位的布尔寄存器变量组成的数组

wire [7:0] w_array2 [5:0];        //声明8位向量的数组

 

注意:不要把数组和线网或寄存器向量混淆起来。向量是一个单独的元件,它的位宽是n,数组由多个元件组成,其中每个元件的位宽为n1.

3           存储器

Verilog中使用寄存器一维数组来表示存储器。数字的每个元素成为一个元素或一个字(word),由一个数组索引来指定。每个字的位宽为1位或者多位。注意n1位寄存器和一个n位寄存器是不同的。如果需要访问存储器中的一个特定的字,则可通过子的地址作为数组的下标来完成。

reg   mem1bit[0:1023];             //1k1位存储器

reg   [7:0] membyte [0:1023]; //1k的字节(8位)存储器membyte

membyet[511]          //取出membyte中地址511所处的字节

4           参数

Verilog使用关键字parameter在模块内定义常数。参数代表常数,不能像变量那样赋值,但是每个模块实例的参数值可以在编译阶段被重载。通过参数重载使得用户可以对模块实例进行定制。除此之外还可以对参数的类型和范围进行定义。

parameter port_id = 5;    //定义常数port_id 5

 

5           字符串

字符串保存在reg类型的变量中,每个字符占用8位(一个字节),因此寄存器变量的宽度应足够大,以保证容纳全部字符。如果寄存器变量的宽度大于字符串的大小,则verilog0来填充左边的空余位。如果寄存器变来那个的宽度小于字符串的大小,则verilog截去字符串最左边的位。

 

1

           值的种类

四值电平逻辑

值的级别

硬件电路中的条件

0

逻辑0,条件为假

1

逻辑1,条件为真

X

逻辑值不确定

Z

高阻,浮动状态

除了逻辑值外,Verilog还是用强度值来解决数字电路中不同强度的驱动源之间的赋值冲突。

强度等级

类型

程度

Supply

驱动

最强

Strong

驱动

 

Pull

驱动

 

Large

存储

 

Weak

驱动

 

Medium

存储

 

Small

存储

 

Highz

高阻

最弱

如果两个具有不同强度的信号驱动同一个线网,则竞争结果值为高强度信号的值。

如果两个强度相同的信号之间发生竞争,则结果为不确定值。

        

2           线网

线网(net)表示硬件单元之间的连接。线网一般使用关键字wire进行声明。如果没有显式的说明为向量,则默认线网的位宽为1。线网的默认值为Z,(trireg类型线网例外,其默认值为X)。其值由驱动源确定,如果没有驱动源则线网的值为Z

 

Net并不是一个关键字,它代表了一组数据类型,包括wirewandwortritriandtrior以及trireg等。

 

3           寄存器

寄存器用来表示存储元件,它保持原有的数值,直到被改写。注意:不要将这里的寄存器和实际电路中由边沿触发器构成的硬件寄存器混淆。在Verilog中,术语register仅意味着一个保持数值的变量。与线网不同,寄存器不需要驱动源,而且也不像硬件寄存器那样需要时钟信号。在仿真过程中的任意时刻,寄存器的值都可以通过赋值来改变。

寄存器的数据类型通过关键字reg来声明,默认值为X

 

4           向量

线网和寄存器类型的数据均可声明为向量(位宽大于1)。如果在声明中没有指定位宽,则默认为标量(1位)

wire a;      //标量线网变量,默认

wire [7:0] bus;          //8位的总线

reg clock  ;                 //标量寄存器,默认

reg   [0:40]        virtual_addr;    //向量寄存器,41位宽的虚拟地址

向量通过[high#:low#]进行说明,方括号中左边的数总是代表向量的最高有效位。

 

向量域选择

对于上面例子中声明的向量,我们可以指定它的某一位或者若干个相邻位。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值