一、Verilog HDLy语言要素
1、空白符:空白符包括空格符(b)、制表符(t)、换行符与换页符。在编译和综合时,空白 符被忽略。(提高程序易读性,层次性)
例如:initial begin a=3'b100; b=3'b010; end
相当于:inital
begin
a=3'b100;
b=3'010;
end
2、注释符
(1)单行注释:以"//"开始,Verilog HDL忽略从此处到行尾的内容。
例: assign a=b & c; // 单行注释
(2)多行注释:以"/*"开始,到"*/"结束,Verilog HDL忽略其中的注释内容
例: assign a[3:0] = b[3:0] & c[3:0]; /*注释行1
注释行2*/
非法多行注释:/*注释内容/*多行注释嵌套多行注释*/注释内容*/
合法多行注释:/*注释内容//多行注释嵌套单行注释*/
3、标识符
在Verilog中标识符(Identifier)被用来命名信号名、模块名、参数名等,它可以是任意一组字母、数字、$符号和_(下划线)符号的组合。应该注意的是标识符的字母区分大小写,并且第一个字符必须是字母或者下划线。
例:合法标识符: 非法标识符:
count 30count //标识符不允许以数字开头
COUNT // 与count不同 out* //标识符中不允许包含字符*
_CC_G5 a+b-c //标识符中不允许包含字符+和-
B25_78 n@238 //标识符中不允许包含字符@
SIX
4、关键字
Verilog HDL语言内部已经使用的词称为关键字或保留字,它是Verilog HDL语言内部的专用词,是事先定义好的确认符,用来组织语言结构,这些关键字用户不能随意使用,需注意的是,所有的关键字都是小写的。
例:ALAWAYS不是关键字,它只是标识符,与alwaays(关键字)是不同的。
5、数值
Verilog HDL有四种基本的逻辑数值状态
状态 | 含义 |
0 | 低电平、逻辑“0”或“假” |
1 | 高电平、逻辑“1”或“真” |
x或X | 不确定或未知的逻辑状态 |
z或Z | 高阻态 |
* 整数及其表示 表示方式: +/-<size>'<base_format> <number>
数制 | 基数符号 | 合法标识符 |
二进制 | b或B | 0、1、x、X、z···· |
八进制 | o或O | 0~7、x、X、z、Z···· |
十进制 | d或D | 0~9,··· |
十六进制 | h或H | 0~9、a~f、A~F、x··· |
例:正确的表示: 错误的表示:
8'b10001101 //位宽为8位的二进制数 4'd-4 //数值不能为负,有负号应放最左边
8'ha6 //位宽为8位的十六进制数a6 3' b001 // ' 和基数b之间不允许存在空格
5'o35 //5位八进制数35 (4+4)'b11 //位宽不能是表达式形式
4'd6 //4位十进制数6
4'b1x_01 //4位二进制数1x01(加“_”使得程序易读)
* 实数及其表示:
(1)、十进制数表示法,采用十进制格式,小数点两边都有数字,否则为非法的表示形式。例如:3.0,4.56,2.1等都是正确的,而5.就是错误的。
(2)、科学计数法,例如:564.2e2的值为56420.0,8.7E2的值为870.0(e不分大小写),3E-3的值为0.003。
二、数据类型
* 物理数据类型:连线型、寄存器型和存储器型数据类型
信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度存在下的赋值冲突:
标记符 | 名称 | 类型 | 强弱程度 |
supply | 电源级驱动 | 驱动 | 从上到下 依次减弱 |
strong | 强驱动 | 驱动 | |
pull | 上拉级驱动 | 驱动 | |
large | 大容性 | 存储 | |
weak | 若驱动 | 驱动 | |
medium | 中性驱动 | 存储 | |
small | 小容性 | 存储 | |
highz | 高容性 | 高阻 |
1、连线型 (带有逻辑功能)
连线型数据类型 | 功能说明 |
wire、tri | 标准连线(缺省为该类型) |
wor、trior | 多重驱动时,具有线或特性的连线型 |
wand、trand | 多重驱动时,具有线与特性的连线型 |
tring | 具有电荷保持特性的连线型数据(特例) |
tri1 | 上拉电阻 |
tri0 | 下拉电阻 |
supply1 | 电源线,用于对电源建模,为高电平1 |
supply0 | 电源线,用于对“地”建模,为高电平1 |
(1)wire 和 tri
wire/tri | 0 | 1 | x | z |
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | z |
(2)wor 和 trior
wor/trior | 0 | 1 | x | z |
0 | 0 | 1 | x | 0 |
1 | 1 | 1 | 1 | 1 |
x | x | 1 | x | x |
z | 0 | 1 | x | z |
* 寄存器类型
reg型是数据储存单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如触发器、锁存器等。
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值。
reg型变量简单例子:
reg a; //定义一个一位的名为a的reg变量
reg [3:0] b; //定义一个4位的名为b的reg变量
reg [8:1] c,d,e; //定义了三个名称分别为c,d,e的8位的reg型变量
reg型变量一般为无符号数,若将一个负数赋值给reg变量,则自动转换成其二进制补码形式,
例如:
reg signed [3:0] rega;
rega = -2; //rega的值为1110(14),是2的补码
* 连线型数据类型的声明
<net_declaration><drive_strength><range><delay>[list_of_variables];
—— net_declaration包括 wire、tri、tri0、tri1、wand、triand、trior、wor中的任意一种。
—— range:用来指定数据为标量或者矢量。若该项默认,表示数据类型为1位的标量,超过1位则为矢量形式
—— delay:指定仿真延迟时间
—— list_of_variables:变量名称,一次可定义多个名称,之间用逗号分开。
—— drive_strength:表示连线变量的驱动强度。
* 寄存器型数据类型的声明
reg<range><list_of_register_variables>;
—— range为可选项,它指定了reg型变量的位宽,缺省时为1位。
—— <list_of_register_variables>为变量名称列表,一次可以定义多个名称,之间用逗号隔开。
物理类型数据声明的例子:
—— reg rega; //定义了一个1位的寄存器型变量
—— reg [7:0] regb; //定义了一个8位的寄存器型变量
—— tri [7:0] tribus; //定义了一个8位的三态总线
—— tri0 [15:0] busa; //定义了一个16位的连线型,处于三态时为上拉电阻
—— tri1 [31:0] busa; //定义了一个32位的连线型,处于三态时为下拉电阻
—— reg scalared[1:4]b; //定义了一个4位的标量型寄存器矢量
—— wire(pull1,strong0)c=a+b; //定义一个1和0的驱动强度不同的1位连线型变量c
——trireg(large) storeline; //定义了一个具有大强度的电荷存储功能的存储线
* 存储器类型
存储器型变量可以描述RAM型、ROM型存储器以及reg文件。
存储器变量的一般声明格式为:
reg<range1><name_of_register><range2>
—— range1和range2都是可选项,缺省都为1。
—— <range1>:表示存储器中寄存器的位宽,格式为[msb:lsb]
—— <range2>:表示寄存器的个数,格式为[msb:lsb],即有msb-lsb+1个。
—— <name_of_register>为变量名称列表,一次可以定义定义多个名称,之间用逗号隔开
例如:
— reg [7:0] mem1[255:0]; //定义了一个具有256个8位寄存器的存储器mem1 地址范围0到255
— reg [15:0] mem2[127:0],reg1,reg2; ///定义了一个具有128个16位寄存器的存储器mem2和两个16位的寄存器reg1和reg2。
— reg [n-1:0] a; //表示一个n位寄存器a
* 抽象数据类型
抽象数据类型主要包括整型(integer)、时间型(time)、实型(real)及参数型(parameter)
整型: integer<list_of_register_variables>;
例:— integer index; //简单的32位有符号整数
— integer i[31:0]; //定义了32位整型数组i
最后
以上就是无心镜子最近收集整理的关于第一篇 Verilog入门—语言要素 数据类型一、Verilog HDLy语言要素二、数据类型的全部内容,更多相关第一篇内容请搜索靠谱客的其他文章。
发表评论 取消回复