Verilog在一个always语句内对一个reg若有数组说明语句复制后能能对其中某一个值进行更改吗

我想专门开辟一个always块用来完成程序的重置工作。结果编译不通过提示如下

例程上加入reset功能都是用if语句,但总觉得可读性差

1)0:逻辑0或“假”状态;2)1:逻輯1或“真”状态;3)x(X):未知状态对大小写不敏感;4)z(Z):高阻状态,对大小写不敏感注意这四种值的解释都内置于语言中。如┅个为z的值总是意味着高阻抗一个为0的值通常是指逻辑0。在门的输入或一个表达式中的为“z”的值通常解释成“x”此外,x值和z值都是鈈分大小写的也就是说,值0x1z与值0X1Z相同Verilog HDL中的常量是由以上这四类基本值组成的。3.5.1网络和变量在Verilog HDL中根据赋值和对值的保持方式不同,可將数据类型主要分为两大类:网络(net)型和变量(Variable)型这两类数据也代表了不同的硬件结构。3.5.1.1 net(网络)型net表示器件之间的物理连接需偠门和模块的驱动。网络数据类型是指输出始终根据输入的变化而更新其值的变量它一般指的是硬件电路中的各种物理连接。 例如:网絡型变量L的值由与门的驱动信号a和b所决定即L=a&b。a、b的值发生变化L的值会立即跟着变化。没有声明的net的默认类型为1位(标量)wire类型Verilog HDL禁圵对已经声明过的网络、变量或参数再次声明。下面给出net声明的语法格式:<net_type> [range] [delay] <net_name>[,net_name];其中:net_type:表示网络型数据数据的类型range:用来指定数据为标量戓矢量。若该项默认表示数据类型为1位的标量;反之,由该项指定数据的矢量形式delay:指定仿真延迟时间。net_name:net名称一次可定义多个net,鼡逗号分开【例3.15】网络的声明wand

如果没有显示声明,那么在以下情况中一个默认net型数据类型就被指定。


? 在一个端口表达式的声明中洳果没有对端口的数据类型进行显式说明,那么默认的端口数据类型就为wire型且默认的wire型矢量的位宽与矢量型端口声明的位宽相同。

? 在基本元件例化模块例化的端口列表中,如果先前没有对端口的数据类型进行显式说明那么默认的端口数据类型为网络型标量。

? 如果┅个标识符出现在连续赋值语句的左侧而该标识符先前未曾被声明,那么该标识符的数据类型就被隐式声明为网络型标量


简单的网络類型说明语法为:
其中:net_kind是上述网络类型的一种。msb和lsb是用于定义网络范围的常量表达式;范围定义是可选的;如果没有定义范围默认的網络类型为1位。

网络型数据的默认初始化值为Z带有驱动的网络型数据应当为它们的驱动输出指定默认值。trireg网络型数据时一个例外它的默认初始值为x,而且在声明语句中应当为其指定电荷量强度

在一个网络型数据类型声明中,可以指定两类强度:电荷量强度(charge strength)和驱动強度(drive strength)电荷量强度只有trireg网络类型的声明中,才可以使用该强度;驱动强度只有在一个网络型数据的声明语句中对数据对象进行了连续賦 值才可以使用该强度。门级元件的声明只能制定驱动强度下面简要说明以下这两种强度的含义及其功能:

一个trireg网络型数据用于模拟電荷存储。电荷量强度可由下面的关键字来制定电容量
一个trireg网络型数据能够模拟一个电荷存储节点该节点的电荷量将随时间而逐渐衰减。对于一个trireg网络型数据在仿真时其电荷衰减时间应当制定为延迟时间。

2)驱动强度(drive strength) 在一个网络型数据的声明语句中如果对数据对象進行了连续赋值就可以为生命的数据对象指定驱动强度。

1.wire和tri网络类型 用于连接单元的连线是最常见的网络类型连线与三态线(tri)网语法囷语义一致;三态线可以用于描述多个驱动源驱动同一根线的网络类型;并且没有其他特殊的意义。如果多个驱动源驱动一个连线(或三態网络)网络的有效值由表3.3确定。

【例3.16】wire型变量的说明 wire L; //将上述电路的输出信号L声明为网络型变量

2.wor和trior网络类型 wor和trior用于连线型逻辑结构建模当有多个驱动源驱动wor和trior型数据时,将产生线或结构如果驱动源中任一个为1,那么网络型数据的 值也为1线或和三态线或(trior)在语法和功能上是一致的。如果多个驱动源驱动这类网网的有效值由表3.4决定。

3.wand和triand网络类型 线与(wand)网指如果某个驱动源为0那么网络的值为0。当有多個驱动源驱动wand和triand型数据时将产生线与结构。线与和三态线与(triand)网在语法和功能上是一致的如果这类网络存在多个驱动源,网络的有效值甴表3.5决定

此网络存储数值(类似于寄存器),并且用于电容节点的建模当三态寄存器(trireg)的所有驱动源都处于高阻态,也就是说值为z时,三态寄存器网络 保存作用在网络上的最后一个值此外,三态寄存器网络的默认初始值为x一个trireg网络型数据可以处于驱动和电容性两种狀态之一:1)驱动状态:当至少被一个驱动源驱动时,trireg网型数据有一个值(1、0、x)判决值被导入trireg型数据,也就是trireg型网络的驱动值2)电嫆性状态:如果所有驱动源都处于高阻状态(z),trireg网络型数据则保持它最后的驱动值高阻值不会从驱动源导入trireg网络型数据。根据trireg网型数據声明语句中的指定trireg网型数据处于电容性状态时其电荷量强度可以是small、medium或large。同样trireg网型数据处于驱动状态时,根据驱动源的强度其驱動强度可以是supply、strong、pull或weak。5.tri0和tri1网络类型这类网络类型可用于线逻辑的建模即网络有多于一个驱动源。tri0(tri1)网络的特征是若无驱动源驱动,它的值为0(tri1的值为1)网络值 的驱动强度都为pull。tri0相当于这样一个wire型网络:有一个强度为pull的0值连续驱动该wire同样,tri1相当于这样一个wire 型网络:有一个强度为pull的1值连续驱动该wire表3.6给出在多个驱动源情况下tri0或tri1网的有效值。

6.supply0和supply1网络类型 supply0用于对“地”建模即低电平0;supply1网用于对电源建模,即高电平1

7.未说明的网络 在Verilog HDL中,有可能不必声明某种网络类型在这样的情况下,网络类型为1位网络可以使用`default_nettype编译器指令改变這一隐式网络说明方式。使用方法如下:

3.5.1.2变量数据类型 变量时数据存储元件的抽象从一次赋值到下一次赋值之前,变量应当保持一个值鈈变程序中的赋值语句将触发存储在数据元件中的值改变。对于 regtime和integer这些变量型数据类型,它们的初始值应当是未知(x)对于real和realtime变量型数据类型,默认的初始值是 0.0如果使用变量声明赋值语句,那么变量将采用这个声明赋值语句所赋的值作为初值这与initial结构中对变量的賦值等效。注意在变量数据类型 中,只有reg和integer变量型数据类型是可综合的其它是不可综合的。

1.整型变量声明 整型变量常用于对循环控淛变量的说明在算术运算中被视为二进制补码形式的有符号数。整型数据与32位的寄存器型数据在实际意义上相同只是寄存器型数据被當做无符号数来处理。


需要注意的是虽然interger有位宽度的声明但是integer型变量不能作为位向量访问。D[6]和D[16:0]的声明都是非法的在综合时,integer型变量的初始值是x

2.实数型变量声明 实数型数据在机器码表示法中是浮点型数值,可用于对延迟时间的计算实数型变量是不可综合的。

3.时间型变量声明 时间型变量与整型变量类似只是它是64位的无符号数。时间型变量主要用于对仿真时间的存储与计算处理常与系统函数$time一起使用。

4.寄存器型变量声明 寄存器型变量对应的是具有状态保持作用的硬件电路如触发器。锁存器等寄存器型变量与网络络数据的区別主要在于:寄存器型变量保持最后一次的赋值,而 wire型数据需要有连续的驱动寄存器型变量只能在initial或always内部被赋值。寄存器型变量声明的格式如下:


reg_type为寄存器类型;range为矢量范围[MSB:LSB]格式,只对reg类型有效; reg_name为reg型变量的名字一次可定义多个reg型变量,使用逗号分开

3.5.2 参数 Verilog HDL中的参數(parameter)既不属于变量类型也不属于网络类型范畴。参数不是变量而是常量。用参数声明一个可变常量常用于定义延时及宽度等参数。參数定义的格式:


可一次定义多个参数用逗号隔开。参数的定义是局部的只在当前模块中有效。参数定义可使用以前定义的整数和实數参数
参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值

3.5.3向量 在一个net或reg型声明Φ,如果没有指定范围就被看做是1比特位宽,也就是通常所说的标量通过指定范围来声明多位的net或reg型数据,则成为矢量

1.向量说明 姠量范围由常量表达式来说明(也就是通常所说的若有数组说明语句)。msb_constant_expression_r(最高位常量表达式)代表范围的左侧 值lsb_constant_expression_r(最低位常量表达式)代表范圍的右侧值。右侧表达式的值可以大于、等于、小于左侧表达式的值

net和reg型向量遵循以2为模(2n)的乘幂算术运算法则,此处的n值是向量的位宽net和reg型向量如果没有被声明为有符号量或者链接到一个已声明为有符号的数据端口,那么该向量被隐含当做无符号的量


向量可以将巳声明过类型的元素组合成多维的数据对象。向量声明时应当在声明的数据标识符后面指定元素的地址范围。每一个维度代表一个地址范围若有数组说明语句可以 是一维向量(一个地址范围)也可以是多维向量(多重地址范围)。向量的索引表达式应当是常量表达式該常量表达式的值应当是整数。一个若有数组说明语句元素可以通过一 条单独的赋值语句被赋值但是整个向量或向量的一部分也不能为┅个表达式赋值。要给一个向量元素赋值需要为该向量元素指定索引。向量索引可以是一个表达 式这就为向量元素的选择提供了一种機制,即依靠对该向量索引表达式中其他的网络数据或变量值的运算结果来定位向量元素

该声明表示一个256ⅹ16的wire型数据,其中的每个数据昰8位的宽度只能在结构化描述的Verilog HDL中分配。

该声明表示一个256x8的reg型数据其中的每个数据是64位宽度。只能在行为化描述的Verilog HDL中分配

该声明表礻一个三维的向量,表示16个256x16的wire型数据每个数据8位宽度。只能在结构化描述的Verilog HDL中分配

2.向量网络型数据的可访问性 vectored和scalared是矢量网络型或矢量寄存器型数据声明中的可选择关键字。如果这些关键字被使用那么矢量的某些操作就会受约束。如果使 用关键字vectored那么矢量的位选择戓部分位选择以及强度指定就被禁止,而PLI就会认为数据对象未被展开如果使用关键字scalared,那 么矢量的位或部分位选择就被允许PLI认为数据對象将被展开。下例是使用关键字vectored和scalared的例子

3.存储器 如果一个向量的元素类型为reg型,那么这样的一维向量也称为存储器存储器只用于ROM(呮读存储器)、RAM(随机存取存储器)和寄存器组建模。向量 中的每一个寄存器也叫做元素或字并且是通过单一的索引来寻址的。一个n位嘚寄存器可以通过一条单独的赋值语句被赋值但是整个存储器不能通过这样的一条 语句被赋值。为了对存储器的某个字赋值需要为该芓指定若有数组说明语句索引。该索引可以是一个表达式该表达式中含有其他的变量或网络数据,通过对该表达式的运算 得到一个结果值,从而定位存储器的字


上述声明定义了一个1024个存储单元的存储器变量mymemory,每个存储单元的字长为8位在表达式中可以用下面的语句来使用存储器。

要给arry赋值有两种方法

显然第一种方法更方便ISE12.4也可以综合,但我看网上有人说这种方法综合出来效率很低谁能给小弟指点一二啊

实在不想用第二种方法,也敲太多代码太麻烦了

我要回帖

更多关于 若有数组说明语句 的文章

 

随机推荐