Verilog HDL语法(二)

Verilog HDL语法(二)

常见错误:未声明的寄存器变量

Verilog没有处理未声明寄存器变量的机制,所以一个未声明的标识符被参考为默认类型线网(如wire)。对未声明变量的过程赋值将会引起编译器错误。

线网型和寄存器型变量的寻址

线网和寄存器的节选(part-select)的最高有效位指的是最左边的数组下标,最低有效位是最右边的数组下标。一个常量或变量的表达式可以是一个节选的下标。如果一个节选(part-select)的下标超出了其界限范围,那么该变量的引用值返回一个值x。

例:如果一个8位字vect_word存有一个十进制值4,那么vect_word[2]的值为1,vect_word[3:0]的值为4,vect_word[5:1]的值为2,及vect_word[7:0] = 0000_0100,而vect_word[5:1] = 0_0010。

常见错误:通过端口传递变量

表总结了在Verilog模块端口上应用的线网型和寄存器变量的规定。例如,寄存器型变量就不能再***inout*** 端口上定义。

端口模式
变量类型 input output inout
线网型变量 Yes Yes Yes
寄存器型变量 No Yes No

一个定义为模块***input***端口的变量意味着它是模块域内的一个线网型变量,但是***output***端口上定义的变量可以是hi一个线网型变量或者寄存器变量。在模块的***input***端口上定义的变量不能被声明成寄存器型变量。模块的***inout***端口也不是寄存器类型的。寄存器变量不可能放置在原语的输出端口上,而且也不能作为连续复制语句的LHS + 变量 + 被赋值对象。

数组

reg类型的一维数组称为存储器,并代表字的数组。这种构造是寄存器变量声明的拓展,用来提供存储器,如相同字长的多个可寻址单元。下面给出一个寄存器变量存储器的语法举例。未选择和节选(part-select)对一个存储器是吴晓东。对存储器进行缓存的最小单位是字。节选(part-select)的MSB是最左边数组元素的下标,LSB在最右边。如果一个下标超出了它的便捷,其结果应为逻辑值x。可以用一个常数表达式来表示数组定义中的LSB和MSB。

例:下面的代码段来表示怎样用简化形式的reg word_size array_name memory_size来定义一个1024个32位***reg***类型存储器变量的数组。
在这里插入图片描述

也可以通过给声明(它提供类型、大小和名称)增加一个或多个地址范围来构造多维数组。

例:

reg [15:0] data [0:127][0:127]

如果节选的范围是连续范围,Verilog 1995则允许从向量的连续比特中部分地选择。Verilog 2001,2005提供了两个附加的节选操作,可提供一个指示性可变的固定宽度的节选,+:和-:,其语法分别为[<start_bit> + : , <width>] 和[<start_bit> - : , <width>] 。参数width指定了作节选的向量的最右边或者最左边的比特位,至于是最右边还是最左,这个取决于+或者-的选择;

变量的工作域

一个变量的工作域是声明它的模块、任务、功能或命名的程序块(begin……end)的内部。在下图中,子模块child_module中输入端口的一个线网能够有一个封装在父模块parent_module中的线网和寄存器来驱动,而在child_module中输出端口上的线网或寄存器能够驱动parent_moudle中的线网。
在这里插入图片描述

字符串

对于字符串,Verilog没有单独的数据类型。一个字符串必须通过一条过程赋值语句存入一个大小合适的寄存器中。一个大小合适的***reg***(数组)为要保存的字符串的每个字符留有8bit的存储空间。

例:一个***reg*声明,string_holder,用num_char来调整字符串的大小;

reg [8*num_char-1:0] string_holder;

这个例子中的声明表明num_char这个字符中的每一个字符都用8bit来编码。如果字符串“Hello Word”被赋值给string_holder,那么num_char至少为11以保证最少有88个比特能够保存。如果给一个数组的赋值比将要处理的数组的字符数少,那么从最高位开始在未使用的位置上自动填0(例如,最左边的位置)。

常量

Verilog中的常量可以用关键词parameter来声明,它在声明的同事还可以给常量赋值。一个常量的值在仿真过程中是不变的。常量表达式可以用于对一个常量值进行声明。

parameter high_index = 31;								// integer
parameter width = 32, depth = 1024;						// integers
parameter byte_size = 8, byte_max = byte_size - 1;		// integer
parameter a_real_value = 6.22;							// real
parameter av_delay = (min_delay + max_delay)/2;			// real
parameter initial_state = 8'b1001_0110;					// reg

线网型和寄存器型的引用数组

一个线网或寄存器可被其标识符引用。一个响亮的引用可以包括单独的比特(例如,一个比特或元素)或者由方括号圈定的节选的连续比特(如[7:0])。一个表达式可以是节选的下标。如果一个已声明的向量标识符有从LSB到MSB的升(降)序,那么该标识符所引用的节选必须有从LSB到MSB的相同的升(降)序。

参考

《Verilog HDL数字设计与综合(第二版)》

猜你喜欢

转载自blog.csdn.net/sinat_31206523/article/details/109705630